-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGraph.pde
114 lines (108 loc) · 2.27 KB
/
Graph.pde
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
class Graph
{
float avedist;
HashSet<Node> nodes;
HashMap<Link, Integer> links;
HashMap<Link, Float> dists;
Graph()
{
nodes = new HashSet<Node>();
links = new HashMap<Link, Integer>();
dists = new HashMap<Link, Float>();
avedist = 10;
}
void show()
{
strokeWeight(2);
for(Link l: links.keySet())
{
l.show();
}
}
void redistribute()
{
dists.clear();
int count = 0;
float mean = 0;
for(Link l: links.keySet())
{
float len = l.len();
mean += len;
dists.put(l, new Float(len));
count++;
}
mean /= count;
float sd = 0;
for(Link l: dists.keySet())
{
sd += pow(dists.get(l) - mean, 2);
}
sd /= count - 1;
sd = sqrt(sd);
if(sd != 0)
{
for(Link l: dists.keySet())
{
PVector dir = PVector.sub(l.a.pos, l.b.pos);
dir.setMag((dists.get(l) - mean)*2/sd + avedist/log(links.size()) - dists.get(l));
//sqrt(links.size())
dir.mult(.5);
l.a.disp.add(dir);
dir.mult(-1);
l.b.disp.add(dir);
}
}
count = 0;
PVector centroid = new PVector();
for(Node n: nodes)
{
centroid.add(n.pos);
count++;
}
centroid.mult(1.0/count);
//mean = 0;
//for(Node n: nodes)
//{
// mean += PVector.sub(
//}
for(Node n: nodes)
{
PVector dir = PVector.sub(n.pos, centroid);
dir.setMag(2*avedist/(1 + dir.magSq()));
n.disp.add(dir);
}
for(Node p: nodes)
{
p.pos.sub(centroid);
p.pos.add(p.disp);
p.disp.set(0, 0, 0);
}
}
void cube(int size)
{
avedist = 12*size;
nodes.clear();
links.clear();
ArrayList<Node> ls = new ArrayList<Node>();
for(int i = 0; i < 8; i++)
{
ls.add(new Node(i/1%2 == 0 ? -size/2: size/2,
i/2%2 == 0 ? -size/2: size/2,
i/4%2 == 0 ? -size/2: size/2));
}
int index = 6;
for(int i = 0; i < 4; i++)
{
index -= i;
Node n1 = ls.get(index);
for(int j = 0; j < 3; j++)
{
int dif = index ^ (int)pow(2, j);
Node n2 = ls.get(dif);
Link l = new Link(n1, n2, j);
links.put(l, new Integer(j));
}
}
nodes.addAll(ls);
}
}