summaryrefslogtreecommitdiffstats
path: root/layers.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'layers.cpp')
-rw-r--r--layers.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/layers.cpp b/layers.cpp
new file mode 100644
index 0000000..f8b3afd
--- /dev/null
+++ b/layers.cpp
@@ -0,0 +1,67 @@
+#include "balls.h"
+
+static vector<Collision> completeGraph(vector<Ball *> balls);
+static vector<Collision> matching(vector<Collision> edges);
+static vector<Collision> diff(vector<Collision> a, vector<Collision> b);
+
+vector<vector<Collision>>
+partitionCollisions(vector<Ball *> balls) {
+ vector<vector<Collision>> layers;
+
+ vector<Collision> collisions = completeGraph(balls);
+ while (!collisions.empty()) {
+ cout << "\nadd layer\n";
+ cout << "layers.size(): " << layers.size() << "\n";
+
+ vector<Collision> layerCollisions = matching(collisions);
+ cout << "layer collisions: ";
+ for (Collision c : layerCollisions)
+ cout << c << " ";
+ cout << "\n";
+ collisions = diff(collisions, layerCollisions);
+
+ vector<Collision> thisLayer;
+ for (Collision c : layerCollisions) {
+ cout << "create node with " << c << "\n";
+ thisLayer.push_back(c);
+ }
+ cout << "thisLayer.size(): " << thisLayer.size() << "\n";
+ layers.push_back(thisLayer);
+ }
+ return layers;
+}
+
+static vector<Collision>
+completeGraph(vector<Ball *> balls) {
+ vector<Collision> edges;
+ size_t i, j;
+
+ for (i = 0; i < balls.size(); i++)
+ for (j = i+1; j < balls.size(); j++)
+ edges.push_back(Collision(balls.at(i), balls.at(j)));
+ return edges;
+}
+
+static vector<Collision>
+matching(vector<Collision> edges) {
+ vector<Collision> matching;
+ size_t i;
+
+ for (Collision e : edges) {
+ for (i = 0; i < matching.size(); i++)
+ if (e.b1 == matching[i].b1 || e.b1 == matching[i].b2 || e.b2 == matching[i].b1 || e.b2 == matching[i].b2)
+ break;
+ if (i == matching.size()) /* no shared vertices */
+ matching.push_back(e);
+ }
+ return matching;
+}
+
+static vector<Collision>
+diff(vector<Collision> a, vector<Collision> b) {
+ vector<Collision> diff;
+ set_difference(a.begin(), a.end(),
+ b.begin(), b.end(),
+ inserter(diff, diff.begin()));
+ return diff;
+}