summaryrefslogtreecommitdiff
path: root/generate_graph.py
blob: 1715404d56c59e0360ab1cf99e2e0809cb761dc2 (plain)
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
import sys, json, random
from math import ceil, pi, sin, cos

sizes = [1.0, 0.9, 0.8, 0.7, 0.3, 0.2, 0.1]
counts = sys.argv[1:8]

base_size = 200
mass_quotient = float(sys.argv[8])
size_quotient = float(sys.argv[9])
subnode_threshold = float(sys.argv[10])

nodes = {}

nodes['n0'] = {
    'width': base_size,
    'height': base_size,
    'color': 'rgba(255,255,255,0.01)',
    'mass': base_size,
    'fixed': True,
    'x': 0,
    'y': 0,
    'image': 'photo' + str(random.randint(1, 5)) + '.jpg',
    'main': True
}
node_count = 1

node_sizes = []
for i in counts:
    node_sizes = node_sizes + [sizes.pop(0)] * int(i)

node_colors = {
    1.0: 'rgba(52,149,255,0.33)',
    0.9: 'rgba(52,149,255,0.33)',
    0.8: 'rgba(52,149,255,0.33)',
    0.7: 'rgba(52,149,255,0.33)',
    0.3: 'rgba(255,0,0,0.33)',
    0.2: 'rgba(255,255,0,0.33)',
    0.1: 'rgba(255,255,255,0.33)'
}

angular_positions = [2 * pi / len(node_sizes) * (n - 1) for n in range(1, len(node_sizes)+1)]
random.shuffle(angular_positions)

edges = {}
edges['n0'] = {}
for node_size in node_sizes:
    node_id = 'n' + str(node_count)
    node_dimension = max(10, int(ceil(base_size * node_size * size_quotient)))
    node_mass = int(ceil(base_size * mass_quotient))
    node_angular_position = angular_positions[node_count-1]
    node_position = { 'x': 0.8 * cos(node_angular_position),
                      'y': 0.8 * sin(node_angular_position) }
    nodes[node_id] = {
        'width': node_dimension,
        'height': node_dimension,
        'mass': node_mass,
        'color': node_colors[node_size],
        'fixed': True,
        'x': node_position['x'],
        'y': node_position['y'],
        'image': 'photo' + str(random.randint(1, 5)) + '.jpg'
    }
    edges['n0'][node_id] = {}
    edges[node_id] = {}
    node_count += 1
    subnode_count = 1
    subnode_sizes = [n for n in node_sizes if (node_size > 0.2) and (random.random() > subnode_threshold)]
    for subnode_size in subnode_sizes:
        subnode_id = node_id + '_' + str(subnode_count)
        subnode_dimension = max(5, int(ceil(base_size * node_size * subnode_size * size_quotient * size_quotient)))
        subnode_mass = int(ceil(base_size * mass_quotient))
        nodes[subnode_id] = {
            'width': subnode_dimension,
            'height': subnode_dimension,
            'mass': subnode_mass,
            'color': node_colors[subnode_size],
            'fixed': True,
            'x': node_position['x'] * (0.995 + random.random() / 100),
            'y': node_position['y'] * (0.995 + random.random() / 100),
            'image': 'photo' + str(random.randint(1, 5)) + '.jpg'
        }
        edges[node_id][subnode_id] = {}
        subnode_count += 1

print json.dumps(
    {
        'repulsion': 2200,
        'stiffness': 900,
        'friction': 0,
        'precision': 0.1,
        'fps': 15,
        'dt': 0.005,
        'gravity': True,
        'nodes': nodes,
        'edges': edges
    }
)