41{
42 wxProgressDialog pbd(_("Importing..."), _("Initializing..."), iterations, nullptr,
43 wxPD_APP_MODAL | wxPD_AUTO_HIDE | wxPD_CAN_ABORT | wxPD_SMOOTH);
44
45 float nodesCount = m_nodes.size();
46
47
48 float a = 0.f;
49 float da = 2.f * M_PI / nodesCount;
50 for(auto node = m_nodes.begin(); node != m_nodes.end(); node++) {
51 node->position.x = nodesCount * std::cos(a);
52 node->position.y = nodesCount * std::sin(a);
53 a += da;
54 }
55
56
57 float area = nodesCount;
58 float k2 = area / nodesCount;
59 float k = sqrt(k2);
60
61 for(size_t i = 0; i < iterations; i++) {
62
63
64 float temperature = 1.f - i / (float)iterations;
65 temperature *= temperature;
66
67
68 for(auto node1 = m_nodes.begin(); node1 != m_nodes.end(); node1++) {
69 node1->displacement = {0.f, 0.f};
70 for(auto node2 = m_nodes.begin(); node2 != m_nodes.end(); node2++) {
71 float dx = node1->position.x - node2->position.x;
72 float dy = node1->position.y - node2->position.y;
73 if(dx && dy) {
74 float d2 = dx * dx + dy * dy;
75 float coefficient = k2 / d2;
76 node1->displacement.x += coefficient * dx;
77 node1->displacement.y += coefficient * dy;
78 }
79 }
80 }
81
82
83 for(auto edge = m_edges.begin(); edge != m_edges.end(); edge++) {
84 float dx = edge->node1.position.x - edge->node2.position.x;
85 float dy = edge->node1.position.y - edge->node2.position.y;
86 float d2 = dx * dx + dy * dy;
87 float coefficient = sqrt(d2) / k * edge->weight;
88 edge->node1.displacement.x -= dx * coefficient;
89 edge->node1.displacement.y -= dy * coefficient;
90 edge->node2.displacement.x += dx * coefficient;
91 edge->node2.displacement.y += dy * coefficient;
92 }
93
94
95 float sum = 0.f;
96 for(auto node = m_nodes.begin(); node != m_nodes.end(); node++) {
97 float d2 = node->displacement.x * node->displacement.x + node->displacement.y * node->displacement.y;
98 float d = sqrt(d2);
99 if(d > temperature) {
100 float coefficient = temperature / d;
101 node->displacement.x *= coefficient;
102 node->displacement.y *= coefficient;
103 sum += temperature;
104 } else {
105 sum += d;
106 }
107 node->position.x += node->displacement.x;
108 node->position.y += node->displacement.y;
109 }
110
111 if(!pbd.Update(i, wxString::Format("Iteration = %d", i))) {
112 pbd.Update(iterations);
113 i = iterations;
114 }
115 }
116}