#include "balls.h" static vector completeGraph(vector balls); static vector matching(vector edges); static vector diff(vector a, vector b); vector> partitionCollisions(vector balls) { vector> layers; vector collisions = completeGraph(balls); while (!collisions.empty()) { cout << "\nadd layer\n"; cout << "layers.size(): " << layers.size() << "\n"; vector layerCollisions = matching(collisions); cout << "layer collisions: "; for (Collision c : layerCollisions) cout << c << " "; cout << "\n"; collisions = diff(collisions, layerCollisions); vector 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 completeGraph(vector balls) { vector 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 matching(vector edges) { vector 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 diff(vector a, vector b) { vector diff; set_difference(a.begin(), a.end(), b.begin(), b.end(), inserter(diff, diff.begin())); return diff; }