summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/adaptagrams/libcola/tests/overlappingClusters02.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/adaptagrams/libcola/tests/overlappingClusters02.cpp')
-rw-r--r--src/3rdparty/adaptagrams/libcola/tests/overlappingClusters02.cpp100
1 files changed, 100 insertions, 0 deletions
diff --git a/src/3rdparty/adaptagrams/libcola/tests/overlappingClusters02.cpp b/src/3rdparty/adaptagrams/libcola/tests/overlappingClusters02.cpp
new file mode 100644
index 0000000..a6bdaf2
--- /dev/null
+++ b/src/3rdparty/adaptagrams/libcola/tests/overlappingClusters02.cpp
@@ -0,0 +1,100 @@
+// Based on Euler Diagram generation example discussed with Aidan Delaney.
+//
+// B
+// +-----------------------------+
+// A | 2 C |
+// +-----------+----------------+ +---+ |
+// | | 1 | | 0 | |
+// | | | +---+ |
+// | 3 +----------------+------------+
+// | |
+// | | 4
+// +----------------------------+
+//
+
+#include <vector>
+#include <utility>
+#include <cstdlib>
+#include "libcola/cola.h"
+using namespace cola;
+int main(void) {
+ CompoundConstraints ccs;
+ std::vector<Edge> es;
+ EdgeLengths eLengths;
+ double defaultEdgeLength=10;
+ std::vector<vpsc::Rectangle*> rs;
+ vpsc::Rectangle *rect = nullptr;
+
+ double width = 5;
+ double height = 5;
+ double pos = 0;
+
+ size_t nodes = 5;
+ for (size_t i = 0; i < nodes; ++i)
+ {
+ rect = new vpsc::Rectangle(pos, pos +width, pos, pos +height);
+ rs.push_back(rect);
+
+ // XXX randomness is needed because COLA doesn't currently untangle
+ // the graph properly if all the nodes begin at the same position.
+ pos += (rand() % 10) - 5;
+ }
+
+ // Euler dual graph (optional)
+ es.push_back(std::make_pair(2, 4));
+ es.push_back(std::make_pair(3, 4));
+ es.push_back(std::make_pair(1, 3));
+ es.push_back(std::make_pair(2, 1));
+ es.push_back(std::make_pair(2, 0));
+
+ // Padding around the inside of clusters.
+ double padding = 3;
+
+ ConstrainedFDLayout alg(rs, es, defaultEdgeLength, eLengths);
+ alg.setAvoidNodeOverlaps(true);
+ RootCluster *rootCluster = new RootCluster();
+
+ // A contains 1, 3
+ RectangularCluster *clusterA = new RectangularCluster();
+ clusterA->setPadding(padding);
+ clusterA->addChildNode(1);
+ clusterA->addChildNode(3);
+
+ // C contains 0
+ RectangularCluster *clusterC = new RectangularCluster();
+ clusterC->setPadding(padding);
+ clusterC->addChildNode(0);
+
+ // B contains 1, 2, C
+ RectangularCluster *clusterB = new RectangularCluster();
+ clusterB->setPadding(padding);
+ clusterB->addChildNode(1);
+ clusterB->addChildNode(2);
+ clusterB->addChildCluster(clusterC);
+
+ // node 4 is in the empty set.
+
+ rootCluster->addChildCluster(clusterA);
+ rootCluster->addChildCluster(clusterB);
+
+ alg.setConstraints(ccs);
+
+ UnsatisfiableConstraintInfos unsatisfiableX, unsatisfiableY;
+ alg.setUnsatisfiableConstraintInfo(&unsatisfiableX, &unsatisfiableY);
+
+ alg.setClusterHierarchy(rootCluster);
+ //alg.makeFeasible();
+ alg.run();
+ alg.outputInstanceToSVG("overlappingClusters02");
+
+ for (size_t i = 0; i < unsatisfiableX.size(); ++i)
+ {
+ printf("%s\n", unsatisfiableX[i]->toString().c_str());
+ }
+ for (size_t i = 0; i < unsatisfiableY.size(); ++i)
+ {
+ printf("%s\n", unsatisfiableY[i]->toString().c_str());
+ }
+ alg.freeAssociatedObjects();
+ return (unsatisfiableX.empty() && unsatisfiableY.empty()) ? 0 : 1;
+};