From 5ad1caad3dedb63c10e2350b9be96bba7eef770e Mon Sep 17 00:00:00 2001 From: Amandine Tournay <amandine.tournay@pasteur.fr> Date: Tue, 9 Mar 2021 19:23:56 +0100 Subject: [PATCH] Added project --- .gitignore | 6 + bin/plugins/ragini/voronoidiagram/AFL.class | Bin 0 -> 2464 bytes .../ragini/voronoidiagram/Alpha_Morph$1.class | Bin 0 -> 2308 bytes .../voronoidiagram/Alpha_Morph$10.class | Bin 0 -> 1533 bytes .../voronoidiagram/Alpha_Morph$11.class | Bin 0 -> 1340 bytes .../voronoidiagram/Alpha_Morph$12.class | Bin 0 -> 1412 bytes .../voronoidiagram/Alpha_Morph$13.class | Bin 0 -> 1017 bytes .../voronoidiagram/Alpha_Morph$14.class | Bin 0 -> 1144 bytes .../voronoidiagram/Alpha_Morph$15.class | Bin 0 -> 830 bytes .../voronoidiagram/Alpha_Morph$16.class | Bin 0 -> 1834 bytes .../voronoidiagram/Alpha_Morph$17.class | Bin 0 -> 1453 bytes .../voronoidiagram/Alpha_Morph$18.class | Bin 0 -> 1521 bytes .../voronoidiagram/Alpha_Morph$19.class | Bin 0 -> 1215 bytes ...Alpha_Morph$1_cls1SelectItemListener.class | Bin 0 -> 1409 bytes ...lpha_Morph$1_cls1SelectItemListener1.class | Bin 0 -> 1413 bytes ...lpha_Morph$1_cls1SelectItemListener2.class | Bin 0 -> 1413 bytes ...lpha_Morph$1_cls1SelectItemListener3.class | Bin 0 -> 1413 bytes ...ha_Morph$1_cls1SelectItemListenerBin.class | Bin 0 -> 1351 bytes ...pha_Morph$1_cls1SelectItemListenerTb.class | Bin 0 -> 1373 bytes .../ragini/voronoidiagram/Alpha_Morph$2.class | Bin 0 -> 1532 bytes .../voronoidiagram/Alpha_Morph$20.class | Bin 0 -> 1578 bytes .../voronoidiagram/Alpha_Morph$21.class | Bin 0 -> 1017 bytes .../voronoidiagram/Alpha_Morph$22.class | Bin 0 -> 1693 bytes .../voronoidiagram/Alpha_Morph$23.class | Bin 0 -> 1970 bytes .../ragini/voronoidiagram/Alpha_Morph$3.class | Bin 0 -> 1542 bytes .../ragini/voronoidiagram/Alpha_Morph$4.class | Bin 0 -> 1527 bytes .../ragini/voronoidiagram/Alpha_Morph$5.class | Bin 0 -> 1570 bytes .../ragini/voronoidiagram/Alpha_Morph$6.class | Bin 0 -> 1917 bytes .../ragini/voronoidiagram/Alpha_Morph$7.class | Bin 0 -> 1592 bytes .../ragini/voronoidiagram/Alpha_Morph$8.class | Bin 0 -> 1602 bytes .../ragini/voronoidiagram/Alpha_Morph$9.class | Bin 0 -> 1530 bytes .../ragini/voronoidiagram/Alpha_Morph.class | Bin 0 -> 14589 bytes bin/plugins/ragini/voronoidiagram/Arcs.class | Bin 0 -> 938 bytes .../ragini/voronoidiagram/ArraySetter.class | Bin 0 -> 966 bytes bin/plugins/ragini/voronoidiagram/Circ.class | Bin 0 -> 1082 bytes .../ragini/voronoidiagram/Constants.class | Bin 0 -> 7765 bytes bin/plugins/ragini/voronoidiagram/DT.class | Bin 0 -> 1421 bytes .../ragini/voronoidiagram/Delaunay.class | Bin 0 -> 3093 bytes .../voronoidiagram/DelaunayTriangulator.class | Bin 0 -> 15465 bytes .../ragini/voronoidiagram/Display.class | Bin 0 -> 21436 bytes bin/plugins/ragini/voronoidiagram/Edge.class | Bin 0 -> 1274 bytes bin/plugins/ragini/voronoidiagram/EdgeL.class | Bin 0 -> 387 bytes .../ragini/voronoidiagram/EdgeList.class | Bin 0 -> 8733 bytes .../ragini/voronoidiagram/EdgeRNG.class | Bin 0 -> 1617 bytes bin/plugins/ragini/voronoidiagram/EdgeS.class | Bin 0 -> 1576 bytes bin/plugins/ragini/voronoidiagram/Face.class | Bin 0 -> 6601 bytes .../ragini/voronoidiagram/FreeList.class | Bin 0 -> 390 bytes .../ragini/voronoidiagram/FreeNode.class | Bin 0 -> 328 bytes .../ragini/voronoidiagram/Geometry.class | Bin 0 -> 3041 bytes .../ragini/voronoidiagram/GraphD.class | Bin 0 -> 964 bytes .../ragini/voronoidiagram/HalfEdge.class | Bin 0 -> 2613 bytes .../ragini/voronoidiagram/Image_Extract.class | Bin 0 -> 2772 bytes .../voronoidiagram/IntArraySetter.class | Bin 0 -> 907 bytes .../ragini/voronoidiagram/IntSetter.class | Bin 0 -> 957 bytes .../MorphologicalOperators.class | Bin 0 -> 614 bytes bin/plugins/ragini/voronoidiagram/NVert.class | Bin 0 -> 1021 bytes .../ragini/voronoidiagram/Neighbor.class | Bin 0 -> 1292 bytes bin/plugins/ragini/voronoidiagram/Point.class | Bin 0 -> 667 bytes .../ragini/voronoidiagram/PointType.class | Bin 0 -> 129 bytes .../ragini/voronoidiagram/PointVor.class | Bin 0 -> 309 bytes .../ragini/voronoidiagram/Provider.class | Bin 0 -> 244 bytes .../ragini/voronoidiagram/QuadEdge.class | Bin 0 -> 6966 bytes .../ragini/voronoidiagram/ROI2DEdge.class | Bin 0 -> 531 bytes .../ragini/voronoidiagram/ROI2DSite.class | Bin 0 -> 691 bytes .../ragini/voronoidiagram/Setter.class | Bin 0 -> 294 bytes .../voronoidiagram/Site$NeighborComp.class | Bin 0 -> 2234 bytes bin/plugins/ragini/voronoidiagram/Site.class | Bin 0 -> 1942 bytes .../ragini/voronoidiagram/SiteProvider.class | Bin 0 -> 1204 bytes bin/plugins/ragini/voronoidiagram/Tri.class | Bin 0 -> 924 bytes .../voronoidiagram/UniformGrid$GridCell.class | Bin 0 -> 804 bytes .../UniformGrid$GridInterval.class | Bin 0 -> 2478 bytes .../UniformGrid$GridPosition.class | Bin 0 -> 1206 bytes .../UniformGrid$PointItem.class | Bin 0 -> 710 bytes .../UniformGrid$PointIterator.class | Bin 0 -> 1580 bytes .../ragini/voronoidiagram/UniformGrid.class | Bin 0 -> 11951 bytes .../ragini/voronoidiagram/VRegion$scomp.class | Bin 0 -> 1448 bytes .../voronoidiagram/VRegion$vtcomp.class | Bin 0 -> 1289 bytes .../ragini/voronoidiagram/VRegion.class | Bin 0 -> 25001 bytes bin/plugins/ragini/voronoidiagram/Vert.class | Bin 0 -> 569 bytes .../ragini/voronoidiagram/VertTheta.class | Bin 0 -> 1264 bytes .../ragini/voronoidiagram/Vertex.class | Bin 0 -> 6099 bytes .../voronoidiagram/Vonoroi$GLscomp.class | Bin 0 -> 1324 bytes .../ragini/voronoidiagram/Vonoroi.class | Bin 0 -> 7012 bytes .../voronoidiagram/VoronoiDiagram$1.class | Bin 0 -> 4706 bytes .../voronoidiagram/VoronoiDiagram$2.class | Bin 0 -> 1640 bytes .../VoronoiDiagram$MethodType.class | Bin 0 -> 1660 bytes .../VoronoiDiagram$buttonlist.class | Bin 0 -> 1537 bytes .../voronoidiagram/VoronoiDiagram.class | Bin 0 -> 16092 bytes bin/plugins/ragini/voronoidiagram/dkmax.class | Bin 0 -> 331 bytes pom.xml | 84 ++ .../plugins/ragini/voronoidiagram/AFL.java | 89 ++ .../ragini/voronoidiagram/Alpha_Morph.java | 1327 +++++++++++++++++ .../plugins/ragini/voronoidiagram/Arcs.java | 33 + .../ragini/voronoidiagram/ArraySetter.java | 17 + .../plugins/ragini/voronoidiagram/Circ.java | 33 + .../ragini/voronoidiagram/Constants.java | 377 +++++ .../plugins/ragini/voronoidiagram/DT.java | 50 + .../ragini/voronoidiagram/Delaunay.java | 121 ++ .../voronoidiagram/DelaunayTriangulator.java | 581 ++++++++ .../ragini/voronoidiagram/Display.java | 791 ++++++++++ .../plugins/ragini/voronoidiagram/Edge.java | 51 + .../plugins/ragini/voronoidiagram/EdgeL.java | 8 + .../ragini/voronoidiagram/EdgeList.java | 318 ++++ .../ragini/voronoidiagram/EdgeRNG.java | 34 + .../plugins/ragini/voronoidiagram/EdgeS.java | 65 + .../plugins/ragini/voronoidiagram/Face.java | 291 ++++ .../ragini/voronoidiagram/FreeList.java | 8 + .../ragini/voronoidiagram/FreeNode.java | 7 + .../ragini/voronoidiagram/Geometry.java | 98 ++ .../plugins/ragini/voronoidiagram/GraphD.java | 29 + .../ragini/voronoidiagram/HalfEdge.java | 103 ++ .../ragini/voronoidiagram/Image_Extract.java | 69 + .../ragini/voronoidiagram/IntArraySetter.java | 17 + .../ragini/voronoidiagram/IntSetter.java | 21 + .../MorphologicalOperators.java | 15 + .../plugins/ragini/voronoidiagram/NVert.java | 39 + .../ragini/voronoidiagram/Neighbor.java | 32 + .../plugins/ragini/voronoidiagram/Point.java | 23 + .../ragini/voronoidiagram/PointType.java | 5 + .../ragini/voronoidiagram/PointVor.java | 5 + .../ragini/voronoidiagram/Provider.java | 7 + .../ragini/voronoidiagram/QuadEdge.java | 289 ++++ .../ragini/voronoidiagram/ROI2DEdge.java | 13 + .../ragini/voronoidiagram/ROI2DSite.java | 22 + .../plugins/ragini/voronoidiagram/Setter.java | 9 + .../plugins/ragini/voronoidiagram/Site.java | 87 ++ .../ragini/voronoidiagram/SiteProvider.java | 26 + .../plugins/ragini/voronoidiagram/Tri.java | 31 + .../ragini/voronoidiagram/UniformGrid.java | 719 +++++++++ .../ragini/voronoidiagram/VRegion.java | 1071 +++++++++++++ .../plugins/ragini/voronoidiagram/Vert.java | 19 + .../ragini/voronoidiagram/VertTheta.java | 53 + .../plugins/ragini/voronoidiagram/Vertex.java | 218 +++ .../ragini/voronoidiagram/Vonoroi.java | 295 ++++ .../ragini/voronoidiagram/VoronoiDiagram.java | 561 +++++++ .../plugins/ragini/voronoidiagram/dkmax.java | 8 + 136 files changed, 8175 insertions(+) create mode 100644 .gitignore create mode 100644 bin/plugins/ragini/voronoidiagram/AFL.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$1.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$10.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$11.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$12.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$13.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$14.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$15.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$16.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$17.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$18.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$19.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener1.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener2.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener3.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListenerBin.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListenerTb.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$2.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$20.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$21.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$22.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$23.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$3.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$4.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$5.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$6.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$7.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$8.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$9.class create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph.class create mode 100644 bin/plugins/ragini/voronoidiagram/Arcs.class create mode 100644 bin/plugins/ragini/voronoidiagram/ArraySetter.class create mode 100644 bin/plugins/ragini/voronoidiagram/Circ.class create mode 100644 bin/plugins/ragini/voronoidiagram/Constants.class create mode 100644 bin/plugins/ragini/voronoidiagram/DT.class create mode 100644 bin/plugins/ragini/voronoidiagram/Delaunay.class create mode 100644 bin/plugins/ragini/voronoidiagram/DelaunayTriangulator.class create mode 100644 bin/plugins/ragini/voronoidiagram/Display.class create mode 100644 bin/plugins/ragini/voronoidiagram/Edge.class create mode 100644 bin/plugins/ragini/voronoidiagram/EdgeL.class create mode 100644 bin/plugins/ragini/voronoidiagram/EdgeList.class create mode 100644 bin/plugins/ragini/voronoidiagram/EdgeRNG.class create mode 100644 bin/plugins/ragini/voronoidiagram/EdgeS.class create mode 100644 bin/plugins/ragini/voronoidiagram/Face.class create mode 100644 bin/plugins/ragini/voronoidiagram/FreeList.class create mode 100644 bin/plugins/ragini/voronoidiagram/FreeNode.class create mode 100644 bin/plugins/ragini/voronoidiagram/Geometry.class create mode 100644 bin/plugins/ragini/voronoidiagram/GraphD.class create mode 100644 bin/plugins/ragini/voronoidiagram/HalfEdge.class create mode 100644 bin/plugins/ragini/voronoidiagram/Image_Extract.class create mode 100644 bin/plugins/ragini/voronoidiagram/IntArraySetter.class create mode 100644 bin/plugins/ragini/voronoidiagram/IntSetter.class create mode 100644 bin/plugins/ragini/voronoidiagram/MorphologicalOperators.class create mode 100644 bin/plugins/ragini/voronoidiagram/NVert.class create mode 100644 bin/plugins/ragini/voronoidiagram/Neighbor.class create mode 100644 bin/plugins/ragini/voronoidiagram/Point.class create mode 100644 bin/plugins/ragini/voronoidiagram/PointType.class create mode 100644 bin/plugins/ragini/voronoidiagram/PointVor.class create mode 100644 bin/plugins/ragini/voronoidiagram/Provider.class create mode 100644 bin/plugins/ragini/voronoidiagram/QuadEdge.class create mode 100644 bin/plugins/ragini/voronoidiagram/ROI2DEdge.class create mode 100644 bin/plugins/ragini/voronoidiagram/ROI2DSite.class create mode 100644 bin/plugins/ragini/voronoidiagram/Setter.class create mode 100644 bin/plugins/ragini/voronoidiagram/Site$NeighborComp.class create mode 100644 bin/plugins/ragini/voronoidiagram/Site.class create mode 100644 bin/plugins/ragini/voronoidiagram/SiteProvider.class create mode 100644 bin/plugins/ragini/voronoidiagram/Tri.class create mode 100644 bin/plugins/ragini/voronoidiagram/UniformGrid$GridCell.class create mode 100644 bin/plugins/ragini/voronoidiagram/UniformGrid$GridInterval.class create mode 100644 bin/plugins/ragini/voronoidiagram/UniformGrid$GridPosition.class create mode 100644 bin/plugins/ragini/voronoidiagram/UniformGrid$PointItem.class create mode 100644 bin/plugins/ragini/voronoidiagram/UniformGrid$PointIterator.class create mode 100644 bin/plugins/ragini/voronoidiagram/UniformGrid.class create mode 100644 bin/plugins/ragini/voronoidiagram/VRegion$scomp.class create mode 100644 bin/plugins/ragini/voronoidiagram/VRegion$vtcomp.class create mode 100644 bin/plugins/ragini/voronoidiagram/VRegion.class create mode 100644 bin/plugins/ragini/voronoidiagram/Vert.class create mode 100644 bin/plugins/ragini/voronoidiagram/VertTheta.class create mode 100644 bin/plugins/ragini/voronoidiagram/Vertex.class create mode 100644 bin/plugins/ragini/voronoidiagram/Vonoroi$GLscomp.class create mode 100644 bin/plugins/ragini/voronoidiagram/Vonoroi.class create mode 100644 bin/plugins/ragini/voronoidiagram/VoronoiDiagram$1.class create mode 100644 bin/plugins/ragini/voronoidiagram/VoronoiDiagram$2.class create mode 100644 bin/plugins/ragini/voronoidiagram/VoronoiDiagram$MethodType.class create mode 100644 bin/plugins/ragini/voronoidiagram/VoronoiDiagram$buttonlist.class create mode 100644 bin/plugins/ragini/voronoidiagram/VoronoiDiagram.class create mode 100644 bin/plugins/ragini/voronoidiagram/dkmax.class create mode 100644 pom.xml create mode 100644 src/main/java/plugins/ragini/voronoidiagram/AFL.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Alpha_Morph.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Arcs.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/ArraySetter.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Circ.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Constants.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/DT.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Delaunay.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/DelaunayTriangulator.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Display.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Edge.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/EdgeL.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/EdgeList.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/EdgeRNG.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/EdgeS.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Face.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/FreeList.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/FreeNode.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Geometry.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/GraphD.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/HalfEdge.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Image_Extract.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/IntArraySetter.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/IntSetter.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/MorphologicalOperators.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/NVert.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Neighbor.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Point.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/PointType.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/PointVor.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Provider.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/QuadEdge.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/ROI2DEdge.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/ROI2DSite.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Setter.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Site.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/SiteProvider.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Tri.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/UniformGrid.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/VRegion.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Vert.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/VertTheta.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Vertex.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Vonoroi.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/VoronoiDiagram.java create mode 100644 src/main/java/plugins/ragini/voronoidiagram/dkmax.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3d47f98 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.idea/ +target/ +.settings/ +*.iml +.project +.classpath \ No newline at end of file diff --git a/bin/plugins/ragini/voronoidiagram/AFL.class b/bin/plugins/ragini/voronoidiagram/AFL.class new file mode 100644 index 0000000000000000000000000000000000000000..989d4691c65c3279dcb854c503057a592473b752 GIT binary patch literal 2464 zcmb7G-%}G;6#i~PNLW@8MASk>P$>yQ6sbQ5qJYrSBB-IEU~Ri3w{bDa#?6L-_SOHO zPi>#t7hZg@P8(+GOs6w_>wnPy#cBK9-A#;XE%36t_nv#c^PTUUdy+r?`sG&uqj16q z2=o<m<*ZpK#chKxGrnorR>3kerjfOce0*wdA&e%0BOAu15ziTgY<y{bL#7>prkq*g zt7E}6l^rt|Ptjo634!JbVmXrn!NF*XM`x^z)DT3gjxZu&9I7JLxoObR+5%d1gwQO| zwqO?IVmZGq?PX&<CsiyfZRAphZK}1u+2lMlO9E#W_RNID!o{+)EEVs2gL^pKEgPBH zOjahM`#q?U{0SW=@s>a&Z514Y!U_!SKhnGsp-0EtI7Ja{nYT8X_OZeFsHbvW0TN-H z78v;dq^mh7*nS;naF!)8G8u*WZ^Y=DfMC3R^A!l0g^b*y+q}S`q+_HX-8PDTVS?29 zK-s4h&0&@OStVs$#|2y@;jDCVD8l}-O=#%FB^_gUmnzD~Wg~a6GOQ_pD>|;?8pD^i z^8&HK14P%6&@qAQ?EI4XB^Bj0pg;l1YyxtWZD^Ke^F?RdwJ@5F867t<MT^{WY$NTc zy*VB4sYYm#IhmIQXNod}indvBTJQmQF+Z$cBeyS-+a*Wlb=<}xaV;hOF|Wv`6~Ck0 zl8!BnJUi!(!0}f%n%ia}J6$$&8EHpwkLA3tVF}CXwtm#mE8gKml*Q`BijI%5$}}z8 z%(8Lz6e%TbM{cn|OSrG&6FgvnjABt1*pkEl)sl5x`Wnqd1fP-Td4*&sr1b`XD$h3p zDE=88(&eAwOo)IfhzAPM)Ukm_yv2^?;Rtjxw?@gBM;=xf1%ack?RBAb6qS5ow`4gU z5~hHbw90l`&Y5bUML1talqdSw@IlUHHi(*j{8Cqd!;;SyuBK@fd>@JJLW{kCzPgLU zKcnqO?gh}!=V8~s9ZfijHguwcd%EYtoldS;Np$&mU(rj&>x&IlaQu4DcW8_Kgtndv zx_?9OGxbeF-->v~LqRt{7l{EUNbV%bbrb3oCG2$ro%X=|K!n9P3@}tP&%J{|28+_S z8R8|nr~_gc@`+5-7NAY5g?yEg=335CfB`p3mv^!jMf0Nwj*K_qonL9hixF>V4?NCr zpWk!FY$CtO;PoB!$0*Rq;?Qsfqu-)ey)X0g8#M2r{YgOds3a;F|NiektDiq0)blj( zln9=R{VXXs*h2gXZp9^PI7YQDAdV{-=fs)dQ<W~}MXlvJiAh({08e;|wz2{@xEFM_ z)ew4#kmwF*s_2|0KL1g^RpUfFYSW5|*D$OGzi+tFyhe%C8s!$Q`Tm!ATAkCCf6#A_ z28>&E7<vtZ1JK84;4t3EVZP44%0X##(f7Ye4ys374&4>ZsupeFu;^lV9a80>E`ZWX zDe!*nDt%3571~^IVh2~BWBvt}Ry*$QA{it0NCl}1);d0|;B$YSR_iaguHaz>xhFz& w*XsPc>MpOc9d5;vtn4ytnZztob)4pWT>_ZFW0#Y<5&RFPsy0S~wwqAtA56meaR2}S literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1.class new file mode 100644 index 0000000000000000000000000000000000000000..3fa201a1ee4b983ff3665119989790163bbd6443 GIT binary patch literal 2308 zcmb7G-BTM?6#re4W=U9RN>fUu7SOaNP)I4_7q#+{pkRU>f@!O0U6M<(WwRT1HzBp^ z_~x50eb5K>m6>+N85~HRI#NGpv^qLI_~3uxyEE#!yWvCI0zPE#z2~0uyXXFX=bp)( zzizDqIE}X@G%)m*v~ph6t(d9MpvEeOY3PQUQ<c1_6l0@Wsi0g+8D^;v9+2Q=2wqky zN=#GqeC&n!%RFmK@G%^9tjdxd;}x#kv6NA^cv7`&u5**YXBSi}e2R`s?)ki72FVQz z6Tlft&OXb~ANd~$(F}uk+{kf17+Pfb(HMXSK^XxYVDLnu8L@LvhJ;3j{Yh2l)8*nk zH)oZ3jWe_+jjW<&6jK%Jy3s4LV(8m@BH;nLj9e6)oHMy)@f^dkNb+8sB?NuLBJqIZ z@6gH6v4isl^th&G7X@^)6FI{*uFz2dbfQ~A7sHYJ9w_4>JWO2WxqZRmWzvu1ctpYp zhUlIZlMz9bw6ZicCsaS=BwdYJODa{%RN65Q2hfW?2`7nnk<Wj&W%P?o8Yz?WYR)c* zJWk0Nz-fkkRCGcW7Wa)*-k~A}>Gl}IVdq{>Nv3U+&KfJL8f6f`5Q5_Kq>QIP68Mx- ziR;AB(MUY%GJ1CuB{+nqWt_z`l!tA&kPM;7-676pMrDj)oO~^AXB4eW8G0j=qO^`9 zA!7p1GBntOgs>&zEU(%VD%Wy^Fp1|SOi{6I%CosEBZ(Bf140%yqO@K$+tQ|D@s0Sq z|D28YwfjaKRzQ`W#)}eW8M=0sFFq?HgYyhc6>i$RI_gq<Vwd91IL?&(MZ7HGC3;<3 z8l)7vAY%@%P$gvzdMRFFJMPCNC=y;{2=APc3oT<_NY1L_h@1@Wz*(v;aPl$=&h8c8 z?LXWbOVAiPw~}z5@q}R(6+2PQ@{+9@I_Xd(b$m`8rN#5!3UFnnB587VXB29I6yVVp zD586t<2{int~qTh*~OGna@vH1^1piJMiseTAfemb6i>Cud8&!3YKv7MZIsO{pHM}W z2e<X!evv0NsDz%?3?d<);&#CxTHX|W%qw~$b%9Bpn(erzP=m41MUBlvzkO&xQ1mw- z7!)0l`0~*&fF|0NX*Nn84K(iW>0Lu}&rNsIx<aM~gy`EsKwzK1&sNYv;~}!i6igv# z!(kd3+Hs@~H$-azN6s4nKH<!2PGFn6Sq~JU51@m-^eA_SxU~z!gBuXcgqN-ktoN*< z`2Z{Q)^MyK=Bo(T(4)P(hM2pIg)sR3$8>Spr0JHu<%18=B&;oD`y4|TZ{qQKNDWWa za3<xh!gb?&Uaf`^cM(5X!*hgI-^zzDy%@qd`VAUWpJFEZ87{2hRd<$M!@@G!rfC&| z>YAO&!V1xH70bAeMbbcMF-Bs7t)qk8re6Cc2H98Cr@p2h^9|<Mw<xjiaFu<JYwQPn z#O`33{fO)AC){8^W0n1aFW9dRhmX4KY|5~Xq9el`y*nKSiFA$5E7AW14{o3pufwF7 zMH#fiJ9zMKa`Q-F5;`T=Vq9#cTq_&=QwzOM75uh~giE_a{JtZE2UX|nD|mxOFE!z- Nc#CEMr^sjm`~#c;95es` literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$10.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$10.class new file mode 100644 index 0000000000000000000000000000000000000000..e171e11efc9ef3db5fbcc1e64442716bcb944143 GIT binary patch literal 1533 zcmb7ETTc@~7(KHsZdn&77p*r$6tyi#LGfC=08*{AR0W&(WQKMqtJ~dXJ4Jtt?>?I- z8cqBGCO(*`F<zehAL=)|4XqIqY_mJF-^`pn-}%nBZ-2ge1K=d?=+GF(YIdVyIrWss zX|Pi3uID<gRknD=<JHuRU0dV#@~&4~8=0KY5oU<q=j%LWbElFjtlSqRsbdGjpdaNA zWlF3IN2X><(sG@gRhPmM9>Wf~X4OX~7)Ep3eq)+J4~~rxz%<d5ml($5|ACMwGKA;c zvgiauw~0<f41^FhVW5{G6i*b@O1}vm5r&?e<%q>bbwzl~e8m<FeL1(p?IQOq_1p}G z6)R%0eIg_tWz)lbRc;Dz)%B{P%rF$sZ7JNm5;2`98rY9P9S0cp{d=E@gBYU1RD=v< zpL45K?hyPyJQ3jg<yw-S<y6uJhH*s4VTRsTDYK3g72%l}!BLWZo!bpjSY<fgB-jqn zj@dltgB~{#M}i?@IkKn#e1Wr_7{v)4V+@IHm)^uUQVbm)cOIN%U_QvCNwz(uyj1YY z9-$Ak#9J1RWX2M9Ij!R~L#&lqko9cCvdh9Va2DrvocqJZ!48%B1%_SmY<qs2noVI^ zndYL}@wcX`Qd78W;)<$7M7qH_1GBiQV~%{ZS-wrCCgv5KUKdiubX+4pw0H+L%#cyI zoPSgjHPuig1?7F9m3Mo$1*V}b<juanIZ`#8RXRP~wzTC-$f;dRl9wLjd9CSqW65oJ zC6TdIPej|k3ge0}IeXqI*>0Wel^1f&Et^<U{S{U{%V1_5`UuR~yj~Y|9HNE`(bWMB zQPp=qG^#q2K1&*126ob_NwXPxR*|0M=yP->Uj&oBr~bwPx_1*0w0G##exRGiT@*9v zFde~e#AsyLgS}0-?+DW$xH-Ckefi`wbd9~lp$!~+j^q=Viz*VLxf-7#`4~I@j7+@7 z)ZOOdOPqOu^ad_%VCE^|cc7o%m?1uj*D*>5+Iw_pAJDIT#BS{qV%ld6X<v}gzG71Q zhJyCp=bH>THTe=dTu0VNT)+)1kN`1~CWky>FA{bPp<lE)q=V_$ualu^%tU%=xj@Sr U0o<Z7OkH;y%QQ0xOi4n&-w5G<K>z>% literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$11.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$11.class new file mode 100644 index 0000000000000000000000000000000000000000..7c0bf72d7663399e5766c8e09b108f0455bab972 GIT binary patch literal 1340 zcmb7E%Tg0T6g}OE1j0bVLs0}l4VnZ@1Qb*r$|ES6fK^bGg$t{bw8`KwlbV@;?)?du zu3TFMSmnYG@C*C|7mDR`MX9$lDZ;{1OjW1vz1{crxu;Lh+n=xB02snz0Gwf<WRwfK z=_GAIlb+nLY|FItye<m1SWiwFrJ{I{vFuVYGB_B3pCP;^Hbl}8W+AzlU6VOCfI5cm zN>psRNx30SH#wDab<0fajw?-RGt{|7-HBXe=uaQ|#4(0|mlmM{;{?y0WJpB+qe5(j z!9Qc=Wdj(RH8h|;2p_^4f@opzMPn;!rA<Qs^$el3Zpwx7dRE%YB5O#7*0hxq#)`0Y z<yV7#g^G|I9te>~-GoGimAle@XxZyB&(IT1|B<+qB5_QCJBjW9x)@@IrcJ{s^bmEM zLU(nuz`#~jnbR81;4IOR*PRkW^!`84&(bzSJQ)k359b3o$I$n82-O4)QN)N^yKK^7 z(Rr_lehmY-z`(O33@x>$r^~KunRG}JBrnoOXrB*nNh7HaGXx#!rc8AQ#F{_4>Q%k0 zVZ^ICtXjOH;i~7Rlsl$j+;eA@JE`G1ZYU`(+IgGqw!H>pSw42>bZO)X$+SW;Ls!3# zWPg>oq`a<L-a)Z@cSc)u8uJWIORmU0%7{``HNhpTZ0F>hu5=YX@Ujx>AnH72<_ycB zE6Yf?Xyr9zlt%qZ_YB&+Ne^kp5RM}q^pa?OG>(8Hth5V+!%E%sv^k9+8fjG{Yl?go z3B~)j(G-8>8LclX8{6r>nF@iwM+4tOGtEaSrcpAb;21h+W;l)$)pGBs80|+szJ;bO zbUs6)vV7a<^i8}#n-}iw8uINR@|3f#!1G_bUNG+8LBcaH)y&bFd97wnkU6C=`k*i- zs2%VR2=b3;<-6$MpAeyWfPcm)|AJ}$6&d~w_xN|@_>W2ty&leL4}=)ANKqH<)Xf}j lQXjXday@*ld-Pcg(e8QjId0<)&3+P08Vh6vDMztEzu#hyL~j59 literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$12.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$12.class new file mode 100644 index 0000000000000000000000000000000000000000..8b43be3ca242f5af5ef9c72b83567facfaabe3a2 GIT binary patch literal 1412 zcmb7ETT|0O6#lk}4aB9Ci>N4GuxJZN1raYrv_OGsxd_ON=nS*8F%5>KlcYHQ6#sxe z>tLPn!6%>mQI2Pu4B!l-n3-hv+p~MlcfLI*KYxAu4qyz=HN+T(Yj)kV96##`8m#P| z>$#3=RV-n8VmF(&YgMte=z6tkYIID4%8=X<dm?KK$ILEo?-=DkL!6<nxhmcUS!2&| zf^5DVSgupD{J?Mwk0BmZEkAXOVW@QCh&cu=JeDE{lSD6=Vi-yPhlk7tgF53@j8-rt zI9k!7LqU>5M+bwF&TL3a7l(!xhW3)>7)$ltZNpm^+qS{bS#rz5-VmN8akQvPR>b7w zL`Xc!rd>2uSuwoVuD5Gc7%rzv#|l@FBIYEy3+U5uks)(p**GrYGNoOy{2D|0<v&=? z(l%SX%gInzIr?!;-j-{cGJRImF@PHyt}_h$ok8S>BaIA2_umSNuBMA&5<?urxXBRP z9%JY@OnSN=1g?|Qk;SM6s*m;qJwg+wQoYU4W*Wh?D8Dg1x9*T|o$1V>lNr}`JxbsX z?rNBzi$3ttv~b+ReY)(`!Yq~VamR8TlX8n*D$XygZ_TgfUr0t%9FOprg8P34?>cg8 zVeBx;X^xpN$q9M9z%hq;hE~fjII?_*H&xuGv=up?;3-8U*9S&5y(tTpk?<D}X&!B; zur7$vT0mkfids~W`kGt!%Ep`}FD-ebYe%FMq-wz_+pcdp=Asc)-3rH=tbbMZ6az0h z)TA@E@O{I_6>12D-cyJnDf<FQCS~W)ZzD#pj?-l2G|Ll~EA4|rU(h!AHJo&QYHsYN zZ-N{_AqA9fBxpQCYn%?#5%l0JjSS~-K63XXa#tPPN83Jn!{N$Uva^9y2nHJ%`Hb-o z=!)=XJZRwIM<fsMIN=cF8<>5MjtD3XEPO;FLMkE2Q-S2!FOySFp<9U~rDzyeT9H?D zEGeh)N@;_sB%0iNn(0;}?m!hKEE4-A@)3tR&U@wGWtmV6D|kkuN?o;zb(-n4Pi9Wf EZw=d06#xJL literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$13.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$13.class new file mode 100644 index 0000000000000000000000000000000000000000..3133c95dc94c305fdcf59f9e497f7476afbbd49d GIT binary patch literal 1017 zcmb7DVQ<nv7=Dh{b<_fN&gpcFsW1vmx-tEPF(Gp%OPHEy_~Hk1l(XDYTGAF4f0oId zi68s{{wU*nzz4IKiA}EW^}W02dEV!}{`~d*2Y?oy8OSi~jf06V!^Dj_1?f(sI0_>< zklc^?$n6B<A^&(9#p7Z5;Lw21V4v|RcLN^!?wkIZ@KOUS48>WNpQo;viZFFMUMi!o zE0a`&B4$`ghcYSeGc>wOGqxFw`LQwqJSTbS3x=li9|*M`gMJhZL>3Hr3t6n1&|q6I zaf?B7YCW}b+k$~rhC)|{;`L<I7x8=E4+O(nH}ZJU<FQoVi=?hpk&@+wka<*1fzMod zE8<U4JQ4$jlGFXGamUKUwi5RMMFU$5wWV#du#FOxJ&?(m!TInHl`m;qz(2PY)k6!9 z@K|*#@_ki4J26o~)xa)8<$47R919L=#GagUV%MFMT2DbVEbJ-AjaZDi3{!$8_^s=z zXE5JIlh_llq>^I)aTlA)H1hK}^nxgnp?@mUVKlICs5o?WQy8q1kgncQz>`EI*r7IS zG;SaRTXh?-ZFL{$XUNbnag$apnsw+~WeWAiSLEv7=99HAvyJQY&Jz%{O=PtS@)Yk- z&Z5I~1RJ<Zk>MUT7jWJJu3Eo9?gIDcVW(y1E>XUcyF~peO%dzbHg>hrjAmn|th%59 es(6AX5ovIVHiLZ}P}HfFEj*=}Noz_NJ--1P`t>0I literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$14.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$14.class new file mode 100644 index 0000000000000000000000000000000000000000..4b4e7266214ed26a13e0f74c92fa286809176f9a GIT binary patch literal 1144 zcmb7DT~8B16g|_eEUep7QSl1|wbiy@7b@UKjR~okkQ6nM@Zy6Rw&QllcBYx#*6_1T zP!k{g0sbiCowkX_5U88X-kCdd?>Tesou9wH{{T?OGZz_#)n43>q)GzA$;e=!jaFK= zC65g62HSD3!$0h4)9V!1H(X>H3P*gvgP5x*cyo9p!qmkS!{X4(Kc#^f2$crgVJfw1 z$s`p@7>22|Ba`A9!%Ayn#0G;q3M*2A=R_}k!B8vzM~2D)L$;~gVg?L(A2XQt;Gp2c z!zBi%Tsg2imwmXHW|(bBC0_Tthr;ah!&orPwRFhi18$^UkDXb|ikM7Jgv6uU%<`cs zZ-x1&O;@xTmddSDh1;<rHY~YYSah+#P?=aZAGfi@kZGq3oA1xz_)^5YulVskT~I~+ zn5Wt_Eb1K}cX7`aPDhbdg6(=J;em_$4E3|goR-u_*(#n3wMtUc57VaZ_AF4<#|l=d zOl_I;7|Q1|reiTbZg{9+%|*aaI)}|Dz{k2J;2P26Qjs={F12u${0!bZ-8Z3lC9MF3 zzaB%)R*ed}qrzAxQbl_r?dZ0TCl(`XTb04zRn+^<m?w!yuuOgC(71pM3bx&VLcum9 zy~Yd;4;N|Ir`a~Gt!K8n@&&o-x6x$o^YGvm`sXPToGNCVE#%2wC7(~h6oPqNBg=3d zH^%AsI9;iFg4_vij?8lXD~h9O<&Wp#zaTZtIRT2!+7M)Z$g4C40rf*2j|j%W27zX< Ui7m2Os_J7rrI|;2mKJ@#0dG<xwEzGB literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$15.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$15.class new file mode 100644 index 0000000000000000000000000000000000000000..712d23ccc8087045869f7113cf18f294513853f8 GIT binary patch literal 830 zcmb7CZEF)j5Pl|i?Iq_mIjh#U)>@64q|#HtPZ4b>EeKZ?lzc6lWKFhQcEjE!{w~26 z@Pj|VA0^Hv0sSBn5B6qucITOAp4lHizkLVr1P=m~2oERObf|QmSiwdmGh>Z5YM{i> zigD7(CL?inYV2fGfBZCnPl(UOOeC4m!{l}ET=t6q>x7+oRD38BIg`3bI{iW!ovOT$ zT3W(-F;aQ`5n(@Fxni3TEYj)>@Qmpd&j|;O|3GMV3I358$O;J62o;n=c!(o}xJd9C z&8|DS6d^#FP)n7TucqUkwC_YOlZ4IG^hMScR=NE$=sQ--WOX7e9(Pj{b5-6*``*~G z91wOJ>0gCAb|SW$-4Hji6JVRrTv@gVw_I;)R_3xG5O=ZtuPTJ_t(n@sJW;OW_>Y+% zIC9MUSobrND?L1w#mEdI+;bItHxWYgQuBz9GLh#p$8DC=<F$qoVy7w)$4+;CbR}LP zF7Ro@UWfNCQfuvh#zyPw!rA;dzj&GdRR)6BM#VcpmF*RdMV!nj*uqt|glo9Igga#G z;L5E}*!Y4Qzi~nr_g*0I4(AwKi+f89&cN=H_8#Y#a0hqU`Ye4N_t^^>*;VE57qOAV A9smFU literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$16.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$16.class new file mode 100644 index 0000000000000000000000000000000000000000..934c533a69c1307252e8f569bf2ef7a8ddbe877d GIT binary patch literal 1834 zcmb7EZF3tn5PsxybB?PfPH792mb8#k+j((oXbZT!BxwQ$rzuS^&{B%*Q|wF5I-`?A z%D>=8@B^4>of(+n1O3L2Vp!doIMd1C;F+_e)$X&q&#v~bzkmA!KpDzKieauB^jf}( zN?Oq3mv%!Ps?hg*(bA$*S`4~v@pvuN-S*7&n=aA}xoxp4N`X+V(t2ZCHjRrhhKsRO z{AfyYS1MClY#KjQH9s;^NzE{3+I}>1jbXNSY>yQNH!+(bfZG(F`H*2D|3454b%ykE z=*e*~OmK`NlZAsEM;22IPQFmLH!pFx$S_RSd?oMpIt{5eMI(?5r)yzT1a+Z(dmaeW zHY$qb_<<04l+C1wS-B_mR;WADW0=m@jwEiyl3209y@rb}E-)01O&iDSn5ML~P&*8) zYB4Tzyn#1K==o8XA^&hh=yymh5Kk)B_6o;a7I4gjtyUnj$fM|@z;NZiLmFUk%wmoz z8A)?Ljwqe4CW$R@lq~QG8)@0%Ugy-9q?{Qjm#zPIIBwvk^}nt?O*J_)<ZM&!nN?o~ zUd6?`3{%72tSTd0QfF}s@7rq6+1+i94?sPXG2w>MzG@LzzL3Dh9i2!kS$vEo7mHN? zgYq1>;#kI=Bq1wfI6ElfVT2^ZRgO<==x!2voKBVFGkngF^2qeY$U?|K^ptqANe!r4 zy+D{y$5mP5xQlg5m2YIU<ST}&qrmD?8@Wf>eSr-Z_Zi9~DtLr*j!k^Yz?-3pjP5l} z?7BFzqXxbUbzA4JIKH-ZPPct8Zm0(w5AB0=wd@LC8C&;99N*zF5!E0Dr-n6O>KPL% z%0i&&qCwB<phn3RhX-ntEH%-Jvd@+tS~~y0&H_gA3qz>GvnqLVWVR9ZbW^VS_W9=y z4ZsEKhP<t)W)McyJZsXlLyse{k*Do=B3`PB=G}52qDV%#M6<=A?*vlF*%1Tea&`#O z1WwVH#Ywv5v|FUJl}r|ApW#$-KiQoAHC8-B{}TiRXA9%bPne+fEXg<-lL^k@Wm*|t z!K(=zn?^c@dtQ8sQ_eG-x9d|}N|u>&vYzkb>Of)sNQL=6t|b?5|BhSV46OF?ULTb{ zK1$9j!>johu0BmP{`FVu<6a^;2qbs1kNOL;J_eq?b^7>zNWlWJ1!o%>X9t&^00pOm zB}d_r6JpQl;%Dav{NiZrI}!eLOia<agoXh{z;kS&MI<?B6J;s**rqj2?Y4ss?Xq-d HNu}REnmyQv literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$17.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$17.class new file mode 100644 index 0000000000000000000000000000000000000000..e12466982f50a5b5afd1ad6eaa64342b5b16a9d7 GIT binary patch literal 1453 zcmb7ET~8B16g|_eU8n;T{6<jJqAehmDx%h}ibbmhR0xUjL5FrIi_2~^J4Jc&!Otgu ziiru9L=%62KgxKg+W-$naFgA8=g!QTGw0sBzkYxJ2_TC(8xe+)np>|rUXW3OjFVaO zmGAjZ#Sv8{Rx^3Gwk)1c`>M8_9GkEaWk{@uHIZ?JSIx{WuE?^s5o73YM#U?gk!#Y^ znS5D0zE^SrEj_6iVtUyLk{1|;OM5;s$6$xsk_2#_=;@mbqpANuNG~u%C;f_S2SX=E zJKEx~kl=`;o54z@7tG874jXL@T_wkpGxgO)spiF^D;au9ep$E+LOEvK3PuepVzPH4 zBp%(SOEgt^B-N6yR%M0ZWUBO6;R;5?oFR7{{Wkg-(tDPT;{;C9wUzK*GO(h-IK^=q zXDC>4f*M2W*)G)Y(lS@9=gi(gj<W_Zru}Nwm2spnWFyTm_-{%r431%pP$mPZpEMao zQ^oLNqZ}DfNyPN5swfis;I<g^^0l6Fq+7|^$TD<q7hTcQvMN;^W4L6}IAXlZ922<0 z(5C%4tsJjPV5xKn*DTdAnv3HauG^qo^la(Abri=9P=OhyCdP26m7SdkA@$oFdE8-$ zRA|}wu4+nG)IG62PgUeq>#oqgA}V(=Wuw55-9^X0?B=*<>bJA(dx2K<vMwkpa+8`O z#{)BED_IkcNAwse+qbRk&i)L`j3GYf*Hu|gIi}<jJDPsfs6>TZ@XD?qkgn5GFZ&ga z$L5TvX-NiN^r*)tT@eH_zyS4=MejaDkT7ipBoe0a=&uu@H;(-@%gM{r*hIR9hQFa> zXft$rzBU&gq;Dqy!Fq#s>oYpZ9-<hh&9nuFafB?xQ5<W*eL=Jdw=}eYj;9;wjlTGX zUNhLhKxmTL(DpWPF7(d-z}VAPa1$3B7;oTeIKCB{WVV6H(A`35;QlttUc`vyTXb0O zaMpT{y!8Qd)<;O|Q<L%GkX4H@u!M&w5oZh2bb|<HFiSQ{o%RS%$cxjQxg$M)0FlIV A-T(jq literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$18.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$18.class new file mode 100644 index 0000000000000000000000000000000000000000..b3db3f378cbf38197507858cc090b5390dc2a6af GIT binary patch literal 1521 zcmb7ETT>HD5dJ0`SXc*$c*nb<CjlgacjGM*(3}&*BN#;=bV$aqy3D3#C#b)}2hUNT z{0CNHtU6l$0DqKaPc{M%mT*$F>7JgM?ytY@o^Rj(`wCzj4_zb}M(RPM=Bp^H1qna9 z9O_Voe$^K>EtazRpuQ*`O^3R^I5>9RMUo-)R4j{ZAXF_ov+z__jEhc&{Vl6_ZnAP& zDwEAuj326!9~r5nX6Q7Fel&QJVYsyEh&cu~zBWh>E)hI)g<&-PKRjg049SVGD!akZ z%h8Q44-Qfs9=0+#=}g(~Y~ygz#n4ysmAuthT9A59ECiCFzZ6zPP!`&^>$WjzQ4x~O z10nJ#n?BKE<+jvMLcJub3<uMtUlKQINz7Srd$HfeK8DPuY2!G6gA5&7sAuC0tZ1Da z<~V|*L`Kz*>I~_J8(=Tcu|T}c*}KO$j$4nNCal#0=^>3F7a4|QzsJ<}!7+>xhOS7O zJ29kWx)`T6%8>;%g==PXRZBv<eT|Pf`NB;3GN|TU(9YJizAGvtYf^g{!)aT|5v!f$ zIEV8T$Aq&+`>ICH(wW#@t6O7h&cj7qazW+jU!{IE6vt&ykGX`^+8B1U3$)%tjQtu% z9@iNXRXTQNLq2678cMvJqefD-Mj%Y6TjUlvCNV|jBC~BcR<M-c<S1IJE9;RTgv!HT zn08TO7~g>NU&P_Kg&FF;N~j{E8x>RVDL%#ONEZs3vaRRe9Cz$MxLVeQuP7r%`}@|4 zv3{!K=49|@!-lTNDc|Bwt$Qj)EwL1EQdNR5qEbvtvlv!6=536m9b^VxRP-`T1R{!L zghMoi4t*U+AZ3RUNTuw!(p#0F&%+kl<)r0lZ7qF6!ynNz^eI;QKeP^Rr~h7Z1m_jH zo%iS^xr1z+F4Gn4#4eHyyRoP3?n^5qV1`!EGrxj?<l~PRu!|KOipAh~EC-tSBi2rQ z#@Kw@_z9<)IMc+1czrb%KkrP$%NtGn8EdOPo4CD(c>tY+`89f+e{kIS7kTFmg!2}W p^R9(|XDemX#!qN5i#f``!ClHHfimuqOj76E#{<$l+Orwc?*}K2g8%>k literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$19.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$19.class new file mode 100644 index 0000000000000000000000000000000000000000..a4af60edd89571bb73a98ea1f328206f07b3448f GIT binary patch literal 1215 zcmb7DT~8B16g|@|F4P4oB7T9O7Htc%QbfffiWCx(q9zhvd@#dy+zwf0n*G4QAM!zc zFd`;C_yhb=#yh*17()OznY}Z2=FU0y+&e#ieg6TVhG#Z%43nK8@uiB~kdu+_jt;fb zvL(46@@;o9=(PEpH63=^rRg~vd4}Q^-{Ee+mG8dT+!9`F;|#+{>gDfZSL_HCyNg~d zwQ9;J7D|K+XX3VuN_QD1nx{srGuT;Ji7uEYdhr6oRQW${sBAFgmvl??fT7Pp54sDm zP;^khIR>j-*)Tij9oXn*=x<6To+sOzB3$R2fnXSDYL5pSJd|dA=*$~d#N_luNIc4> zpQoz46yaMPZi^PfXt{Z$aLY!-x*>NJBQ}N^DyNps!8MFB<XSPq?CTRaHblS^#dp^! zLFFd_k9Al#sMj6bz)e#)?fXUvwrbqt4sPK#Ll>P+y$$27IH(%0Ejp15v?^c{Q#S4} z)Q+cp6ubi$)F^|VR#6-#Uc8d*?d>)saU&XC<whgZrRHD;_o%)t8Fd)SC#Fir0=`=> z;65JOc)&1z0=X=}!JO$8I}{x*6^Y7-#_(}<V<^1RN$80cX*4SS^@^rUxv3MDl^5tp zDt}GHZQXM4)L`UIk25%{iXP2Uz@tb+7^4QYXmlZmqUlqhSTvnX&p1b;fU~sg&}@;` z#?xP&_=?`@w`?--IXyT?|3111)_e3=U(iSP0{I*YrVtF_B3Xt@xO{k>P9cGr>OOk+ zaV0Zjwak_>Q$D~%Hk<yle}LJ4AwOWu`iPqKDTN$LS<W0n5&#~dPM{X%i9!yKu|PIY PjrD|bG8vNSWa;}24(K*1 literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener.class new file mode 100644 index 0000000000000000000000000000000000000000..8dc50f643c2b5eb6a1e7f7e2a55cd4b531ee7e10 GIT binary patch literal 1409 zcma)6TTc^F5dNlJx}~g8E`s6>6{H323V1J~T#A+yO)Q|n3ps6%?c%bFyIb_H_~x6> zCW46%#%KS9|HByPY-@@MBs_Fy&(}FK-+VK(KmUCD4qy^XIwFL*ZM$Bz9N+W=8_V2r zJ=bxqiY2O^*fMAB?V8wFcD?P|@We*h_9u$cmgOKH$gP6q2hx$A4vmo96g$GSg;O;j zmp0i$M~rYPM8&(nlsnQ1%>CC0v7l!8!&eF8g(I`b67<HkVNPl>jbb1IIbY+<vO+kM zDjbkAr?O|$YXoiHt;hsAk<`&eIB}S>fo}8=x~np*wNbSw*^-M&rCT{vMXf)xI{FBM zD(HLDe`m28vn4<9L^+tN2Z8IT%>4!iaDvduvG<WDL{sT}0=*bCa0;inP<B|6?*l^L zzm%cC#lYjp**MM;Xd;0jT+ng;zaBJP3|s`u6q9f3!uAQro8s(iQ#QTc4#Fh^?TEJ{ zg)tpzLi)%JF))tHs+VrHs??!;92qu~ad2m8Dvn7u*9ct&%aM=jTP5kOG=%IaxMg9l z3C~jJCa9_I5*Cg=5{C{Z&k8Z4!B)3gQ`ndY*4πdJP7aLYK#F>X`&&9c~Ta*R#$ zssuBHOzP+~dHfQH;+}zN+z*?*rj(yEpd(I56y3U4mW!4WF}ZK=GHRMwzMNCGU7s7j zEQ6X`G4Mcz(G(Mck#~3#=WXHplGPhHWL0@oI5Yp+5J6HU29inDdj2Ft7*C*sp9Y_P z@j1$Nb9@iSexP@m?Q!iRUR>V8$(}QNIQIdaV_z^5-Noo9<U;sL3)Vt76T)T-ZVTao z5S|F(4izNE@Mq2z#S}j?%mVa;Who*_E4&M<7^SC}qGy<)bu7_ytkO#edIgI%aE<Q_ zHQ3@hZt#hD<0fu#Epe1^8+W*xETbLJeq&TeZ-0L;AE$A*S#FLUB8+s6jqhS)>?>x} z%dFxQ2|4vZV@?&ckwiPaMkiInyaos0Yt6h-%!fA?kYlUyJ}u%Qza`j9`Q?GX1|(g* literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener1.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener1.class new file mode 100644 index 0000000000000000000000000000000000000000..deaa13cc9f92d99ce8824bac6ca0d62210ac88a5 GIT binary patch literal 1413 zcma)6TTc^F5dKcPbW2&F+!0VwL0Z7B1-uqfs6|U!eE@kdCgil7w2R9w?rwp<;+t<i zn+PUG@e+-f2QNRt|6z=Cwl&2B5+1s<=i50m-^@4DuYX?d0hqvoiU31;!>p7H%herD z#?Uuy$F^)^)!-$Euj{ksMwzeVZD*rAlw2vAZgNqWqUdEkv7R$rPguf9s!$lBYkZUI zCbvrZ-NG8Vs0cCi`zYV?bg?NcPv3u!A>@?}cj!FBSnkL)QVeSK+7Kl*h{vMGJ&`U` zX0gg}JeE5kXGUgE#g`eBw7n`KXhBp(D?{&L&Kla#&d^p8ezDcEdBGG^R4iW4AuFnX zOsVK(=#xRWb$834Zp;>3&*4RHuHt#NB{O$x=s_<-3&q|?o*@{EXCvr9pN4)6P@&|o zB(^<<&VMQW1}}OJMNWlrf`KI?7{qB6r~cER>Z0Kcs7)d9sKQN`p{v%MeKMuu_Zz`* zRzoAgjfi1XMVujiWI;5HVO)x0mrABc5~FMw2{IF5khE+vj0rMR46QlC5_c-=1>r1J zJK3JIi`-o1jv>!AP?7R7WR5-)hmR&r3nRt)>U!1ZusRdebyt`S1HQ|_qEVD)5~}zx z&o^o$L({Y^-V8$`c66RJfDr_7UBfhP_;N4H-p^@J5oU-i+7+iL<_$Sy(S56zkn=?S z%UDIzc1ilY@XGe8hFda>BAGB~S&No2ZF1KY)V|)sww0!ZQq!*i0YqhHAR3kG)89gX z@CcgdsnO{dor7f8#&*&C79DxAUCI+Y7~jRQ_T#%a`4}yu&oLa_!N^l&eE3`)R(v?& z!+ITV@ZlaGPWo_@3=$&v8D$G%lAZ}-0lXqsuZiUz2Ji+Wct_vfV+J3vfRDI`PvH0r z179#j-h)-PxPXgvBHp-!%T!Ak1zf>ZswPEf6O`W=QPI)e-9g7`T&tCvA%_4Vt)pW* z7#@9r8Tm3RIR$)9?NI3b8+GnG_3H<%@=rgnMgizrEpHHM|He&Z$SSl_^SDiK5%Q9L GS>P`rZDgzf literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener2.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener2.class new file mode 100644 index 0000000000000000000000000000000000000000..88635cec7878341965a8a58c639715b5e85587c0 GIT binary patch literal 1413 zcma)6+fEZv6kVqsI;9Ly%2hx`1!*aE<l?o6LM>WS^r6UuF(IezNjo^q;LH^G72kaG z*+ek$!T9W7_yb;|(Rhh*pJ`1ofrN+7nX_h}z1H4qpT7I^`VD|-EUO4GWVXy&#jsr6 z;j|d~w(Z!KZIlgOarmabU~X0U`ikvrRY#}ROQt(j5T+=3IZtfn4c8NvaHdr#4ABj~ z&2^Jo75#p3gF;k<7>0b5?|8b{7M7<UJjW37s)jpyks+Bswv04`T0b^Qqz36Ic-#}2 zDlv;P!^wF55YDV*PbbzGl#E>#5p*D`qLX3Zs9+6Uh%t0kgkNmEY+f`46%|i3Ib=o6 zk7*S>41+T1uI}y_)QyFr>p8sSE!I5Gwj^_(hJFk%bWrXC;u(VRL@t7E3~Cs{FcnGx zt76w<==n$KH@M(AlsO&7DF!wb!3fT(IP;$e^$-o`Ky3<%CpB)m484u!9Iz>!c-RVt z^BP(aZbcjuDiREdV;iC&iAiaSU8$I2niS>2NYOGK23gBy!jRxBLucNw#J$>PQ8=sh zPR8<fiJNQOG334hD$-tt?D1#f=+UHUVdU6g)34?n)@Opc?h2D(*bh0}G|JLWMwK3~ z@U4c(&>Y<sZ=N9)KfX>HzzBl4sbLPce7o0V?-w<w2s1<qcFie?B|{Eb^uX0i$$6sw zWv!BFyJY=}@TzuM!yTDMkxCe}oJE&0V{+FO)V_hEZYxa-QPZyl0YoJ;5RFRr>2D!G zcm!?q)M)pf_CZ=VlKW_Xi|!R#dzEK+G`Wuxv6K5a{S+M&FEJL}!}xP#efUBXR(v?+ z!+H~L@!@_Sp7P-~nIuH;3t|gmhMp->0em1;A4%mW4C6D#@rAy9#XP=Y8Q<{$Kfv)5 z27Y0dqDSg#aS4}cN4jwZSE-gTinxaBR85-DHYmR_uA;lIubZ}WxX~y#O925wIwz8Q z7@K&7dHJ#+H3fW4F({x|v@nKN7C;9J`n;M1(b?b)BIBR9jV!GSU8yD9rMC!0$+#Tw E7Y&4Cq5uE@ literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener3.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener3.class new file mode 100644 index 0000000000000000000000000000000000000000..0652ecc878ae7cb2aeb517f8ead1ebe1038e7a54 GIT binary patch literal 1413 zcma)6TTc^F5dNlJx}_{o?ua+!+EVBW#cL6TTC}9-1IU9hA*bb}U0il?cZ>cN-+c4g zL@@Ee`0T&%e;DJOZA~$egop0z`8sFjoB3w;$M3J-04!lsM}$x~vKuwa@l8*#vCL!F za~;>(w?xeohvu4nR2O?&u6I<QTHLGJ{^GW@Wi==T@~~|Afpnyo)1eWP2jW<mws30Z z^U49c=!g+6hp2cPnDSUUfqC{GAr{mvf9fV7Q@${bJV9?>o8qJv^VkkVAPaTQEcXdl zQ|15UEUN7J^e#awxcf4J9wc@25=PH+HqeKDLSIdW#Wu?p6<cyqsdPJss;K>EUdJF| zOa*;s`fn}n##+S>JW&nS8$sYYD)X>`5sVUgIQALxglH;VN?-tE1}@_Y7s?Jh@?Ag} z{F^dt@OI#F<a`|02(*~MI3{%5_(y}Li-AdSn_}`!L)boHsMVY^GUd}RJ3*K+(1~~_ zQkc_`CZsPch=B~|l_+klX3HEiD#ejyvlItQOSw3f*enxz%a$XbH4ZD%+i7;PzwB0p zy(>IRom-%$<Rug@J`?AUCQl2oVq<N++H=^P3GTWtZNin%<^Q5_lx`NP`g%(owMfQR zcw2&1LN;}Ao;-jFMDftT3Lb@W@2cLf8_*FaB(~j#SCt!<8nWb>)yt}R;{Fw#s_ptL z{gw>s?!JL1DvYL>5R8(;%UH05?@Mmq=y}`9)559w*MSI<Dl?EwD)srZ5MexlE`Az( z`pM@g+k?z0y1!#!i|vs10k7syajF06DXzaq&)jEBM^7;O5ycQ*Xv10vXG7R*!yO?! z62gli+@*rV82-fBqR8<x%Pc_S+?N|j(gd%=BxY$EIhw&LrLak9yr2vO&BLMvEc2c5 zCR^OXZ9Xw?+`(P0C5{U2;XYTBXS562FU;x~7#<$r;|d<M$}O@(gpuC4%n7FFzF<|o ztSL^BkW)W2=Cp(k%Au2%(L=Ywyaos0YpuLd6v7*iQDm#}N^RgNza`j9`IUe_lb2hc literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListenerBin.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListenerBin.class new file mode 100644 index 0000000000000000000000000000000000000000..a2b640f5936864c1bb3427eba7e093db823ff619 GIT binary patch literal 1351 zcma)6OHUI~6#h<In6?a1C<yWr6{H1ZKzyLBC}1&7iY`DFZpgIUw1dM8&fEe^A5k|x z*6wuW+C(sMVO;y0jPcxQ4VZwTN$;I|=G^mr=X~eP&)?s^1Gt1m4Ix5q%dVC!$2UBa zH_O;|J=bxqb;~S!=B6=cZ&l2-CD+@k3{9<-Y=3H5*rFu!QfwA1UkXQf^OmC_LP%_w z+ooZgPT9C$++ZgSjfCF7YVJrwYzs#khi?)ZWySJ`CJAGO6BEf0wA!^H2DO;UvNWYw zs4%ivC-kQZM_}d@dM3R}h%C74B90a$G_(@Bk8{@1hIT?*Sp@0U5;u#s;G|ON0}PeX z!OM(>4nmI#x@-757FT1g=u6Km$@!|3uA`7o>F7c?p@m}~B2NgX()l=&=+V)OK2DS! zR>ZC(bo_-33cM^mj+}{NfY6Y4r10Vx#5oOT|Iwl5rsF)gRE^?s)wF#=XT3m&q{^fp z#z45BBZg=UDU51J6VfLZMaLM%2{GxG%eLT_AW%Mv38weJv0Og37A!~Ht8NyBw^FNO zd%-Q4_NwVw>RdNQl(dAqC+~;<H7558v0gm~Y8`Z8ts}VRzOV^>fy>d7ag=73sq|>c z+^W-T%<{CzS;9o><V?B!;s_(7V+Pqk>{V6uSsfapg!r;s^-5yVQZ1G^G<p-No4A5G zr)0Z63%?{}#a-92pu$8H6M~+1co-LK)At1zu;=(`<xXL6{x=|mgu(_A38g%L7(#51 zqls6YPapXl<~=*MkLDjpF7e(O`GAS>eVlIZ-^ZEvXc_&2;qV?tKA|fxUkuDm${b<y zXTBeX!Rr8Hfu3-#Pm!Q!+~ChKLN72)FOi{Fm}H;98Xl(j6QzDxOye@MiSl{{SDDW> zw#E?pg%J(OBp+sQy-qjBuS0BU9Ua@l@aR|EP!Bg1gHXVr9T8^m8V&RYF?x#@dKaMT e9DuLYQNy?u+_;T7-XlB?^SHxLarRPvIp7b4_g5YO literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListenerTb.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListenerTb.class new file mode 100644 index 0000000000000000000000000000000000000000..49e46e1d837b857cceb2c0fa44e186e2c7090bff GIT binary patch literal 1373 zcma)6TTc@~6#k~IY+DzpAYKp@6|n_mMe$m1$VEwtCYJEvi<!0)y14At-6^8Kz)RE@ zFX7EMpN$a{AB@lbCS&||TSHBd@US~`&YW|;bIx~We*XUU9l&YaG7uA(syX#V+YKyV za<Q!y&-Yx<uGn(Xm&?|KQ>)7RbDm$T4vgI|JHc2{IjXE@wOTINfmW{a=Sv0>0+}Vb zA}vR{i`Jde5^W5$2^@^H@{zXGigLBp>L}2rt9CGON?^FK?L6`VM#F7@pf(dJYN^#^ zmB^|h(3dT2f;k<c=W`1JiAk@b(%6NJfewNF|1&nR8=V5X7gbbkqi$Jp6pPB{HZa19 zHV*R!_6YQZL07Hdk<D&QlmhL`vc6H*+H*tXy(acyzrZfWZb@Dsp3Tjs(S;rp2hqzy zX)v!=wZNXgkWqt++Gpf^5{KBsyRu@}gEaba)WDH{h-lcEI0p8rO+BnjClKgvcBqA` zeC}QfgUA{<A<(}y7gO^lau{MK_2U}5A!d^pp;WY=Q0geyuDV@cE^#m#-RdlOW$7$P z-wx%bG7(ZJFtdH$x0pYUgdlX!1}PiE)*zm(4U{9$8<}j*45PG@jq-yzS!-t5cA0lV zUlkb5Za+~@SqcIdO{9=aBaXa@bGRI_8=YJ=VIV1xE_!vptY++RrZO#8Z8RJowsP7n zJ6=Gh=ajB`6$6t3xvj}*iDF_pL`{Sx2$-`j@9Lx@gFvzI2mX7RIY&&D-wwo(2{Q#U znXnc<8!_tB*vY?1X^nE6>-g|G+JB&Hj%#<~0|rOdaiFtr9f#MDPJG7kkLZe2Jg3Tt zQ}u~{ah&A;5HWzKjQ@;y&(Vt)9N3qz@Cs+}8lybzZ{SdOiV_hq#wSeBXM{H6%;PMz zDa3x^n1QYi3g>XXndUT)W7KpE4S&Ifp|7|UZmxtG#G(v3k>LIfD}Kuu?|4JsN2n$P c(5;CY$F<1gIwrU#a064A;Vw<9(C#Mi2L~))00000 literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$2.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$2.class new file mode 100644 index 0000000000000000000000000000000000000000..290a6c10e0e677067683678d65b90c01248bd3d5 GIT binary patch literal 1532 zcmb7E%Tg0T6g?dxLxuq&0*WZ21_>YxM)4IyF$4vJT0)^!F03Z$N*X6KshJ6nAK-s1 z5vyGI0e*!G7cSI=3s;uq?U@LaB?K2Uw_o?%bMHOfAAY@i4<LmH8X^qC6{}j5wr9GW zj5Jpr*RdU0ki6*fvN>f{O8mvV<5o(El!hone1)%a)8cl~e6+kG^1g;fhEu^RU-M0| zDs11JcdDMqNzWIya2Xo?lJpW|6fSq@cxeVLbW0Gx1d;P68Ag-;fiSql5Y0FR5d%Z3 zff$-}G$3w3$5Doc<lvIpIc7jZ6GK~0+Tvlgye!;BzHAAG_MDUF))IH6n%5SiiWS4i z;fW+tl#EeUHF@j`&l3fP-em4yHOs2<r4?~KI3JXgq33|Zf1op#%)eC7ErI6~VF^y5 zbezFi4SfvV`vx>{4(F*>Md3dS>M|QcKL#{hU>H1f#|$JfNWJnbSx{Z?3`nn=-kKz} z%q;}VX&u8D(QuLKuK4`5ZD3R}X(A?1Wx+4SFa{FdC5FC(c}y=FxQr_#8mGeZ(%)cU zGb)R#2Cm^cC0CGMg(3O8PT!{Kn8i2J%J-&$G$xdOonlc5g3aof#2pQ{8T#uG3ULff zDXnR)sBmff43RS7gks3rzHn8?nuCsI*QKv!`hrt+^I}G-i19sFa8wnHbegsEmg7-T z=Y?N#3I=9Xh^V?E1U+lhoy%C9bmpOt^xZ(;5kwGIG6&*ubrI+dXrxa^Gwm8QnxYdC zvTZ}dZ_qOIHXO9SqNNBr=-)~}U>^}<Kha9IlhzD!CKq(!I9Y}h=&r$y(_F!^U4TY) zn0*QyyTZ+yqjEio9{ST$QXk@T9f;FA5P1rtSPTqrqjz&?3oTnnY-4ECeho96j)&$( zY8$t9xrWJpK?nOvm*Cr;fCD?62XME>IkOXR-?YE)fnYljyJ=6?hxl<IL<6!x$!Bnn RY?Rb{A9FO)gR0U1_zh$mPwxN# literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$20.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$20.class new file mode 100644 index 0000000000000000000000000000000000000000..a445b9734bcadd123f3b03d5cc59c122bf2c380b GIT binary patch literal 1578 zcmb7E+foxj5IvKPEQA3fC|&?T1xW(35CktlG~6^AE(-GEgEb^;varmib~jl3hfjWh zJX?imS&F4T=`UHO_GI$_RTRNgZF;7+`^-5#-TUj$r+olPJk=3m7%bW4f+an}6=W=9 z%W)m)Sb0knT(N1S?NU*^n0MS#u{SxaBg_z87hA%xg)A70YwKpt*HOpNRq={fzF}^e z(l^pM-*RNu@_bX8E<>GPw7lM7hJoyfPfRiBL0T^XOb|VPl3^(J9|-YPhVZnLHygmv z%+Y}Q2sA`FA~?;U#p0{#O&f=fdWM#)CC!EM=9=lQh&9_}Xw5n~VXq3;Qv0eitXL6~ zlM|uhk(w4!smhY+zI5D8GtbZ+%N|*{SyjZ8BG-W~9i0sE6PJzS61qut-ttNevF9~d z&QO>wwo~e;%N$p5Ro#|TC@A?X6G0#PbzEcUJDx!mha-kKRn{#_;t<OO8U{E96|f!v zk1Et54nu{8i<Y{d4vcVWOA2ZTf~G8~yf-+;FwPLl`wU|>)tI&@OR>E|7bXj3TlkJ! zk#>vY_5lVX3OdCxaln_1U=sIr++#@A(0arv9BE8ZljR)g`EEJqXQZz>f1_5v&Kv=j zsc<-}K&fEkY2!$h7*8bwv{2OJMo+v~1b5|*TTGP>i=<64lRY1tRKjd@Y3Hh*N< zDZ4py&QkpmJ@A1TQk_gqJ}Yy!<5{vWZ~8?i&#|P=46E^F;2BBZgK1lMp6Q{7W>2H% z6herq5d@-9HKg=~3egimBfaIcO4D9>S`q{A(UkZQELz`H0?*KYGXX*Shz9K^n#rCe zAE#tWK|9WoWjK!uRk*(hSKxLMyJ*_Q#lZ9=wLSD6awU?{#ywmQe8X=r9;`+KlSm%g z-aNd$lib7I9aLjaoH89?RyidIWKPM{pk!X6Dna{<Hth@gwSA0eUy;|o;kEW1Z?zv4 u+3kU}s%&5f89XB4k14+nq2I_GgqEdU2=iDV8>V4c#1mRYC{7iPe*XaK)1CML literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$21.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$21.class new file mode 100644 index 0000000000000000000000000000000000000000..6a74d34b4e94733a28b6ee1f1b5f53c0f7db6dd7 GIT binary patch literal 1017 zcmb7DO>fgc6r7Ds-557<ODSJ1Es!=&QsOqiDF`VlMXHn*Bv39K&?Z@&tsHM;JE{0t zNTo;|_yHU^04IJ7;%$-xs!$1*)^GiGcV^za^_O3tJ_D%Xk%bJy_8=SvGD`fIQ;_~h z#VS&=D|ry}zTXH3J^toU#e-g<wrjy;aF6+j`yr14|9SgZbW#g*3~S>oKS_Nt5>e_m zI;m7qQzog1M9eUk_GD7nVW>1`W~?(<lVb$}cuexrCk$2ZKM+bS26In!MHUP>2U*P9 zFyK0{vB+R}rIuc~;=sZ@L%t~^aWw3=Mf{4lL&31rR2?3+cr5kzG-+y8q-1s>WFA$M z=VMo1i1@9F`=ZOR?lu2v+`cxkuEpKLnuS${(#*CwxQ%rxyDO6cgZKI$DxcD}kiV;I zsyhzu;-2o73Ibg|JFu~dqJ=Gn&5IRGaU6Ik5qomNiQV)LN-Yghaj>l&w_-8iGD-=W z;8!oIp22>phH*zclUj=V$6c&y)5y>Ls1vG0M!}&-d#dZ;f#xvvO<`~jBD#8eAx{#K zV1wFh(71#QT-|NJb@hFqpCLoT#${S{Xx5-_oynIgAFxpVIGHTHA8%ZycaDHyd_~sy zi5$hNlym4X9l;8&QDnG|8&kN>6s}l4#lk6WPQpgbT|7hKT<#3z^EBVEY<$O-@ncN0 jGFDcc(f~!=N0o>S_(Yq*4t6P;)XEwj(#)ncEsUPu7RLEu literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$22.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$22.class new file mode 100644 index 0000000000000000000000000000000000000000..8fcf286fb316d7291f5fefb44851e24540f5f4c7 GIT binary patch literal 1693 zcmb7E-*XdH6#i~<VcX@l4Fw96)&jPgw6&o{>yPlm&;*U9r3yv`6>pMDvURhY+1-{h z{t^BSzWd?~gc%=r;L#c1^`CJ(C$}_A$C0`-yXTzm-gEAEzdiT<{`YUs0IVQ%kP=wz z`r9opi1U#q<K=h4C=5cc>FHLaJNcsDZR`8%VbpEUuB<qa0+}tnqw~HFTKQY`Ez?LG z92J=EqxxZzH#;Us^2J8tg+bMe6BC$7;AqnJ;@L|A3)MrfSP*b*+AI~gLiCbr0!!Kd zQ6X0okZWPn3`1a4VHiU$(#R;dI4+RR=4w20Lczh1z*yA_%*J-7ZlXK7?i+#eYS_?z zO-CNbd!S@i#N_ZqNIcrjnC`2xX`%;V)G<wgnQZl6g)6g&g<Q?WIZQj46387|Hig%C zZ$}~%n`D>@oL9JjizGzTi@O5Zd#~VKqG`T<RN&lMg*m*z|1WH{SP)Thk;S}&oWR_F zbK0w;uz*E@p+29Y?-P;iUEW$2OA2}BdaU6a9c_kQki?8HD{4^6Q6^y7i_NANw3yD@ z3hywTbQCl>eplf=yiXN7Ua(8#N(>ehuDk#rF>p=cx&`#^E(1k{8!v$VjFLhbH>r*v zYWgj?S4p&CyjHs&Mg?a3u|fr(2)LYVHzBZ`t(53FbRjE9Rbd?)#3OEp4_T;+#Wxi` zW1*bLbTz5Oo4BoT2VV%J>dOMh2Yqy7J4wQTn0<+_9ehP?x8GuRNZ~Gv>r#7^`}+2! z{6^thTkbMfzpwDU4Ocm=D>Q6a=FliSuwjW*r?!|HtpD-_VEdTXx*cvu4Rh1u7RtPI zt1K}$qF4?Zei+kVUN=cQY$|kkyOPg5wLvAIOJvR0acp9orvsa&_XtwR@VNyt89v!` zt)=L7ag0V4c}0pD8Jk~tf|2>B)*1h`Kk+1eN2w6xD2C-6M#-KcOi?nWU;?Mf3Y@`N zTTWc1!d&jJ`NtUPVUo>b%vkgKitORd15gid9YAQ(r2~)+FI%%}%?H+8wdO->)_VBJ zdi!f;+#WtXfc0?8BA?S@HS69>@4Md(Ts?4`><)xk#Rv&A4o9BAq&$g5c?#F%1b&pK z@sm7*pXFKnA}8@wp2KrFg+Jsp{**I)0Vk|TdjgVNXrWCKrs0uzDQw{fvXZ*UM?juS JV=Os6{{TMZl&t^& literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$23.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$23.class new file mode 100644 index 0000000000000000000000000000000000000000..07e6f0fab069306afc9e0d61aa30ffb4388da980 GIT binary patch literal 1970 zcmb7FZBrXn6n-u&ELoSAVoM8c1(agKTafxnDwXo0sR>Z2QChWLl1s9%*-dvhLB<)s z*1uz?21jQ6=m&pP$LA)o1<EL9W^*_9p8K40p7WfOzn=g82Y@;3n`jf5s<_pn<AupU za&eM1Kkz-@DLAqi$Z~Sgt(4@WtRGZLV{<o67y^B}vL=(R^oq&#?Om0ROmqrdZ|utb zD5+}7i;|1^$nm|56GqBYfk0<ea>B7$fyvCdJ*EWA=Cv^b++ujqg1}7te;_1s0>+YG zP%#Mf*odLaLOc3wShyh29#7=-$?G;ubP4ok98axP%iAirFSlJK(4X=1(#^@h(Z5@p zhK`DnoIenf$836KgOv>x?D#=h6$FOknKOx7(Ilo4ITKeIgEsjg8SXpe{O&62qPlRM ziLE-WvM_{Uoz95Br50MFIGa&G`v%6F%<zR9eQDW|u3zi|dF{DZRqn`+lP@_c7`bg> z6yqB1ZGrJ)!8N?5n!z52PbYHvO2WnjCIzfeML8#Q8r&K22hG!I8#73<nne|9_W~E= ziC3{qydz*Y0(JbPHZ*Zl;BsT<nA1B|$1SKp`+d*G`x@CM^0E_9jec-o;X}-u_~?XI zn{?Pn;T8j_Nw=!jcV6arOwXw^LbKQ~!!gX_wvA7)C=d%(MFx`Yv_?)xn9}x3HkPqM z<;qG$c`WwyS><`<ZY#S6#HThs)9H0ZelvcHAux{5ku{Mynco3ht!!fr>(sShjVOmE zHo4rO6e1!hSx$A~9{CDojp|_CT{U816JMIR|Bp&eUa*nV+A=E|!}VhL8V^it2_(+l z$TlA08|t;-gcX7K!~f`;WtzG2Af;V>XX6pR*Ym?K7PWFj+QK#pCh`I|{yl;gjtvD? z+S(7CNTtiNNR$h$QnYl&E+I1auQe$<J;$2uDA2K^n~(Bsn4N4%_IKM3tK4E;L%eJ? z9@?RDsZUi%vrZ&KQ_uE$Q6p_kv+m7E=J&F)(wa5are6*6N}sac$L8^j79D5GikEl& zkj2cZsN@%HRP|&t^t7bYw8!zg<jOEqAx1dr+WB;#4Sjmz0eyXXCh`xVjgN)bcxv-) zk-zm$@5JP<=$<%izV!dnFucg`9s<EAB4+%E9<G<TXY(?zU;vl73S7Zp6HZ*A%TDh7 ze1xH`{%ePLBYT9=t*QREj6>X5n>Ol*PuDRuZwwlLqHu)Sts~5BaqHdR@WCNIeu{-U z?r0M(b*vsDJ>T&ZcePdj1`V_+k51dw@x{b5bU(va&E?y<!Hznl&Z8YVk8!3CV-J?$ zV!$Zls^MYO@G)*YM%D-r8X=w-)kb~`%^X_!F&h+7Vuluef`eTWHh=(oaEU$2vodKk tki|Sa_++3$e?1V-@x;WCiBXetsvVEH+s1n#SA&X=P~)3LT+Jpwe*^jF`bq!* literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$3.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$3.class new file mode 100644 index 0000000000000000000000000000000000000000..50b4b8ddf4989d5560f1507b4b53692ccbb40939 GIT binary patch literal 1542 zcmb7ET~pIQ6g`_3(#Ak56!BZof^8A%Cw_n+0#&pH6|Ccvv$RWzrb#E=qW{3Z;Dhfz zqlk>o_yZh&lX^Gl&^joiok@4Id+*t^=boEyKR$m2a1l>*XbdAYyHT;6de-AKSlJEN za~;<zTfE}&YIer1t@CFE*Q>23FX;#~#GmsGp0&AC$u6xv7bU5qli`HF%3sQ?*bt7) z&XlC(I(e%ug(EzMPPuN?ljrHY{68N!!Jr3eNdlN8c5;egEcG7<=^{gT)-8)D7`jbF z5it-#+=PLH453uIsCIfy=!h`H@|GhO8`V|et?*S_F!bcz61R)ov($TYF|1fIjQ%^3 z<R!XHjQgTI5Z;>WRYjTMR4V^R-R6~s6X~LXV>qGXIK$Du$C)^ZQ&g9Vkb&y6ZnerC zf={H<0lr_YW$9T?Wx~K9&geKzd|H*v*)EqRk{BY*H@MvpOKS{6O?vI=?TCJs4|vu@ z3TcLj<;bE+_qAP!Vg#c)&M^$^U-h{a6Jy9ymM2JAHW$SOkl!vcr1#HkGpLEnxWb@G zvRR@f?233LbC$5n6FROk^tWyuC~~`D*=6AwxDJZA@tebg2qnxULtkpH{r0<hj$=ys zX<9|>)mv3@95W_vt13mL8{`?7Lr%v$S!}noyG%{oQE+-)NVTS8fxOb<9XK>cCgO7b zRY}xTuaRn``tjDi+Z!=36ortuJ$pHl?#>!z54LUn@ep!x*RtfL7X@BxHiNP3HoTI^ zS*l&)ZRHqKgvn*|PRVxbWW9or>u%Y^W7T?L)y@p&f<xbjS)14EqK*OT#SlFm&=6NG z3B=>7Y3YNd(PQ8M?V2>3p?9?s%Zz+PSLRbN>DlxH6ZGFrK<fJz)%wv*V;`-VluRi& zgnk+s4&z7@?mHbBrnTvjZ5%C}+rhv#hF^a`<{cu7F&f_^6MOR(x|(OU(6xp0UoifZ zmUnRN6K-zf);4B039f^f_u?)cuV@StduSc#&?1OyQS@pC5}Jv_S~mu?7?N5XQ`$kF zUM8T>q(@|M5BGh<8_1(T_f1g5B9;jI0b%ze^plPX>0mmJ>EvG;?}iW1_Cwm%@CeH^ RhN+cSP^6hbU`he{{Q_?QdSd_p literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$4.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$4.class new file mode 100644 index 0000000000000000000000000000000000000000..52225bd77375589e5513ea169ceddcb1a6bd2ddf GIT binary patch literal 1527 zcmb7EYflqF6g{&oEL|6<fK-u}TBQ%9D)m`>AX2Tipny&MWQKMqi`(61J4JtwU;J!> zNHp;W_$T})>Yd$&)`$tVX=nD%+%xB%Id{MR{PGRJHN4cJF{B%It7bXPjK^uPGP|zl zI<8f<c+KPW%%a`c=C4bx*Vv9{b%YtBJA9XCZ0^)DtD8HbB6ajKO!!g$R%XPmaAan& zA}!Y`T1_b&;W6~eZL1l-Lgy8aePE7357OcUut4nOJ%+i&e;_2w4B;iWDk5MQFcCqY zfe@l544h;LC6Z;eGHgOeAH!hLa>PojzA3y7zG(}Fp`u&icA0yYdTs~9iWS4<;}eNz zshC0Ti}GA}Tdr3ZRfefV@krg4m4>-w*}z#$=on`h`}aN*lbE7=sR<dVzU0>H+#&dp zL^8nlZ);t8mQ%|aIEM>5&NH0s++@L#q9!~Oaa<(Tce&jXt6K~+ZGznZ-I(n>A9Th< z0!fBG%aLUT;Okq6AdSm9W*L&lzIhXK$WXecs$f3ERg)|`&!EYxR9Hv04e?IqEn!!4 zI<7OsIyD9LK5SWbRd@z&;<k=kfA}}pp^Co4a4J#guIx~)EEbeo?y4PstEuiNi~A-X zs5|JBZjfi-As*>iA_E;>+#ypF%L-0!3aMf`9+ML~yaWH`$s$}XzpIFb>LikZ^c?Th z-Q8w^U1$rLa_Dc4B&4%N+2^{Jjy!}s+P^M&<xPn<+EzE#-IiAoc}q1zwCim!rwEg$ zmz|33Hpy5eA-CPCiFMUjVb!b*X2GHEU$S|#DVmt3P7Bem2O6TP;ecpVwIsccH2N7h zL8~Us7U@|<22<%z=udqPCPN?njU)6wKtRyO5z($;fW}i4Gbx!;Fp3zB45x9X4fg|K z`T}d|eT<b-d+47%!1O*YeM0I3`d3sWI!O;|vWHafdz?_y-owz9ugJb?uO8sWXXN&A zZy$>v>4Y8()0uf<q?lczf}l;KN4tPwEsjy`B4XMMrnMx}S_<=88ZWe2pK&T+)n-im z@B{@Pv4p31MiRsbt%wp~uMl<&p<lE)q=V@=tCOW^%twZ3d6kwmJjV+f!_;wW*r1s~ JU`iDF{04c$bbSB- literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$5.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$5.class new file mode 100644 index 0000000000000000000000000000000000000000..04b24d48c4b08d60dd9a55ad3e2a500a7bd9d35e GIT binary patch literal 1570 zcmb7EU31e$6g?|D-dIs$*9i^ZNvKI}2Vy3a5-^Z2+kDhc(k6AwQ)gpu98p>FNb8jT z6CQZynXkaW3_qYV{Xczbdsp%#W}pn!jJ&Jez2}}i_gw$+_nUVB7I2@#V3_MVy|(QJ zMPJZh7xz8ib3MCdi?%O1#TBQ!Cw{4Wes?c>g(J?8ejxTm(GhODxUus<HWf#L;Y_$H zep5xcFI`n!X)4=uYj&WdD}9E9+Ovb~CCXR(?1Uu-9))EI;0Cc%w;1Mg{{tc4V2H1I zEtv$vn1v*UO~jD4VB!mgST5htJL48Oh8a>d+m-9R&W`lA#f~ExGBvL$oQCji{oP-T zYgP;wKc7hU3SA~8LQyuQzw7xO*<zT=)jq0QMQd2fH%y$u8IIEoC;$7Lg|nEVy0oQ= zRA2Kt9pMuEL@poUht=9rzU{V4CT8#z$GP_^S@wE#JquZ!C(-wX(~}#!46}WHgYkoq zQCJB1wS^q=3?r=&s-Yo5fy+tE;UdQchUrh2zPxQ=9z`P7l5SwD-!}zWP%7;oR!%Ja zMYg3UiOV1>e#4OeG~R%BEqsfs42D`DRgN^@mJe0cmQJh0agAZ}$l8%ut3BIkN#8^X zH#u&+Cs}ktOGc(VmMahHawzp8mbKMZ^ob8kp$oi-H49~3z+vS@aVDy`!*QG3cUbj9 zrWWpMI37r)*Eqf-8y)eE%v&XY2~~O6lwIA1Bp=n{^wGTsdo=PI9U(_&KIBL>bayFw zW?<{1Nyy-%TS_#4t&48IPs}Z^=Qm~5)}53dD95}eObt<Sn~oQdE9+A2c`XY+>8_0H zPG_+0y7bqv=7=DW0j8-<WAqNeKw5VzkWTA<CPx_bni!#7i)JhItyfZoxtAC%yox57 zr{Tc~`W+)67*~-r>KLQ(7_C_pOd<FZlQc3M$B91NpOi9AYs+&7I9b2&8q)`ueU8Et znCla`M6+ioj6He`o}zi-1x8<B;Vl;L)ADOve}$z3tRA59l<<ZqLk9OKzveMZ^kI}R zWZXi^SVG2F#<;PH6Gj;`Mg`}MDwd4fA-_Vzq0f)lpoV&gSi(9s=)&VjU=!aH_78+T qiP%4sD#pP$PH{3YjrS5Gw7o^!2Db4djdALw27acQNnlz6dj18%YK5Hu literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$6.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$6.class new file mode 100644 index 0000000000000000000000000000000000000000..32740095bae204d92995a492a4972897b38c278a GIT binary patch literal 1917 zcmb7EZF3V<6n^f_%Qj)##u%U?wFPTQTH0X2`Vy>tNz02#i%kpyLb*w9lWjM<akB~a z8$ZKw9R28L99lX$1K<5Me%En4cQ=qSMXWosd+$Aa&U4Ov&dcwA|N0cb4B8qv!(`KJ z*9@zbb_6X(x??-GWgAsP)Ev=BFPP1`*vQ*XvpzPfA;=Kh5*?8?g;h(hmA7QY)evSF z_N3y0o0c7Ex#@+9YuHxKXt~mo4nx?j8?CVm<S%z*hZzRVHya~>%M_hE$1t7z9|)-u zLvYEi$_N++bVSe>MF24!QM|zrNTy2a&zm|l^f3(P3`?%I8)fMfMcI@L@tj=|W=S}P zI(LOZ6&1tO(E}NqrOONokCYqI*|eR8tTK!wbFbuWS#g+2m7;hX!x~OAoceb?9q(X- z@=}wo&-#+xXb6ko6Umg1?`5mtI)+utgrEIE>8B@xck!ME;x={Ul;{}8Iff8rU$Mio zQKT@bVdAB_$l7fpOUHRkQ3^Z4Y|FJxhVkxg4@Pq^K;JB*Ak#W7;C+T;RS&A9AiQ*C zBe;kUG+bgBeSOr~qK;X7NEjXIxN>K~4|)7Ql2-DRGZB1@jD}Ab#$NBn*Vl1b@xpeL z-JFikywkVg`OZU+>+pQ!%%8>V)KGZdJA>-)3a)9mN@dw=sJw9NI<Dh$x@*Oz5(_4? zDdPAF@;X*Mam%n&;%?~p0_zOiy-0cPRZ&syxGRP<s}y{Z;bafnPyb@uFsssuqJ*zB z+<Yl*zJ^NMEr#Rd`Ec<>QNSJ5JYOq~!~a#u7I06;hAPQE*Y+`^5U6M<Q$M|^;}?<Y zs46(EC0!-cK&3L$i`#F<73vt_F7H%iQw<iPn(E<n@7@Qej^90`LIlPS$4C|7mG8Qs zAxB67Ym>0f98i3vOKRZ$f-5T9dC~07foQ>QI~BQNs9uO27?sm1d}{b*t76)ev07fb zb-SvgrKV0$O)>`knnj~=$rP=YY+;nfP=MYLIAUrV0kN2xS5z;Y-YAaIU!8UfbXJnV ziOF5`PdxEA@kgFwg1!R;1ip?4cQ8Qfagym|OeQ#ile97n;VmDIT_u+xlKnKfhg129 z$LLRBbQfpU?)*NIdzkK?9^>r5cRyh07tDAnA3fiE`ZJajm{%60Q%hiRJAo{{^Y(Sp zN$q207fPFUxm}R@iPh(}JrLh~?Kc!|b&>Y*<rCcA!`(gHe?;L9VhasOx}Lh`BJl)X zLWtkQAis@aeg`Rj7c=}GGJFGbT%g3uxX&xt;t~zM35(b9fE#$oxA7x4J!&rb*Y8q8 zM4*N`c?;ot803*tuOzUIbL7`T945t}c0fM@e_>8T$<iR>B(zD$(Zn~j2B}LOxU`EB Jm|~xve*lDS;#&X! literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$7.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$7.class new file mode 100644 index 0000000000000000000000000000000000000000..58c9608b78359c4c42220f28c8b4b24795efe6d1 GIT binary patch literal 1592 zcmb7EZF3V<6n^e)+S@FfHm1cQudM`3Qs^>>qAf3$rqycFqODQ%gL9kQrdv0=naxdM z#u;!NUO({>bsWF)8N`A*qu==*{tocm-Ao$?WN<T^`*zNA&V9~v_VJV7{{(OxUkY%B z@ut_VyMD_FB@M2#5rlysxHVVSL)mbqz2=(ysvLyPwd_fO1VegVZb-+Ie%)DISyxpp z(8sVZ+Lafzqc)VUo$0D}1Ha_9wDMKR(5KhjR`wXhE4_5UDFzX{WeMOEWv9<DOyvFt zLcYR~m<ehs35Ee1N%ULjLE46eR~UM7`HDFivLVpVFj#VZwa{*?sBl@Xc#0uY3aZkp z$j~+G&St`7#c=fH6Um;W%M8khl=CWF4Z?=1F&xO1p3B>;;czNnv9JgG1okrQ{%<=Q z`*DEkQdc@=eI{r$q)+g}xqOTtRclFyu3w+BFouHyum7u(#h^{svysIiB7H-8ZMC?{ zaJZ9Sw|_Te>=r@3VIzk;!;V@6RWT3|!NnxTaa7<4!|01kUtG2^0f%b6?rLpR!-{=p zfBV5aKlc6AnI!QRNQrMV<X;TeC0!fu;9Ul;PY@~FlrO7Gdd^i|ZAyUZGqSDhn5%Pb z*Q=?}!fBipAnkQ&KejN8y~nUKSL~)`i|I+6GfJB=7SC3~)OQlIHs(zI`gIWdS@-}S z3e1!Ewu-)$sf~{eoM<U+_5{kLqV2q6?aq<Bq@KN0RZY`{#3Pkr@AkdBTQrs$nUJ6} z&*n%a^jFDytn28xL5RQ9l9tu4%d**N6Kg4GhgCJ_nnp@@m1DvrO#LwHSG}M`qAV-D z7SwE9Fin{-jm}`t`}F0Q@nox|S{S7+?V-099BI?6Kss&OnLcHlUJE<u)TY@qt<BD0 zVf<I53J>E+=3ZntO#cG}1bz`oej5Wc?xa1NoXG{RVuVJ9U3jen_cw)1(B8uMCU%#P zJi_QE4*!C}UGy&u(0Ct(VH~^jGsM>F`1e1>tHJ}M9^k|un7lw{k8tWCrZ-XC#QXOM zy_e!;P@-&1Rugmq@Ndw|FJq8jL56>eA^sgk_*IPYYdFNO!{ImZCclX?zZGR&h%@VC zO*ztUF+!fld3;PX43WhrSfUuq6k`_>Pbp-N02A0FNY*r#5~&oOe@f>Z6?{fxf?Diz Nd_gmd&<r#5`~xqml7s*N literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$8.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$8.class new file mode 100644 index 0000000000000000000000000000000000000000..b45ff48a146937ea1d15d5a4c411989488bc3863 GIT binary patch literal 1602 zcmb7EU2hXd6g@L>yz#QJ-P9BcgwGUghr~3BN{IQ$hm%5TJG4pN&^}ZXd*UptcdXrY zKs?a?h(1sW5Uo&o>H|^;2&Ddi{)7G&s;YOqR_qEY1xw?Zy>sWxz2}}gfBy684*(PR z&H!f^Z91*G?fN-S&}8Sfl&4%}*KASuL?burG&jZfCFM0YN2Ux!7?L-|mdH86t>>24 zZ^~+5Aj&Y@wu;+9PHssz$jw#*Te(Hs52PzShG?*9`y=P*zT%!Q%rh9_u@M5eNYMqC z8OGD^fsm;%MCMgZ#=sD_5W|3pJ|r!e_<*4=ovG-Z4=orNU`P~gSC(6ib?L2&bw@G` z6;)L@72(<XyJL*#s2Ilf9>~ZPC6f?sQm#vHLwOBZV>p&BzLU2F&0#)MF>x5f297Ws z`hPzQM{$hmQkOx<`n+m1giG+LbSA`aS8FBkY`30|Uis_9o7KYD!5B{A69dF;X3r(D za2jW*EVAj_j&d1T!9)h52D1NAMnScRE(>QdM&4V(Y02dchSQyVd*kU1F+7&nkU0zI z@F~N-S{tgOA=(8iL}y}Q0@0a`A4$oes-D7m3sbnjz=J7Dyi4n<yb~<i(y8SQPz?@r z)f@6L*Rq|O^h{jB6$7NN9({)%I*S>G{pmt)s2w&<Ok+-~X<mE0&9<)LG!`r@>KY9M zDm-W6DwYgfBZ2J}b~jQBUuZbPmw~n!D3MaSafkX`BngRN;Z9XHb*E7!h@K<eynEX) zloPp-Xoud8k!W={==6!6t#@8R{0*)IqI#<&nw?fKS5(WZ%0*i@OS0#+7}o)l<`>+m zqkIxxNd}v$X5ofzyohdQ2J4zjufx0}d|&!FPMz3CqaPee-H<>ssauvx%xRd|N4plS zX6aj764}w`7|gy17emk5jw$+&6A<`Mi1FVMr+GiwEILd_@DUEs%y1ANhj7fK%OYg^ zVRQ$FO4)4;rf~c@PU_X!mq_nmyz{k<lkxix5Z60#vOUEaz0`xYQkb}v!lY_%#LL>+ z1=_}EuQ7dN*L9LyC)7(^e1X{=6n60WGYThxC6rL4@O2vFlri{y^z)yQ;14j&A0opa zVUj<_68{Ay{wvD-3D)>;xW}Ki)69mcbkd}xP{uML_v0?E<4fYLOiX@-6}n@U?ifVh i-<ULTY0W@UKaO9Mk)widXpT^4t>If*nFOKvqu;;L@sPX# literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$9.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$9.class new file mode 100644 index 0000000000000000000000000000000000000000..19f6b2deb0ee9bd7278fb8f87f8918651bc976f1 GIT binary patch literal 1530 zcmb7E*>Vy=6g@o<hm4biY~mglR3I@#jVo?R42nWf6RGma>OhA~9A>DYiGGalK5Heo zmFtt`Klm%^?HMXysZ|jQy61NH>2uFLcfS32`vJgdJkX&rjMwdE)p8nXkJDhK*Imzb zT&rU7s>f^T8N0s99~E4$z8b%%Bg_z8<Lf+abEldvF0YBQ)Uku%fFI>gWLm5XN2X`W z(sG@=)sVsw9>Wf~YBl0hbYFhk7iJjr;8>ghE)zR>m0>dR9|*}3LwL@uh+Z)Co9IQv zKnPJ21_l{IiDXHw44cpqVHn6;j#y~cmW8*(mu<l?ly}SAE^*IN&+TAXv0^y6eIoIT zl*|D4MY$`y71yhY3d2|;|5x4Sm4=yQ$-q7w(6OIk@4xq%IEXQ-OI64~^*Ogz;|{@( zB$5HXU#&&ySxz-$;4qHrIKnX4sbtQPqAENSaU3Jn*SXyk#TAAVZGznZ-I(ojKIjP( z2_zXJmLp3Fz}Gj|i*cOPF~N}BcI8b>B2AU^xbv8S`5326^6VMqq@q{x2z;cY-I91J zvzD+c869UCVx7c-q-UF!T@jvv^B@yn_|3$@4wd;OhS5Z>JH0K*rg2$W=8D?!r=+S- z)3|2hx++9Oy1_XEv$&ySj$E`=y)C9D<`taY5K_f-+$1}6cn2oTl25pte_9rG)lMV@ z<-Na?cXzJ^o}n$|%%MLyQZbwrI(@in>93cNQTrApFF!8udfV^DqTBS!B5SFRh<3da zCKX{a_PkTJ-3Ga<AmplBF|nw+E37(}!OS`I3YfEbqahkNMC}%$Uk@}yRo4O0sOn34 zCu#IEu#;9zn$6I&iVUR2H_?}R6-<U+_!~#)zn_4hy+p6}75y}hQp}{obOgH)qmf}Z z_O#)?BTQf5?syA(3#kqCO}xgT7LIQs^&IAciiBvc#to#NVdw9Wsdt!u*j{{%bFYwT z;c5#rF9^Q}!*pYo_$Xe-DII7n^k{D|ti8o9?Hyv;dyHuxk<>onl=c}#?TgPh6>w_v zC3d)loR4@1w{eFAh><jT6bO5Puww}Qq|G56OvgT*3{7J;GDyosTGj~Q9*tpYy8Bq7 LnL%Jm68iiCkl=lI literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph.class new file mode 100644 index 0000000000000000000000000000000000000000..6edffeaf06b24725ebdc5e662ea153826f521a81 GIT binary patch literal 14589 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 Z7abbeO!MJ=DfmVTzLkRSq~HMu{y!C-k@Nrn literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Arcs.class b/bin/plugins/ragini/voronoidiagram/Arcs.class new file mode 100644 index 0000000000000000000000000000000000000000..307641af20c256758b072c14c519e1d60080f8ad GIT binary patch literal 938 zcma)(UuzRl5XH~zCRwvxo0{6FskZiy?WTeYzA6Q=1OlNxD0#n0mUv6LE4xYYLy0ID z1RwkWekk$Wn?NAlVqbRdotg8yb7uei{q-BbOB{P}1pA-H(~(Z{C{qkNx=OP&N%c^x zQKl}VH`yTfP!eohs4EqXRWgd+^)KSVMBwP5KstibQ0Kf$o5v*n%;RDA|JYZ8%4<G3 zITg5Jt4HzMbQt?^Q46q!Kv3)IBtD;B_T%h>>W^bVy_*iyxTi90?u%q;@=@o4avo1Q zXT*e^R<8;{BS0Ay4yFYji)VJsQrMoCw*z>%!!m7{^0^)TIK0j5bHdXARrn+*!BN<{ zjnI1KqUe~L^WUe_Y!J7#@m4j<eqr{EJx=fPFS&4x1)dx;tBrh-(PIa9#P40+B1T~> zpZvu7ciXnXZ^b5E+~e7_vH^7~7i{7_Ge&$$xMR9cwrAK{s(qXFsadmx#=L7mF!TrZ z1;Il+y2d(~p}ERhC#!Y?>oM&a6Hl;njrDwn-Bnhdtj!x(d-P~nRqQWV%LV<w?l+os kuv}21a6ujp3dGH?E8=FMxQxRB@z$3W@lK)mne96I2S@vY!vFvP literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/ArraySetter.class b/bin/plugins/ragini/voronoidiagram/ArraySetter.class new file mode 100644 index 0000000000000000000000000000000000000000..6b677eba32f1f4193cb353bc73564d3f7360f9de GIT binary patch literal 966 zcma)4O>fgc6r7FI1RK+aHk5Blp&&bvu*5Z0qzZ{sR1QJDaAA|K%vPygZJbE_E0CZ_ z91v%I6k^u4NYqGe4&IOFnR)Zx+dqGQ{sQnC2Tjxj!t=>2(djfYlADg^naR>jpJ<sF zc@`ZRBR>ySo-5NtU7&R;=Q5heG>P7gPSrSXq9Jf_wMfYqaOTnoy!<e@8h#urllKG~ zhcuM;$qT|*p#CO1Q63!J^5Mc0*c#|m9na22%Dk7Oi4xczWMesrrP20Y1?%}IJr(F) zlXa<5=60qkXLEw}yoRw0fjd5$xFN8i)AJeGPGU8JAY4y`0>R*NdwXF_O^@o2d~9P! zpdEy(C=1y0aToUlykRyoWA#?sj<lA_dS%50+@VfVna>P=e_WNircLE657#TH-@`tg zIs7*G)og$G_UxGx<a(30h`X@S&JXxsd8lENYoiD{*y7nQ0chbiZ=5rBxLR_b=$b`$ zy5G@Wu)QMcGL=^-?3SoX!K&}licQR(Ray%p-_ZU-(Pbl>t43N!G;+TpheTT=Zm0Vj q4=(U<;iasE@3oNRNSO0+MSH=$EdBydF6aDDq4Lv$ypLza{`?;z`_a_^ literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Circ.class b/bin/plugins/ragini/voronoidiagram/Circ.class new file mode 100644 index 0000000000000000000000000000000000000000..c2312a1e68a0c6354b93e0fb61c80cacc54d925e GIT binary patch literal 1082 zcmah|YfsZ)7(H*<RyK=_U0iU8I8eJzDdGhcL=qMflSPe}MLu?0Q;J<{x(@!7iJCY` zH1P-cqm1Y6Hi8SrChhaQ?{honIoq$_-+uyF$Bqg`pz^`%JFed|LyN{WkAg7p1GnQ^ zPH1(_T{mp2NC;#Pts~3yEZ;F-v<~fdB#>&`eq@INrA8dIjw92tgRc29aQ$e#zR8r( z>bU)$fT+v-AoOK^^4RS}2Le-}-4-ZMRKH?#j`8eahb^Ltwwb0+<c+7)t4)E#ZqTta zn8KWf8RXbouQt;VC}>C`CA~`;R7|IKNM1hj>avCmrd2EmESyVWr5^NK9vd%WNySxx z;<;%WuAxE@jvc*=N7rS=iiYds>-`MMxGAye<geEWS^_XM;z+5uC9w2&=QCS41yRGQ z>|hG0>@e<eN5chZ0<#U*x1aaBEjxT;5wt+A5wtC@X@#ylk1i9@flEPF8vhrb0tyNw zC|R0P4OJ1iqE{!RI0Ke7nb$!-Y}<RT#E_Q1pjF9DKzrs>|6R}O^=v{&4VSCpslfa{ z*>kmADFsVHky6rAq>!=Y@?uLBW6MR*PO)MJ7x|s#=_A*Zpluo_$Qrc)@`gS@(a;Mh zy&quS_<{1i@fG=RWabQ=W!*W!jRC3*)?~2C;Lt47%**!#w+C4J63<=dcaf;TsR>R^ zBTH`%CFF1qdAvmdcNtxZnKXHKpC@9%12Pb?w?PgH{S8z`$j$gn<{Vf2#3Y4(TZ{@y waYHRGPL3K1JjA2ZVk*aMS-kdnqPTocv4Y2O)+V-Sa~xJCrzhl6!?v`400cAB%m4rY literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Constants.class b/bin/plugins/ragini/voronoidiagram/Constants.class new file mode 100644 index 0000000000000000000000000000000000000000..1279d5f25e0fd2766cfd48ed7b195f3bbb58a327 GIT binary patch literal 7765 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 Ji|*fl{Xf!`_ap!S literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/DT.class b/bin/plugins/ragini/voronoidiagram/DT.class new file mode 100644 index 0000000000000000000000000000000000000000..277611b217a50d0d03f09547511c7ad1040d8b6e GIT binary patch literal 1421 zcma)6+j7%Z6kW%6i<1jrAf*kYAp|>IOhOBt5=e}d1cQ?RaZJohMsbv&)JPs#&OrOx zpWp}DmriGj9x?+n@XlAzKj<S*OxHOP#81GCM*FON_Fnrcz5Vd=HGnBJ(ufI+v|HV6 z$L$n-i^3`HdcNm+&Zc8+`__}9SxX}!Ft}swTE&*-ZWos~cI;*#kX$RRRaOK<MWC<j zxt+jrgSyq~+Hul@1`TDPfFOAE5iq7vsxGWomdeZKTm;Oyhox#Y0t>5^TO~4QnqJop zY=83LICXHmB9QjlR?`WdF^PGBMDVO_Q*;8mEfDwZ4)vx$YR3u4B9L7yt*zHf)m26v z+_c>eUGG_}($?39c5OefpO)P17HP(-pKnZE8((K-TZ)0~TUOIvce|~Yz}Od@=V?mU zC}QL!_v5cS?v^SkGu>=)Ai+)6k}uR*SlQdOvux}+iKED=Q$gYwQtEVG;`sjQqQnUd zrDlHr_1}fRbHAy}Nr`Wi>YW-4pj1Cfe2bwpt})rKDKz!wzkO!|S8-ip8aLS4=_tWu z-ZTq!#XBSM9fs2=35<T8SM|WaEXs;(O!>}9oW_VcEl7Ni;neK=olgnhl{kqZb-5@p zieZ6)s^i*A-6tEiU$ZvU%#KvOrq!xjzN4^K8i=E;cH^<bbr}7^T+AA$l6CE;LD}>C zP5R|41@5<SxZ^8<)%<1AYDdA06|d_z?RiH<PMft$>Jwqw92b*5#*QbEB1#j*kRi_Y zV1xKj4^|WE>%q#tzXvP(fgUW$Hb|_dc{q|sBFW{@daj0+TnsI_7Fu!_v}8ZE<RWOv z!D)Favga@~<|wpe*D2$y<qXDH*;%4Lv@P&Rh8RzT$Pea2Obmp$ki(@Amvfj3@xv=z zZRGG1pFR8>;^r&NHui8UgsE=&`?YpHhub0UD9sDp;iI+He;6f(CBCO1`5r-nUCwX^ z`k2RIW^w}K%<LR4qJV3dKp90;a2X9uVp)5u-w~HA%J~YVpguXVhkFO~2E%|&Pq4Ad zP3{}vJ{}Ndv4UDeFcT3NC!Zr7{}YMCU$ltpB-O~l0UR(GSk+CcQ=ddEGpnLMB#2?{ Ef7x>f9RL6T literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Delaunay.class b/bin/plugins/ragini/voronoidiagram/Delaunay.class new file mode 100644 index 0000000000000000000000000000000000000000..d9af3f1ec9d354cd6c824b7c6b49c94568ec7022 GIT binary patch literal 3093 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 literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/DelaunayTriangulator.class b/bin/plugins/ragini/voronoidiagram/DelaunayTriangulator.class new file mode 100644 index 0000000000000000000000000000000000000000..4163004f3d2b97e4d7bc5b8790a19e87f83335ed GIT binary patch literal 15465 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 literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Display.class b/bin/plugins/ragini/voronoidiagram/Display.class new file mode 100644 index 0000000000000000000000000000000000000000..9ebec8d416b5ae82e22b387d1cb36ffd8b5d33f5 GIT binary patch literal 21436 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 literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Edge.class b/bin/plugins/ragini/voronoidiagram/Edge.class new file mode 100644 index 0000000000000000000000000000000000000000..4a59f403158bc8f8e2f2da5783f27e6a0409d6bd GIT binary patch literal 1274 zcma)4&2G~`7@SQUyKxK+A^m}tl7@!ZrmfpvLFGV+R1wibQ7)XEWEEVcapfd^4xR*o zM1+I{55PkqW}PThmP<J7&bRBG+4*Mu>-YDc0FH2EAR|z{>W_QDVCY3YA@HulC>(@A zH}HFrf9bvM_M`z#pm^b5`(EE4^t`k7h3t$3gwN67XmfM~GV)5G_P+UV#q(e!p9^Fo z*%L4%^#|>U0;dA{3pyAb^P}yw1hiLSSDMJ8WZ^EB4U`w!RpNOFtXjy!RMonL0!)GB zW-yR%$Cqsxz4P0BDNt&L9lzi5qd=`^o7(6@FcjEX(1eObHDNmqb;)B3Iq0g|wqQ)F zCl;2V3)F4rKO@nGa>PhA`$Tmwx*R85a+d)sV8$k4o|$H!IxThUz6A?+cz(bW=ixZ& z$VQ-g%qye&>glk}b6GyTj*K$PDx<8%NTV?_vly9Jj1(oBWHNuwMXuhECx|QVH{5e` zKX8A-dWvgbV%h`FC1{*Y&INk2P^Q#F?pRYYHn7Q+pp{26VUMVUbM9AcePWS;64K+% z;tg_cPBv1>l_a^GN?uAOSCi!RRB|3WDYjQWCv0z~k_)NiwIsQcO0MDQ?B<tzPxYdP zTmLx0*5B++MhD)ZqZUi7#%p618wsexrig%Zi&!NoW>d^rAm-j8R!xfSQfzO5*fZ?T k+B~Lv)sOCOOt6>KI^Z94ctcB{cd5hUKc~7ph+pOK56BRve*gdg literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/EdgeL.class b/bin/plugins/ragini/voronoidiagram/EdgeL.class new file mode 100644 index 0000000000000000000000000000000000000000..a73b08741d43a8f827f3740ec528b640a9986879 GIT binary patch literal 387 zcmah_%SyyR5UkEqV|3S5KR`rK4-W2C@gfRB(1Wt~NixLQO)@f@EdG`!!Gj;*M~R(b z&w8ouD*9FZ{qy++V2Xnn9^vS<?kn9cg_Rt%SQ%?tqf0F-D;sfJRw|1T5XN)4lA@Mv zB_8v+DmsF%%L@YCyKG7b8u_*$9A|&eEEimNNr<j^VRy~lC#N&+zA>dr;A1C6f-S-* z)2({wn_Ssvnb(Ri$xI>ZnY4P~Ycc3v^z#3$&IxZ#o=k5Gb*G1ciBr!9Yd8d7!k_Ws yAw<NPhj<+~u*sag4wo^e%!K1Wc=mzqcUL}Qj94Cqj2TmxhuFo08DWpn!~QRivQ|F; literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/EdgeList.class b/bin/plugins/ragini/voronoidiagram/EdgeList.class new file mode 100644 index 0000000000000000000000000000000000000000..5cef6dd365bca202f99739808b30de9968ca7e78 GIT binary patch literal 8733 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 literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/EdgeRNG.class b/bin/plugins/ragini/voronoidiagram/EdgeRNG.class new file mode 100644 index 0000000000000000000000000000000000000000..a5dca4306febbe78f6b39a7d921615af0a6282ba GIT binary patch literal 1617 zcmb7E*-{fh6g@owhQv`+z@WIZBomNP+yzl2qG(tY3zxS}GBu2b8J$dAzkzR2s{}2r z@&kPLcPvl$q<o-K8dKHNr~BT%_uMT%etrE8U=sIC7y={DYYop2>P{rN`OeEQ3WLzE z`qGQ!hI6y(x%ZcDndlH0d@5f`N4|<3&kZ-6k{`H}#o=PuDA!y8BRC_FFa6!zlIwfx z<uIC3`jY}_H>f@j{UELj^p~{#M(o#|*(j24N`5`2VtUp00vR_VI=R+LXS!XdGql!K za|1747Z61rrWtZPBe2>w@pgULYXTi}Vb#rGKl)7c3XHaw8w>q7Akgi(@mv^2Re@aI z{)gKYmBXnF25`v4L4l#ayVB|w2632qcqEX@+w<!2Q47cP-Qx^WIALKAP70X$B7gQ; z8Un)>I?<)js09;UCh`KkEee-G4h3akjCsf}B(G0d=tf$J91EwxhDpgP1MJTyb*;(3 zbC%0b-AX)VKgrO`SqtZIp4q6f8Dvml4>ai%6^V-$EbJEOQO&s2*eJWv1F73_e<`fU z+M0}fb#7jE#OppgE%%RXHk)2GsYi~6$4<?%1}(y*&TMPRe{^LAvzRk+Ltu|~q0_J^ z<8=!~++_ahFQQnbv1qet4f$Gq-tbdas7%BHQj%E>8&Sob_tiXF%_t_6Ngfx1z>Vf= zvR-%VCYA;Iw67iG%$Z0A8Yh_E6#pnXV5pK48LHrVXAvpQXuON}tbx{K0O+A)FHb)y zSMT2y#<sC<8`;fdKe9RAJSY2+&CfVq7~8^7VSEcCg>T3`?)(gU3*&`PdJS!3;$ahy zXxxU$$t_&?s0m);_ayrcBsoliHYrY!;uY+}Jcsi>dhr&0xJ-@X31!Nrcp`aBGi0IB zRU(798#COK;IHXW9o{OPPDSzqfdS<-d6?CPtwf<|*icQ)8<i(tjRg1XKxfWV>)C*5 zdulzae8KhiJIoDgbLUtRKKa8l%Sd)>7g^jQQi;#vHc_ItKx9&G;ZD=7qhm=pU)bs7 VSWC`#HI)(;xvSYsVF@cp{{}#3YDWM7 literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/EdgeS.class b/bin/plugins/ragini/voronoidiagram/EdgeS.class new file mode 100644 index 0000000000000000000000000000000000000000..4f67acd43dc15be7d5a0b2903a8aee3fd750190b GIT binary patch literal 1576 zcma))U2hUW6o%hfzPDqkRH=ee3(^8wR#59_xG|D6A$n26{Q?`@26oK?4g4o#Vq#<B zg+IU_Wjr$rB^ih4%{epg%=^rlGxO{BkDmaVc#(j?Q2I2Q4P9?y1vVwuy6^+v^WA}K z4+DE_y&Vjlvjn0HJLmR=ZH;ViXua>9JN+qxF>f%iHVqauFy>7$q7e0Zfmk^WheDo@ z#Tte9YdU4xVu)0#U0Q$R4;&K_>~f^B!;tQ{p7U-t?m58+yEk$eG9ABfkGgi?iuqEE zPCvR6hH~dW%74WWn>bTZY_!s@c2i);bHos*8t38Sq9N3Mj)YVfOG{IzC61&}1!N(W zLynYC5~PH8jaE)WaE-&n7J<F1WofB%aG}de#sb^mxORn=$`g)lp-^kuGExK0Gk+HJ zowh4lVan&Ii<iIwAtLmUNf_cPG%`f-GE=!SQ;{-LMKV(bGSj&-(`l5`M55kPyiPNV zGNT-;eMjc2+;)RvT#6Cgq%jXSAd5YkG2Fs!io)EYA`G#+R=PxP?KY)qQlVRtkPUY& z34(q{p1^Qd&nl>_ZDOT2u<k8c2YOafWo3x9yMeW;>%N{<R#{nM?QLMK>N-N@uYTn( zQB_$vV&ylm9#AL6Lp{{9j#XBHSo{BAS^7IZQdvb}l{T<e{c7r2k5$$ov5q#dR{e_M z>9Swz&-o3xFZ9t2tUqT>V${!>(3%UXxvn)QwdSH~Zfeabt+}k4PqbzeCz?A~KPz{B TsWo%0`B*i#wB~2>i06L*Y8sKf literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Face.class b/bin/plugins/ragini/voronoidiagram/Face.class new file mode 100644 index 0000000000000000000000000000000000000000..b11f338f5949d6f467470a8410b66f54da49414e GIT binary patch literal 6601 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%0DEc>D literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/FreeList.class b/bin/plugins/ragini/voronoidiagram/FreeList.class new file mode 100644 index 0000000000000000000000000000000000000000..57e4486d12b9fa742118955e4452c84de26ff06b GIT binary patch literal 390 zcma)2y-ve07(A!>DIulh=LJ|$VZahAhy|$<Qd9;|cPFt@S80r#qyulogv7uD@KA_L z1T)Ceecyey&v*X(dj9}$g_8)Lz}a)vm8Nc_Q!GaAth2Q>g;AwbTe)yrr>1Em_yV(y z+9_G7x|9#uM(3@7zt*Y{n5TcsEN!8$1;#aNV_vj?xEBa-_-cDAFq)sQsCUQR7$Zy) z>>(DIrl!`*ZkuWMq_T>)j#8VeYNed%`OnaA*QWWOk3J54#E-Ufxn7uFbMl+>vX6*U y&<{V!;|dTCU4$_!P4~Wt`($$9KydMf<aIc9Knyts1*XJg=mX4fNJjTW569m&$y|E? literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/FreeNode.class b/bin/plugins/ragini/voronoidiagram/FreeNode.class new file mode 100644 index 0000000000000000000000000000000000000000..2e9b019fa7e762589f2dacd88cd96f8e618e2e8b GIT binary patch literal 328 zcma)1!A`<J5Pj2@7Hbjo54;%Q;3i%*TueAMcz|%<mQ7t!cFocff6J4J2R^`$BF<L4 zdzts<<;}dA@6*>2zyq!m1cbY{x~;U?3nv-0I9O+m)f+7<CwF4*lv>!0N)Qo7TX~S8 zmZlOf#a5LKp>NcC<4uHd{=Zd^g!qZ0ni(M+Pu7I!nG;fkxXh5CPZ;Lfs71Rglv~N7 z=H)lJEoHryPW%2WM$N0<6Vjz^U8&~U8wY<E-}_^63l8CT2?2VDJ4QZ)l?(0!BQf@- apGZHL1jx9?ofu-kJo`1^>O4N|T%#W~w@O<8 literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Geometry.class b/bin/plugins/ragini/voronoidiagram/Geometry.class new file mode 100644 index 0000000000000000000000000000000000000000..bf54e943d1a038d7c077b03570586a7b074926ab GIT binary patch literal 3041 zcmb7GOH))w7(G32hD$`mL;@m;;yh3UHADu8%0os$2QetVFEdxTFwEf01wqNHDwRzt zscf>bl7(4>jaDU9I;LVJ*`!$HKV+S%{D3Sh6LPxmWuQzIV`hf#+udJ(-#Opw^4mW@ z{tTcEANk=DXqrvWO_-T{OHSuxw#;X9*-X|<nfgRdpJ_Q|WM>R3x9EpQpmIu|*IUwh zW}@ZX_>_^f1pJBNWOgpYClMF$CWdFsjDRmOJgMg=1;SSbH`hO)r*HM8CXARsSu&f+ zTYARI^InN-J!_)8=j$YHt6QKs^vbuwqXM3uY|042jY<s~whFjI;n6Y(Y|{`#xxkh| zGh>{cn;AE97xeM8Ay74#P3q}UJ!i_bv+1!WO+qeZe9e<Y9K5lCY9KL8_ZvC7Fi}cJ z(OV^mj+mAa>kW?vQHOdzc9snDnqm#R(7;gS4QrH;j0J)Hr9dfT($*gA^`lW>&*mYQ z@*4J`Ngyy`SUuTnE+x&Big_YyW~^8cAw>KL3p8$SMu}^PqM5llrlQ*~{c%u33l7mX zIW98aa?FHKza9BD4FQw|nFB{O9K~CdN(_(BC8rHWCtAu8Yfg-X<I>RE8jhhu6+^~Y zpn^zAibW0bey4^m3ErzvO5X2iIIieilIJHi^q`me=bcD3mDI07CGYlYIE4W_(1~Fi z-v8jI%H*^LFMI;7Nmj-y`-Z`o7ufqM2~1HYh9E^xTF=vg9vf)Ih@~f|hxA#e02!l{ zkv1$A^C&L)ago`yd2STjhlVlb;`v4PEqVQlhO2VNKTnmGz9{#uYq)`%EL*#)<;}Y! z%w`dn&0<`GUwXl}mL}|o#>}j>s6;NyuvN-oQiCbe&cn20_(GW0kY3whdiwNC{*J+9 z+*iUib{Pn0w6kF4^rWR)t|vK{<8AKBZfNRhqVyfFWT)pxvY68_k2_?Mzn!x(c@`m? z7FqPl!$l2uaZjLv=r*$SgyMD=c~AC83J8-LMzV9cq|tB6mRPaY*AB{;19sCTZd&xf zC9{K1F6kdNv$WLA=E^xhNevYoU*oEuaxTun$Wv^IM4zDQdnH@V@inEfj5>qVP>$`~ zd)=1i{03K&;SQb<A8PQXty44*fuCnf(dGhb<*>Ve{hx)CUled4@))g=XaR@YI=sv9 z*Z4ZTHQoZ+$2xo~ILw1sjgP~ZU$6eLzPOJXTT8b*JfReJQ{>mEx?4bBjhE7Wk+H{! zdu~2KT(WROvWO5Pu#K3i`Q45NVs9k+{hY^%dYZUzqZaqDQ!yN{u@@OG;S2`JjC?SJ zvx@%`&LKhl4NTf$o_eX#gY$gyvB?cNPb0ij4fo$@^rMcy=WxG32Op^I0tRev;TP(W zkvl^ICsxoeClXvir@e7>-D5+`2+$AhLvo0IyZTo%McRwJQ{){LbotBVcVjC7?!aD- z?Em~mIUi;*#1KXwU341FihP3&rAYpaL%xyjl0;pQq%=vSi9|flQBNA|*bbRTl#pcN z1QsLkssi4<WzUy0_I&M=sZYD=zJk}?Rp;zHK!x+<NvTc!8w4VCPoUR5q%u2>^(ro{ zd{MS3@P}{&9W;Cr?d++?Ho%V;;l~~LyGSv~*x2v`68=6>tr2tzh6BBuvy5^%p~UaQ z>v`y2H||qMUCM~OMlr{T^oJWlwj@6tYgg4HZpo@T{|uqAr?@q^Ooq%&UFN1v1Fihi z+Zeo+)jy*f*Tw8EVB)2NSOHVf@02;2*S0@Su%3GerkBuq7~p=syG}7T2NYDhTF*OB z0}S&FGQ=oBm%;S{<$i=D^ekOzLpL4h;f<&Ui;MpzoJ8bOl~%<X04t<|)v=QpWXi1f zjIe{Eg84tIDoU{KwmN2iU=2x+U5vPy#d45ts;Wj#P6b%gpBJzYu@~2V0+XZF-MNf< ziLCY+>c(78u{5GqZLER5kA<jpq#vyQzFrYcsu^CQxiL0|%LICb)o>Mua1GtKPRCtk hU%t5k_(cc!0VdJ=Od{KT{3reeUn8>TeV{z>;lHq6ss#W5 literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/GraphD.class b/bin/plugins/ragini/voronoidiagram/GraphD.class new file mode 100644 index 0000000000000000000000000000000000000000..40609a768209a875bf9c90847d3f80c59b1d7a85 GIT binary patch literal 964 zcmaiy%}(1u6ot<?KW-dDAT6OKwETu9RKgNl5K=|eZX#MKRrcdxg+alN94AlJMJs_S zb<qdtLm|$LBSnNzZ|2U7&iUrtYyZ3d^B2G|8a6C}{o!ETSK-KuC5!SVQ5=Plx>T|s z%Ny@YEQeR0Y~%%2uH{5}0~z+cul{w=O9ZSTmqz>lh;NY!lM{iwjC&(Km?8g271hPi zPxYe1!zrUBX9Brqt4q>(bQw6vq2i(pSD?~XVQ?|N@q_rg^ap`JwH@{3petjg&(q6% za;2EyAR|HAGc(wuAklFI-ZwKmCUvV@g21{98!rTe6ey8!;irszvy%!oU6kNZV8E>m zaymW@-gZ$yk@=fh9+SpQi^Fp|(Kzk}pOv0VIc@Gpe@pBTn&ZEagQdybSvtC@OvqZK zf)nPt#FNJ=SPO^0vHZ)(R;D5iS>;|!DL@r3Sp{BUjjJ}F5pJ;-4?o<YHgh}X)}g0t z2(?r-CFlsR8A(6<1{+UU^*hw(S<7Tqo?*RZTbfnCyD4kd)GfAtGN6T7Q`Ln{*=BN& cCvuD0yt%f}T*B^xm+L>~Ufx(}-ZQHG2Lb@9?*IS* literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/HalfEdge.class b/bin/plugins/ragini/voronoidiagram/HalfEdge.class new file mode 100644 index 0000000000000000000000000000000000000000..dcad064887896b4e1d163713defd9cdb13247cd9 GIT binary patch literal 2613 zcma)+|5Fo37{;Fq`9i`eD1uffMMX`*muS(7N|9DVp`I87BcjfDkR=>*B+Ml+_J8Vh zbjD0)`a}PK{!xz4?j6`}HxqtHc5nCI&%W>TK70Rs{_Af5-{W-(F$*^i{KKkOYZL;P zgI74J2lZOrt9WiTaQ6#KuD?^PR7DDL3w?X;kz4THTD9<OYfo%9EhLMMFLpS|I;R6Y zw2&$~&%Nqy7%d35FxDYjrohPVq7#Un?HWU^Wef45bFj}GjzrKD?>kf0yr!fierq({ zfQUuLmR489dzp&Ys2%z~S2r!By+%d&qA4oes0SXE;bfNjH0OA1b~#t(@VH(P8Fb;Y zjX?}q=*s5GX;}Ey#(DJ1*>^TBgtIF)Z1l*rYc>YZW1-jaYGUPZe@g`G?v_sx&O7yO z*Dt$)C!eFmcyrflFe{I(%H}%AqzaUW<ZYb6S?0_tl)#;1mBcc3%0@TRtWWq-T~<Y@ zQw`B{RHMgF-RV$`J2nzXvI1(`O^Ry0JZHv6N^P(e5-$_5aI+I$<tg>I_;!MErKg-9 zgbdkB$^Oa4ImKq*(tM{JIiw?9DX8caJsw&+-%<DDTO!Rxw@7QtQX`+mvx}h=j*VXQ zF<WV?(rQf^kNVPwGRfl=YnR(zV@27K+o2&Bjtwcb3ismKO_l1Fg$x%@-pH)g4})#7 z=t)<dIZkd$-d<dxI$gZ~J&4J^a2AtoP$S!}#te7mIvuM<T1kyeUX7GijdZyh>2WpE z*Bl3U!XPg4{}P{Ea$+36$^Xe;yoKR>R|_NgSPP^1p%$)wRH0-1zpSu*h_iQTUZJzZ z_VWT=BJw)-2SX5UsP~A(O&&-&>Gf=MTtPhpiTo$zKAfPFTn0fBW2<>0!dMu`gduoR z4<0rK7jVlEJo>wK@~AQRHowB5N^_A)$^3W=(_baYsFKInsq2amN{~E}Ac?yaLrU<2 znRQQRWy#95Vcm~d5Ae{G*QCyxAZxM>YnCmPdHs0egs(NS?V~#D7FoC3u;!vRKQh-i zue0uub+--c=cvZVSTNO?(^)fQ-EYGx(xS4)Mf?)6{%yZ$-9fVoquX!E7<^9;o;L<B z<JbRHajk_XdKC+-qS&U2r@Ym&iWOrb^Lipn#zcDY%pk#&KeT(`7=ufv>}!ctthT9Q zHR|hgtQis+)-U9`F_Cp+@Q5C~VGMqOa&+>4oIb4g;ti{K+op<_{NTx6Y?xUiI_n)- VZU@$Y@e_4bFREfJ>XmBX<`+qGYbO8z literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Image_Extract.class b/bin/plugins/ragini/voronoidiagram/Image_Extract.class new file mode 100644 index 0000000000000000000000000000000000000000..9d60b372988bc1df161a4628ced24266ca37b0d5 GIT binary patch literal 2772 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 bk@`su4`~<|0t6lwYa9L`%LM@_Qh)k4N2{cq literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/IntArraySetter.class b/bin/plugins/ragini/voronoidiagram/IntArraySetter.class new file mode 100644 index 0000000000000000000000000000000000000000..b7b0a5369a2c0635c24f818bb61eb15280578d24 GIT binary patch literal 907 zcmah{U279T6g`to6SJ;uY+_SCYqi2|DqZk3B~S!G2=*b8mp)C>VV#ohmdS3wf2E)m zd=Q`gQR121#k3~WhnYKbIp^GS@64~?-+usjg}pi|0xvJ7S)}7xXe5IU=ZQ(;M4xII z8F?PQjngAz<j0{(Q)TL?3N+8;T!vE_N8$1KOij`{Y65#V>lAzeXD*Gvy_1u{LWMO{ zq)bnsc1R0ppD;fd2~=Mvr^<zcJ02Qv1vUmcR`0U&u`=)Fc&Y?82gyWEN786}FO${u zgPsW-3~u&xy*HM3W-1lf_E)+KMh(!phdOQvtm*h7BiM;7rQ-)HImG){8ZE}v3r3W1 zDfY<2CRze*KUhXtz>bFwwguc_l9`EmqixHr>%I@{AO#vj9mO)u3=zl6YX2EU@jQns zo9OqjOD_)B8dt>*fFH=7`6%3P^A<7+o9%vs_nC(Z*16a6q=OBfy#jzH?()W`LyNm5 z_ld4pba($N+6%UuXB#Z#<_cQ{s#LJ*TeM;eb4sPw!pIl2KT-6mk@aOG%_ADQUy=i& wt&v7||0f<?;^D$e(Fwm`E(y{)cwEw6Fc!^U;>o`?|5B*@G$-%kSstJN0qy#@;{X5v literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/IntSetter.class b/bin/plugins/ragini/voronoidiagram/IntSetter.class new file mode 100644 index 0000000000000000000000000000000000000000..94b5db001690fac428a99fc3463a6b1067df8fe8 GIT binary patch literal 957 zcmaiyTW`}q5QWbsjzf%_D-D-Iq0my>m9WHXsz?Y4DN+g#L6LZL(v{gNwJXQz?*a*0 z2_(cbKMHZyHfc($@~}HQ<2m2X%=*{wZ$ALMgjYpLVE1IU2vs!qlYmC~r*RTTu{u;i zm;}fEAWBCvO=VJrA<#SuP6K}yM4|s~awMl|6{f)U&4^qtAR>Xz@Pa_J3}w<2F!y<L z+7~dKfjg#o9Un>yWvtn#p)OE%+;J66fz}ndg$CL>&8k7*j*TjA2{eW(l5ZEs6PdgZ zCNn9}9>&vPHVzV{{UT_jAJtsI9p2o*atN$dD6RoZn#)w6>s-^2ZlR*0lLZsXp-x+O z+-vf5d?lPuwC9d3HuBWQ1|G7ZOUfceC+yhR#A5+#6fcsge4})e^<||m^q>T4BNawL zx=8r(;Obrf={tY9{T1EcH|zJX#UjdF6)xzhbJu6S1ozwY4q%`}+w#s~d*9LcuyKyo zS9CrzSi(B@IuTlIP~N1pORt-Ya2NOJQI7j~K%~$UDbRi9Xte3=UE*0;bd817S6Jqf zW#SQU(ku?IVELKP;=M2Ed?GY2&14v8XBay>S8`1A6$^P%h~1))nz#28jWcXr^p*qo hk7P(twuxtjY=>6kE8ZEl|Gjf5A^UkI-i4D{_YZZIyjTDL literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/MorphologicalOperators.class b/bin/plugins/ragini/voronoidiagram/MorphologicalOperators.class new file mode 100644 index 0000000000000000000000000000000000000000..78c6ed8dadd0e4f0c1038707ebdd81af54290031 GIT binary patch literal 614 zcmbVJO-}+b5PjuiS639pZ}EUP@L&@|yl6~}#>52FMB~+zr7qQFOWIwCKg*NGgFnC@ zWt;^C51c%-(>I+ro%j0r_5J~1A7vLAhI%hd0u@<q1O>(W+UQ8Dwi1C6UEb8D*U_O4 zlrO@oo-`uX#=6Kcl$HO?M{F)yHa5bK@A>txoePJd_NPEau{00Dm%kMkT@lEWNQBQ; zSqA5b9*>V1venuhL+(_!rH3r$3UD#QP;973UMAg^G`FG^N`_KH(@1y1s1*Msb8#o_ zcF_2bszV0X*WF$c%Ndjys?)_+l&uW3c~VhOd7!B(J04cB=3<p$JCz(Hij#k28gEK# zN$1%R6|jyC2G4f%V3c84tu`J-U+_>w0l$e2H9brX@NRTse0i=?spaW|?4?ZXfJ~#6 zr%%mLB)e#zCB!K*iuv7FcrU~20`1N)>0+MFg;4<(P$a~#I40K#rDUhH^oHdL+oMNP RUY_`q4$ip4Cf#PR^$p9`neG4p literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/NVert.class b/bin/plugins/ragini/voronoidiagram/NVert.class new file mode 100644 index 0000000000000000000000000000000000000000..026e888a8cbeb852596fd6a7b8f5f0bc70c734d6 GIT binary patch literal 1021 zcma)4%St0b6g@YI>7;EnYJ6nkE53*>rqQk9Mvw`FI50!@m86L!ZMSqf`6@SpBDnAa z=A*=0)s13PGH&WVIQQIh5B2Z$`31l+_ATTHJGcILD1(t32@cYogi#oTav;Sp5;tzA z>qW7J0-<s(Cc^baFmx|_*Iqv+6oOuKM4(oZ9utaTa5eUQt|zy0!1XC}#%F|l^PtP! z^KjtV$Ya)ljcLMMTLxZdeADxyzoO@RgoSq47k*bnQq^g*5MRj=VXyrSu_t<2s|>=D zgA$5_^2m!XgI|fTW=kodPyv28m_kuyYYr?0wHVq-t_t2OK1}tyzvVz-w;hxfmL>%I zPdJYH-i1`!ZSB@iWfU3=%(Kr0<kSw%a%zK)EJ{aa;ixFt41OK1T#m$X>hK9O_Zl|G zZ&5e%sBrEi0L){7E8-g$`Tacnfa+alxMUn&#!5PT#tL(4)nWY+)sNM-?kcBdG{bU& zO4loCt6Cm0!X%`Y6;d$@v5dp@>~PgMyl%dtmc3$?HP*hkVk5m`)67-Ra;-7f`hU2# f%v_Bu*A{a%zTnzPb(M_<HL?cn8V%ajpJDF}c~)`O literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Neighbor.class b/bin/plugins/ragini/voronoidiagram/Neighbor.class new file mode 100644 index 0000000000000000000000000000000000000000..0cab07e90c9f969c3a44d7163863d30a10fc96a2 GIT binary patch literal 1292 zcmb7DU2hUW6g|V&mhHCCQb4LzTWiaQcD3pgO--xuiPRbzjJ^#pq0_)F8FriSuQXAc zXyOm>M;Y%dAgBcD!_Mcq=iYnf?2n&czXRCEGXo)poo?H2NvCHkPLs4RUFABiY)alz zyknmT**dSg%0Pr+Yc{qjJz*fmusa)f>Pp8u>vsi1q$ztI1A9r!9)&Y(S7rz6BxQz$ z9`A@jaJq8AFS+e|vTYwJ#rqZFBuKm}TMqYpMXb-KVGib`8uea2B(~TAspB0og!6?O zRr|ti3KL<ZEF_RLkY-3tsl&t?QgJZcu&@Y=AyJWzIPp7mq0V@{O|`97+y-ygxRQE5 zJdAkfvd56WZix&=OL$rwdeVGhPFNtKuIjFZI825`-fWKAWhh-cZK0-Fwk_Pp4k_*o z-9nY;CKNwa(pA#yzww1H$|mwC8YnPi$AbL<u~5PTQksflNaqJkZSJ(}*Yyk0@XCev z<QYeMhFqW}E;1~S9MRSGq6)Gk!#KgDGmfU;{Ffihs_UzUcqR1{E{(L?(+ROjnuO_# z(inn)1^VAYTIgUV8_?ZSuwEt%c>+lqSLoz8hy#+vE36j3VeQ=&GM|zC7@%`BE)xR8 z5Fv&H?bd@GqcMq_xJ5I=25t}eY?}35wD<{kKF}frO%e+ZS0;j^zk@fiH4Hu`bcoO< z1>Y-u!S35}8D?;krlv9hOJ;x^vQP{jQZYLD-c-IU@!9|I<%n;64&Ng@rd$L0_5;x- Ro6P>*<i^w{p9E4o{RQolB;Ei3 literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Point.class b/bin/plugins/ragini/voronoidiagram/Point.class new file mode 100644 index 0000000000000000000000000000000000000000..fe7b8ccd15beee014cd5d18d6f54480c405af9f7 GIT binary patch literal 667 zcma)2%SyvQ6g`uquNdvSzAaLO+JynPN;g7QMFpkUl}y`Er=*FbY0;k&1VwP+2l!Fq zooPTU5nRlD<(_lT$>-Pm2Y_SLGtd|s_ugzI{HYysO2VE8Vc-X1DEKJk6Z<j{ew2a1 zP#E($w>|EU?2G=`9YhT5fu2L}ks*Cb=%~%0HxIiE##u0QP3W*JWRYXYcZBbr&nA60 zyykt+Whixm0r$E*6ta(pMsz2p3<sTm$U33RH|n6114G3^3Tc}4WVdc1BRga2Mzmx! z9Vtt@CCPHslQqdUuYy@Pa2+8Pnab^vG>U!V(CI&EFeEKih9sn%qAz5LqDh@inaOGE z4J*%7Xjr9~Rzn?YR9lM$<WZoGp@<U2-{2RNpO(PcL~u0`Tw4ZPiQo-v#+TcqQ<FMd tjaQU^ben2gAd^MKP+M%p+NG~8<&9xGnX9(URUxkGA6z>z*RHa@_YLQ!STg_s literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/PointType.class b/bin/plugins/ragini/voronoidiagram/PointType.class new file mode 100644 index 0000000000000000000000000000000000000000..fc562490485b940b8a39bc9df1db14682312b293 GIT binary patch literal 129 zcmX^0Z`VEs1_mPrc6J6PMh5kQoYM5nykh;LL?D%^UzT5#pO>GRl9`xZl$fg@ke``X z5>i=^%Fe*T$RLoFSeB@tlbDyT@1K;Fnq0!jz!jWdT9lmXmYI{v$iN3zt_M=d#>l|P Rzznnu1Q;1ufg}?H8vs(gBK80P literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/PointVor.class b/bin/plugins/ragini/voronoidiagram/PointVor.class new file mode 100644 index 0000000000000000000000000000000000000000..d56bc8bc8c8353cd16a035149098cb9c48772176 GIT binary patch literal 309 zcma)%u};H442FNFNduv!6>q?T3Iivxf>@B4B0vIVchXaEmENIi()VIQV&DOIC{$ks zJInw3w`J?|_s{1SfGf;%B!siKZfM1AOkg!JTOYjhvJ`Fuug#Me*H=E|ND1>5Z`pM0 zTJu=1Y||6QH@ei{5=M*jijdy<r7bYR;RG4Rgjp%hJ`C&Hh8M0oOE@Wg!(GKeV*YKW z{i|#Ui}HUo*M#EP523O55^qlbFfSt^PN6*dBh)E!sOFl?J_Fgs2M*q~k)TkGW9Y(> Q>SSMM>QhaGW7Pz+9j!M<o&W#< literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Provider.class b/bin/plugins/ragini/voronoidiagram/Provider.class new file mode 100644 index 0000000000000000000000000000000000000000..b44a874c497848ca81ea1305441b199da20b9cbd GIT binary patch literal 244 zcmZXPJqp4=5QX1FWBdgR&mc+Tf~AV3m7tJZU`>{=A@0g*f@ibv03J#lMH^ELZ{9b| zW9IR^-2u!o4B!!_r?SemISVIQw5YAK#_CMV+{vTZJ6r2axd3g#xRA9Jr8K$N9SW6R z2yLUTER!(W{tuUgUaWH?FO^dSKa7%uSwFUwOVvh~3`f8G*?XH1u98JFXx&5|0-?o! V0K}L1=&%pidFXQWK3)Gy1}_?xK1cun literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/QuadEdge.class b/bin/plugins/ragini/voronoidiagram/QuadEdge.class new file mode 100644 index 0000000000000000000000000000000000000000..3da8cd2047513ea55b203db1c009cea0c9263d1f GIT binary patch literal 6966 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 WtmiCM8a;t;FtzLd35tC5=l=p?5&jYY literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/ROI2DEdge.class b/bin/plugins/ragini/voronoidiagram/ROI2DEdge.class new file mode 100644 index 0000000000000000000000000000000000000000..27fc0b9fa0d49c12f601bf6f5a5bb66d6e379b9e GIT binary patch literal 531 zcma)2O;5r=5Pe&LYAGOyDC)(NRueb$it!?tm^4b%a9?0k*Oaa)1>?{1qKOB8fIrGO z3&??J;%;^(Z$946yw9)q4*)*)Y*-8jkI^_(@rWmaoZ=Im=vb?P5@8~S{O0=7Z?y-Z zw2@&btNt@jw3>wj6-$QPDYd0%4E4j{K}-Y}Pbm+j9&(fSTTQRakU7@_>0k|c8xBMD zw?Y>#3Jlp$rk#eN^OpEJTE!_58lIAi^+mPsU<DNyS!^&gmdE&M`-9DlS2CksjfXv% z+=*U9TU7$x7g1Lv%HVl0lisTlgBSc$vnDMbO+~6LeLk0l!MWArq%SX&`LwuD`@{%@ zeK1<g97Z>b99f%Co1zx^!qM?7R_PVrP=29+g(_KRnsi9cJT?i}X2s;U2vHlhQJ+%o I5VElQ4ZHJyV*mgE literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/ROI2DSite.class b/bin/plugins/ragini/voronoidiagram/ROI2DSite.class new file mode 100644 index 0000000000000000000000000000000000000000..3b0f032c71f4256707caefc61244f767fa6b0d31 GIT binary patch literal 691 zcmaix&rZTX5XQgdU!_z*L{L1L7zIq+ge!)N#KfdgBZm6|O<e<B(iV(wrHRJGgAd?C z8D~r7pg}IX^G#=e^Ud`0>-_^j6MF^{3`djE)RkVqeL<JxGvzB!$)OakFUI`l>Y~}{ z%Fr>8VkpYNBlne@r>~XtLWWd8pBWD9|4ACsV#u6Qm$1!Ht=actCb)PAx$CGgk8sUS ztKK8#nHoAKlE_&wu*Q(LrRQ8u$9>1Y75x$QE81!xMm^z6t>a`WypsV#eTA3BRAeYI zoG?_DcwsOCC)CzyQ?(V;Xu^6g3x;hAX=E4}nK9fS!eMQdv3N;lS55tab1wCu8w<B5 zdSTcnev<wmS=UV{N>WT)qBBdXP5A`fna1%O%x8)cu;?_SY>wVoSSMYcS78HrQdExu zHi<#2#nxZeD@wmvd14iou*$^KtO|Bw7LPQLZoHuML=ES*bQ!3jwq!+dI<~~H8&y@m E0r=UHTmS$7 literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Setter.class b/bin/plugins/ragini/voronoidiagram/Setter.class new file mode 100644 index 0000000000000000000000000000000000000000..700b5f57869d1d71d0e25bd53d394dc983de106f GIT binary patch literal 294 zcmZWkI|{-;5Pjn(@vnv6z+%(5V5wqhC0HcbuevNNF_AU#a26iGLx~d=3)9T-e$1Q4 z^L7U?Mc+q-Fh0k*vB^a`#mmZT>e3{&2dj)zCmHH2)6PeYFgU8KlCesR-0Y5epAo7T z&2uEy|I$3z5}KhkiOO=P37&|eH(51BWGI4ihENv)+X$^N&D~zFY|PR2r^BSUK@f{* lR*o*qlt<u#{3%f3_H}rS{Q{xExQW&ex0&m_mG0NkdjY?EMsxrG literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Site$NeighborComp.class b/bin/plugins/ragini/voronoidiagram/Site$NeighborComp.class new file mode 100644 index 0000000000000000000000000000000000000000..1f2fd0fcf8fba2559fe1da55ebaf538cc84aba87 GIT binary patch literal 2234 zcmbtVOK%%h6#nk`F|nB@CVhoRAT$p@+ezAx(mH)61X7$d)FmVV7Gr1ROk>Z4@wlQt zB1;~Ns=pu-qDm9Q0(I2|Y!FM<Y}g?7l@Q;ZvHM8U+7gz=_uO;8bI+M`zH{c6e}DQJ zz-fG;LJ`n6s*Q?e*LBz6V(GUX*RdUI)iNrsQPYc-XAaGqR%NZ^xKmDTLq%91am%=E z=vBk6=+{fP%(AB<DsaTtHax4UOQhi%p5qEcy)~;oG%7GuXzwde{3PS>E(#=5ofxDS z1;SI#su_d8Aq^_J;s~KfLktOlP)Y)N3YKloH)<u*y=j!Hra*7ODI3*A!?onTsSL|d z1;#q?`&?2OwOaOHnKu{Ph22VLzKxqFxb$oceRy5PYXT?Q=TO5NcvB!!b{uzAV7QH& z1;?_zd>n6KK*ievgD>~s!!^8v69Qt%Pw<R19?~%E>z3n4BCR4NF!J)NS}&*}gRDST z#q_3vn3Jh=hfxch)Nl$q%~!3uXV_(yKut~am!6i9jA`Wh8FHj<)OeKbxH{>@7~aKM z6%)@9zIdnZnKcdX;T&JyX?Oxh3qJELM_+K6%cAF+MlIh3(jvTOx@H^~a7hIzefR*N zhRe9Zm^Y+t)#i1n;6A^<c$sBa@{+`gJtoj`_!57b9Z~d*^7@>y;Zr=04=}6ZLxJw6 zEj(v<YZ|WMBblTxUA|B_#pLk<<15zK7w&LZ;!Y`1Vq-qF4hBGeza~8!XGaz_9K|t# zrFMbKNz<+)_Dv(^MLJoO%^nws7oCP%HfJo^;W3FmB?I;4ifwoem--v~Lk%>0Cf8&e z2DaFnzsNdkv$k!zQ&pp0H#tGH)}b7P7+{DYJ`spSLJla--v|^LGqta9H_n~HHJ-^n zfR@=s_Yd4Dc$NQAVt_1q`LFqM9EWj)J5mM5f*ZsiyeCA}L?*KhZ5zjT(7*Xa9Nf(A zU_`2db#QYRxfdXFO=Ph8$Zzi<65e_N{(s&4-CabKt!7Y7k6+(IPmZe5EES{SJ*VH? zMUQ{rLt3`|&8QEyZJqA5y^rzU^E;RfZ84i6KiezJD4=5rqgcTh?sIx<;|w0LM!#|% z{Dukqj<fia1K=;5!{0cMf7s~?CWVR%LSvhE<B}M_WiiaY&fu!ZVOosieZPVOL6w>n zWW8_|Q?ja*rYR}J$vQ_LW92cH`}w1e11_jDEV3s?#PPmJvLc`LJ~dsD&wBYs%zV$I zXK8cIcREhG(WK>+QUP<)DW!QzBo3wPlmgrWB{gw{^!m8z_9QV9btsd4h-8k>4sOV- yJ?o5LRbPVy7~{>R=?F2>G@8lo;**1UEx8}Ur@r+Pmi=`FpK+BPBKY<D9Lj%%IxMaL literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Site.class b/bin/plugins/ragini/voronoidiagram/Site.class new file mode 100644 index 0000000000000000000000000000000000000000..c157bc907b1479c17ec3d6c2e52cf5db3eac36b8 GIT binary patch literal 1942 zcmb7EYflqF6g^Y=fVv8TfKZf&MYb)nf^S>vqiE8k;T<B0U$$i^L&`3hZb|%4e$Yfh zB8fl1A7#8VyM|I*iXXbuJ9FpUbMCpjzkdJt31A7!F@zXqj%tmnaO#${X%W`3D_zGG zyTYzY`_S4H9*-f+FmPZW+g8nXs@7`xfLA<*K8K6ye%Y0EhOv@9Z+N0+tx4fZ;eB3j z@CMIP-lnKJw%3rHq0lKWSGt_YN>D4CC&Wm_b>%L@Y?n)Gu5dickJU+rQ<e;@$Pkr$ zui}t^$dNi{NOghPSS>Cst4<J9G)G<X@(ev@YMUWkaCdneJ-B6H05@Y8VX!V&qJWZr z<rLh*qd10fTU{Sx_-J<FqG?<q=R$>SYCDDm!)OPS;uyyr#o#W(xLIuSNb$3!?YWXL z`oJ({Ac81Ee@QrerEys1a?38)$lAe@Td`}~wiGH3HpAY&pz%mvfiX2VT%mFdi&x0L zsE?ty%DsX=6?0}cL;bl>a?%F+5Z7)NRs6ufH5fFrb?$BOy@DE#uvzrAFB-V64jBzn zoD!55D|)INB0w7f0kfNletk7RjN~SWZwF(jC+|C-{?|LB`02U~^WFHJ54<n@m4O@R z_nRDGWV$x_9E7^H={97Ae-LU==zHMt1*Mq5C^`<8g_>QjbD9&Q`Mtn28PY@FstCer z=qQR&6hbe><eL6ZZt0bb(JS$!Rar@|BRvNx`b4)wv`(Z?F?5FEoisbeXeoV$@txkx zDJD)Z`Ay%Rrsp7`gNzQ7W`&j@q#4>7@iA}@Ns83jEbdbUhB=r)B}>P|IQ<=|uap)d z5zy3uAq`_tijw5RFdDZ^o6GZGS}u>ay}STbQEALmDWx%*PMqN3xth4%O;Ev!CKb`3 zyrQ;5ol`0vwa1!o#hN6nsSa3=1FR=_`VX(n2~w?CNy3`#fc1<VR=gs3P8xjYUudn( zU7l?1ve~v#FOh9WDA!78jmoWeB-F17<?%YeY9^9vC9>6qNC<DVuW#{=R;6#4eg%a7 E0B5|Pj{pDw literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/SiteProvider.class b/bin/plugins/ragini/voronoidiagram/SiteProvider.class new file mode 100644 index 0000000000000000000000000000000000000000..10613b343cd2c134090f8fa285d7c67a49b927e3 GIT binary patch literal 1204 zcma)5?QRl56g{&nEa0{UimgKZZYeBSw0~)um?kDBSWPe_#vgTn4V?<R&9V@l$0yK4 zYT}PRfX`%%XID_7Nw=Hq+}*iz&pC7E&i9|+E&=T0sR2#EIv<St${E!?$)M^J*K-|L z^_1*;a#(LE-+t}66V<al1G+%wOipBdAf0~wRp-p^`UVmLrK?dE2m*2C^z5mCcp(rQ zsG)$~b)AtwrFk{P5m))r@kb4T!~vE1hXS?owW}&^QXRQHJB=7JCQM|hpj>IEAh2%2 zKr;BcX(EjqX>8)Qfm;H**HmSqfFidyqF>xiwOn}@A??^!{nL)?H3Hf@CQ?WWtTmNm zACHF}+j}EB16v^1bh~oUmYxd!=aagBs>o7{pjbXU+7>_gZME*$Q=cbaj`IAEL^|b; zSrTRUQo%~gm)#F9<#{OCKqazC7R3U2D*Lz18fn^8Gw}%90_m1J_PX|S6*!b#-sWCV zCy;8Xz9apy$9(U9tO(y0?RpTgZlSnw*uVqIi}8(f)Pio}9n*qC4I_JsG02-(;ke4b z6XrF>qV*MPR&0ixRh=PkSznO9z{ceaTc5+?yBs$N48rMb&lJH{2~;4|y)YNT;66nJ zPZ1Bff_E%1Yfd%|WdSA8Bz}(X)<+cPRKd)C(|XIGzo(AsC!)mgmp4nHIkK&jGf< zCEn7USL6H+O61#RbrRwSwhfdszhtJq-_%*L$?gd|!>k_ab72pVif!{cz=Lp_X7 FegP~LD+T}n literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Tri.class b/bin/plugins/ragini/voronoidiagram/Tri.class new file mode 100644 index 0000000000000000000000000000000000000000..6056b515081fa06ee17b50d9efe112f17d7c9478 GIT binary patch literal 924 zcma)3T}uK%6g{)6?rLjlnOWM06r~0&>0{wb(38|dvhSlVHnO_0uKuoqBIuzX(2t7l zjDjFb_Hysc<$T;Z^ZoPr1)zar0~$l+*_#f;cwz^fny_bn;E#RL7km)#k=+S|ffz$} z$Y<R4_;_GHbcb#)WYA_;45#hC`HmZe*Am;1rOA-EA(yblpjT@SL+sY?yD8{MTSy|s zkZFstdp{j@-Jrv}p3AV+_IuoOcp&6`F^q*zV#08;#-7$E_xQvO9a{Fhx(2SctvN|B z>{y5+!N6t<enU?8EEsaC6q|BVwqVN1S+({bafZ~RKMi{Bose%cX~9bwEh?m?)4%A@ zq%oZ|X{9<DP&Wuc5mDWsn@ycjkJmq7y(-uy)r1=A$k5rE1CT|IZWJW8sY-H-#5IYo zU%Vr~WT({Bqy>^np)f}+6r_4VIWX)-YZX_uWQyrETKmyjrB$sgY30^v#c{BB<1(N( j<X`Bq8kPa&BLgxb$;DN2F_LUXl1r=PawPds?RWGGQ$&Wb literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/UniformGrid$GridCell.class b/bin/plugins/ragini/voronoidiagram/UniformGrid$GridCell.class new file mode 100644 index 0000000000000000000000000000000000000000..6f12abda79e085381ba5a22f9ca95a0036d955a7 GIT binary patch literal 804 zcmb7?U2hUW6o%ge*oAd#5o!e#Yul~zk+2Q5R~m0fG$f=ovBm2FrZ{vz$n3)Z>IE_J z!XMy|GChNa_HxZ;&Ut4h=gFD(?C(E6e*x&?t%VGsJNFk;6~>+xoRqhWbQDHvqQq2- zz`F|7b)<vOT1{LNdeZkT<Os!?SPIV<;ncer&Ez;CY|SGTCNbe`kRJNQ)btY>yeH%W zp>GJ(XIAoE#qJ5Aou0)6>u;IMfDind<RhWe_zyyJ$X)cJi7bGh=-@GI8(EYbI4Bdc zjpoqYJabThZParIkFaG_)q#aPVP~L1dA<lnQeTRZFA1eVG#36)Xl3^Q4s)hc!n^d% zZT#nV+FzrE9?MV4@QV+I)G=crIQ=k`y61~Hma&CHLNoP92>JU-9}`YfSGt>F5(*oQ z*X&M~f4LklHj5*SRUC`PMovXzH1CO*gKf@FSbal=KcL!budvhlfu~07wrGXDR%V6D zEnj9(<5*i`D~zu)vc}~vP{vDCP-kVJ23_To`nu-TI_`68K#3WI101n-Illq!0Qncn A=Kufz literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/UniformGrid$GridInterval.class b/bin/plugins/ragini/voronoidiagram/UniformGrid$GridInterval.class new file mode 100644 index 0000000000000000000000000000000000000000..1930219dac50566b21736dcf3aac7b1fb944248f GIT binary patch literal 2478 zcmb7FZBtW66n-}E;sw)4&?s1GDJB7lAfgtfR;UsQYUD*;r1g?q;c7^jOTxhPKlE$A z^pn#Wzv_%&r=95!=%48i=uF$^?7f8uOo7bY-LvQHp7ZQ;&e{C&_piSL=)+1FK81nR zQf<jDuVoyQlbu<wIF)k6F52djW3FVT%Jz$jvvS|Diybm#%T>!+H%nmz6rwN9bu&{k z%S)L@i!ZH0Rl&E>tDv$JHYxZv`b6RosxI4W9aj{(az_q0s1SCKbtw4PEV}n6Q_~88 z;Y!gu0fkQtgb@<yw1J>2#SIuZ*?==hgmG3Ob>w&k&f&a5#4Hr7H4U~Wc?`6vtN>{< z5J5=7e`?@jy}w>De`eqWLJFsHcG-GZTUoT6NprDeDa3M>f?1k29b49(G9dR?xN&qC zA7x1xOlJ8L)_gOPky#mLBrUTX8Yik|;nldg>cvYRcHwEusahL@BdO^V$e=e2rnKY# z8Fr5tthlQzjSYSyLeDh=1Gv6RH_;rAZtdl!fiLU5ToqWi4BXbiHYLzk2JX~v>2F{j z?iy&sC1P1u=sbj7@6Ie@$1K`4<|9(AOjI4ayrj^aOyzdlz|{_h!45dHSADl;mx`7X z!5HJtH((Uw1|H%O9p7T>RfiPf$^Fh!)3P;h;0Y$U)m&Y*%0-3NWOjdKFT`L3Q_OHr zkDPoeCubBcALM&qxLpr(^sq1=!84*=5J%q{xQF`@JZDwSTPv&8%>{+N!z!lk1sQZp zu>pP*<mOG%5te}loK%=Pj-#Vxj8!VRUY1;6R%n>0)SQBK&z5$J*5T@rOeq-Ia@lf* zOXk{|#UvZ`?;Ts2uMgkN5I?>&93gLyp4sqvW@mGb%6&LR<sIT$bd6}@`BRjhB0vdf zPpAEJTZnEUmQKG%^Dk)GLaQfU*h2d|Zt~%CjxinqzM$Jq#BqsGlIWnua2?Uo$(01T z<OWfv2{lMfK7IZtg#B+2I4^Npy+teIrrW%zKcmr;xUEev!~?G4!j9>}8wBG450qbn zYS96@g;_qEJ?LlOJ;oIctltg311wL#Aq_T<6eXWPLz<E>nnxF<0J<s9A(9P4{X;Rx zS$^<|Fm|AJ=0NSN)~Y=o=u)t{S@@F(Bh=Ko-t*O2a_`&k%{MAP3<PKx{Le5{X9(&O zg?%Ri&j&*KjAyDlLsOWf#)I)tJiLvscQbpA7YC_J;2NLD0gU51mT?1B+|)#lvcw2- zhsYX+F`|jA;Tv2fkqJE0<OX<tSd$y1m!u{)L|=`XToNL!>s|gw(k>-9$4kWcwZ6t9 zPEmgCuQBo)MrUIWJ|HLNZ9I-mZev=u1&Xqobyv|kOS@~Cr)3)pZ)4xRrFXYXnskb9 zqXk1O{X2DaJLla>(jJ8Ri)QdmFg=jpQz_&m(p_6<PJh6n2*q@3n=ttii*6}C;DIsz zx#rkv<2XxK(j#suCUzK1XttyP6Phh4z=UQ?dMu&YlFoUE7aouTOH(xQJwUos+gRF7 yr3)g@txpJIf*>Z*j42J`q9!4}10t@|C?MiGjeaK5=E{ecc*R*BE&hL?1pEu9hyK$5 literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/UniformGrid$GridPosition.class b/bin/plugins/ragini/voronoidiagram/UniformGrid$GridPosition.class new file mode 100644 index 0000000000000000000000000000000000000000..43775da66cf6e98d2ad89a6ce54dcb71fbea996e GIT binary patch literal 1206 zcmb7D-A)rx5dIFW-L{-!#iAnqfK+U^*p?p=0f`Al(^!8JpjTdax?RdC+g-BT7JLbx zz#AXI1fuc62k?=+P-mpk^#*J<XJ*dKcV_0y`S#n7FJA%7W8J`zz|y|cZE80t`HGY- z^*rBmJ>Af%>8o~W+toXs-+t=rMwZ1ZFVG$Bxdx&F>6YrLlB3*a>1DlTTO9#$NUK8Y ztw5}^tAlJ=piuqqBC7(%$+0XYSfh?Q>jGQ30WzEct=WFZK3vV$1fm;W!%jfpyhIX- zBqF#VF^o}xNG@OFNJb)#L;{y^#lU5O?CCc-NiJ~?<1~ZENlf6nfolT!)6a#*EO7%j z1>(xG>>$X_3ls;reg1dRDT!O*EDL;>EcX@TyUa)!80YSC68SK2k%0vc$2fdfqKMMp zZs;)w>!!k4<|NTAlx2=4Ue&JsqT8<9{+6mcw!moBvy@X)zUF=38D%aAET8eFq4E90 zQeu<n3Cx^vyiW;%)MiInd(YK=zkG7j>-v`cM011bP?aJxUqDt|*Y-CY6$Cc5DZ_sV zCTWrp`qQGcXznDzV<nkpPLWD8>u4`%4MUPnk@cO>eD1(39Am`%gftr$&DkT26+Yu? zlf<O=?ikbTx=p(~e_W<{gz5K)n-LC^P0`s8NSUmojT5KY2QZie<vyUy0P`c2j$nc0 z3Pwo2p>`CtS*M+aDKxMM8>`sCBQ)_0yV!=tYqSWp2Zz2M+Jph|Y>4Cm?qP{ETlcX{ mz6WHFA^MXNL<|T669!?C8O~5}g@QwrevNdJCL)MG4}o9PYAy5t literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/UniformGrid$PointItem.class b/bin/plugins/ragini/voronoidiagram/UniformGrid$PointItem.class new file mode 100644 index 0000000000000000000000000000000000000000..d8ced8706dfb9616c19021e7d52c40b84f2f722c GIT binary patch literal 710 zcmb7C+fExX5IvIwmTX-J;Zi~ig*HMYNLd8xQ&C@#KuA$R0@7zEaZ{s>H}Y;!xP254 z5fTr403U@q4hZppxM<~>@y?v%GaldGUEcs$!*>rU!g?p{wzP=@E7|GbII@w6bW_Wg zmF?ir=)aL|Z(H3g?nT-pJBez0$PjWz@>m9;G_7E_exw=+VW{IO2uszMNo&d`s`rzS zF{;P)KVGSSRs_R`lYcrct`b(>PQWnl9#&+64Q@I4MW`&lgP~Mo<(pAcWx>}V@BzM$ zH1Yxh6NL0~spc|M0$KPj`Xn%fVHXtyJd6;=s@kaE-F98s16dChAzzIeGOS6f-TvWc z#wjKE`%%|6)RuOIxhJ<#aWf!@9b=T;3}qav*ux^B^zs0nP!O_@bHxHnO!MQ&@M6Vm z;q<c2xn9`iT(`U@UIHK4k8<<}DgJ;$d8LoB@)gEiFj=NPrk$C&<YWr7Y-b0wJ*Gcl m%2S4)VFKrv!392ZUJR%U_%b*)g}DK89$(q}oFf+b4fqeC$gki4 literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/UniformGrid$PointIterator.class b/bin/plugins/ragini/voronoidiagram/UniformGrid$PointIterator.class new file mode 100644 index 0000000000000000000000000000000000000000..62dcac846177a2f22b9cd5822f6d8d12fbad0981 GIT binary patch literal 1580 zcmbVMTTc@~6#j;mZh_U}4HZPuR_R4477?)G4be2IXo8TaPs=jG;&!)gw*>!yFUCZD z^3Cg`51K$UlE|AT{wU)&ON-SPt7&G=IXiPM-*?XR`;X6G0OT;Kp+#V%Y*!a7r;_yy z3M;$pdamPI^OmvT8KvxuW8HPV(pArzPuy@V$1nKOGkn+65EkfMGM0_3Z8!_r>vK!e z^fg2Tb_QRozGY|Yw*^9F-xC-v{(HJoULfKxT9w40K&JTsbkjE764Vxr%9LF3Sx7Q< zTOd5)&dW9sf({K)fmqRU<W#jZC%v1-oGl5X=$eK-Yj~EjYahcZqQF@5W&BPXi`q8r z8|J-hM!6o+3F_LNOcnp6Gp}L4K;JJur`+kPxj1Rdl63sZ6;qad%XQkZ4?Q{#pqEUY zWf%Q(0nXVr9KvA@eF8)O!MlzlhzqoqRo?}U{RQ)^^nAIJS2>UB=u)JHJV~-5o-Db` zQbS6h{};p=r&2AKT{_KQFRP&<k_Jdg^au<l|B|#}KJ$e_iiibH=;%OuJ3{DD=Ae!? zW#({7!;nC#X)1IK<Fr83FilyhB!&gdf2k*R=T7t0C)5+0khV<%M{!2Om_V-SO1Hdq z<Q4Iepl9S>tZ)^$9tgBgyH(GWS1dK%oej(lsHO<$1;>%zgl$wRs%_DFMFMU0r(fdu z*7e|T0DWXQ#MR0j>M3#WRD@G>sy@&T^IXR^?%QddqZE`K=~cwOqBZ<3^p0i-JGe)J zqlef@UEjQhUD!=)PjE-5j&@-$cNObCTKEGJD%Ll2tYhD;kLcb|<|+;r)0;|S4YADo zAb?8J#cF{^toAWtc*1B;IqJ`Xq+OfwYDxF9>SKsATP=NzYCn2w>2tiSphVY^WZv`! z^_B)4&l_+=YazjRnyL9$i8@T5csjF&<LQqWP)ar}SZ_M>2`3NadULB7q4{AebT>%? zUJ%1e^8AWCyk_V(MDR99*B5jmzLhSHvltIh#mW6RPg`(4h;{)NDZBY)l&|9w^+S{s Kl$<?W27Uqwf`W(u literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/UniformGrid.class b/bin/plugins/ragini/voronoidiagram/UniformGrid.class new file mode 100644 index 0000000000000000000000000000000000000000..7788a035447a78a7f92a2b2e9cf8c85556fe553f GIT binary patch literal 11951 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 XmiK4i?VK)szy!YatY!t@+?4+x{Y2zr literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/VRegion$scomp.class b/bin/plugins/ragini/voronoidiagram/VRegion$scomp.class new file mode 100644 index 0000000000000000000000000000000000000000..f0e5bc2a1384f253913fb7a4aec58e6146dbc265 GIT binary patch literal 1448 zcma)6TTc^F5dLPj?Lu9o(u#OTx%C1p;58{BF-=HFDw5VzeLO9j<zU$*yIcN=J{f-j zFFpu~55`wby!|2Lob6(`7}|&3bI#<OnQy+CbH4rg^clbs9vjdIrQLSNk#1o5f){D+ zdA{d*a#IS&7duv?W;@bzCxe!^vuhwh$ZU%}VYP+pSkIc<b}KZHBIF`#CzNfg!bstZ z(DMnYa7zZ03xt_!UwO*xvdlEX6+$uJr%$0lNL0K{dk};n69xv-&@pUc5E+7=SAgNF zbnW%dPSf_Ei)Py<j8wgrXg7o})j2jM6k)<#f2q5&Flj@{BYcip@5OrEmd;kw^UFO_ z{KFO2(ip=v16K*t=c{<+W8yk)5C$AOtazTk$@=FDJ@RdM(hbXL+`_nl+k}bpQ$=tS zcW{?LuOgLKmGh*DsmS({paqMBzV%S}C2n9n6s^}!#cte@nSAy1#Ffullt_eG6PGbc zc+o3qJl4H>aANw)g@(#usj*5E(si%nx9nA^X330^^NK2Aur3`}gdH^ywX<ZqmQ$By zxkrDFdRt!Mc{A5s*Y+!I5d?N%;2~k^{C36s2+8OsW1K6|`AdQ_8Fgd$Nk~9brLpw_ zpYHQX<279@eS}#&#KjMM(r}6YDaL@lVubgm+Ot;{IbKOMAdaxlXq|1f(gCg<;O1<1 zdHW7YZU3b0&3hyhv2CJ@n>da;vUPF#K1bCfCZk*d=sR-s19|$1W%`8;`W-PF?`Dsg zF%L{*CSqGdo_87w94CcDE}P9}o-p%b%zTbL74xBD=?lhY`8z;KB|TO?Lsj`KQ3fpA nT<kg>7o94W4l)0K$&{=*79#IOeu-6-dn~w;k#7?o;1RUHEvj_} literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/VRegion$vtcomp.class b/bin/plugins/ragini/voronoidiagram/VRegion$vtcomp.class new file mode 100644 index 0000000000000000000000000000000000000000..91bc2139580a584275f9ab14946ebb1541a5dae9 GIT binary patch literal 1289 zcma)6O>fgc5PiE&ViKIzlu}A5r9j#wP8vhSEmb8HsZyl?5-AbaO=_hsjvYCh{1Z4K zenBoAXeADaGaNu5{tjZ+aS^mg&S5;B(R{plGxq0SA3g%uhOL7$R0rOu=lVlC6r@~x z9E5=%xQDLjg`#h_pE*4@@C#$v4f+EeDF*XcjD_t9zh^(~96Md9Bg3#5c}LRq>;^@O zP{<%;$jBpiSh&wnY|hlEPANNtL+&zIr5SU|ZH81MICQdL$Q#gcDF+Sn2C^_2w2}&# zZ@RwoWYq6C;eqIQ4#Pq-=nAhbLRZ<bGo=7C)MjfP^FpX~#g7Q7?DIs}PACtK94YEa zP5uOy_j6drijEt^WCD?ANd|6Wl_4!vtB8d?20nhkP@cK3O4ue&TT*miJ{E(Rq++Rg z{s`(9Jqk3#Jp<RU#PA}Kmg%V_lJd_**2`_xWK*p=$B=6Uqp<7jxoW>ge7rS<l_A@5 zd%ln(wWHQWv{TQy1KydLsa?7OW8e3ku;Gc}&>8C3V%SL7)pQoR`RVtCb(%#ZNrRcD zx?}oMQ{ZYi@?IwEAz7Ss&Z@kJVVz>`9a$V#=$WAy@Gn@PcSF5X)>SN$W@-m<g)v2I z<Xfwp;Chwh^&6!5<ji{Y7U|SPn^1%nRb3)9;9p_zZ<yoXvBG~~mH&*otWPV&U8p8* zk*LmVxJ|-oqG*D-y!nVQ+=(%4QJ%t(w<@2oTqQZdUDfihK`2xWLc^LM0t#{JW(+@L dRZg+-|KSxu8j4YN3FSyzsE}4P(oYXH@ZVxRNDlx2 literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/VRegion.class b/bin/plugins/ragini/voronoidiagram/VRegion.class new file mode 100644 index 0000000000000000000000000000000000000000..1471d6510037b85c21b50270484a41e4fc600eae GIT binary patch literal 25001 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 literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Vert.class b/bin/plugins/ragini/voronoidiagram/Vert.class new file mode 100644 index 0000000000000000000000000000000000000000..a7f2842be723e3e3eab46053af7e9d87e0479fe0 GIT binary patch literal 569 zcmaJ;%SyvQ6g`uqt%<3v_5FUdi?#~`x>Vc<g+dWQ3AifLHq?=}Dd_|KCpUscaN!5| zQR11j=tfG&oqNwc=iHmg*Z0RKfKwc#U<e%dJEOMh4ZKM5P~JF<!d|FaO12}}_52_j zreF!==ksnt)f);}<GyMMh^j#Hf_B48fkd%VDf#SOg{{DWiA5JFxB_Oe<l7Kfa*;un zswch`jpSUc#K^Nirlxwq^{CqjqC45>1nkzrrtJ7KQo5dj*6=|M1PZnJd+P5w7clCa zWz=cUC8~Plu8Rbc0?utXikd-1=}ESxpFGO3#1T0r?~O7|WM(o?VS&+Rbx&OPGv#+U z<@^Nca$$nyS3(9>8FR20d6$&fe3sx~jmY6thIMSPq5(FMrK!%gm>KaHcQ)pXr|u>6 rm_KueG{B{KIyTjGl4hp-2iTq&c)td3*m)sox?M6BWd9ZK#jO1wg~nSD literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/VertTheta.class b/bin/plugins/ragini/voronoidiagram/VertTheta.class new file mode 100644 index 0000000000000000000000000000000000000000..8c6215f50d340169bcd5217814409fafe38380f1 GIT binary patch literal 1264 zcma)4%Wl&^6g}fOZ_^gH1ZZi2zVax<G%P{gAR<MIU_lkpRpq2s>MD(q<5ciZ2nmS@ zi3K0PM<LD~N2PLI!D8lKkMBA6+%xm*_m7_dTG-FSP^f+wO^5z?;)E`P?_307Fb@0^ z-yMeTxzqE)=<w8w+&oN$r8D=!bw=)Z=)CQpd4otnedKC$eNxCqQmJ5g`#k7K(o)F1 zByV)U-?etT-cvAN1t(q!87x__a9bf$tM`gfShkQwPO>`|^2jMHcKxyUW_sTD!b7(| z@)YcDFmOjbH}vIuerQIg{zReP{m)@uP}(tt8^=`5?rrJ0VWA*B3llFMnM!L~u#!2C zxZdmPj#TejD54};%|aO^jz`>U4sO;uGNqzeeMAdP{vuWaX-e;cX*lrOzRa_5>2Oob z#bYvNct2SfVg@rqtk9A2bYx>4*_N?PgoRt&7x;C=dciL?zH@EOU^ljBSox{}749}n z?gj2enSh`&?(*bO48uL#=NAdE%63X;Ys?Jh1w5FyaTw)aw($+?UzivW@))q739Yzb zPN?vZEn<xatTv=t^sWDuR???7=U&zfmAL9sQjYFO2Zha4AuCBCl~f^HsbD(^UQGoT zu|1#Sss%fr6BcZwg3GDkY7)Ge3a+DZ&A+u7c9Q<>(!Z)^xbEK`FI@b4lFn64ay7`c s_Ybb8>Gx_Uxtip1Zs3ZannE+3>&o+u-$;vG&u`$8$0{>A`bwVt0VWZH_y7O^ literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Vertex.class b/bin/plugins/ragini/voronoidiagram/Vertex.class new file mode 100644 index 0000000000000000000000000000000000000000..83c1f0f44486d7afe0fa146caaa2a756c864e498 GIT binary patch literal 6099 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 literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Vonoroi$GLscomp.class b/bin/plugins/ragini/voronoidiagram/Vonoroi$GLscomp.class new file mode 100644 index 0000000000000000000000000000000000000000..2fc052d62cc3754d5bd33591508bd6009e2c3fd5 GIT binary patch literal 1324 zcma)5O>fgc5PfSWF$qp;N`X>Z=tsVt)HFf}HB}`Psi<lwhoFcaH>nj|96MS&{U>lj zoH+KvfmY&xIP;?rvyO|PMM@64>lx4Nd-G=Y=dW+y0W{FipfJ=&?s(vMfh9N{j&<q_ z-}9YghYtiFT3s@P@8n;!gT6l;X-F^_C;XIKF82o3tKNy-4>hD179#IBbX==NkzDZ5 z7YwQJtrO%QGnCphAvGywhlqr`4At_CIh8I$qU9gkX)t7UXt<Gqia8x=7z}Dz2F$e` z&psRvd$xGZd#=qe-}d|5?Q-ErJ9Z`{VFqh9=u2UUwk8GQg6=(-%G(xUa~gn*sqAO4 zh$Rj88P=!hNAWryV3~m(MK$lq+=n_IMZPx-O0dO{p9NROHb}}&$oubJ@=>f!socKW z`{s3zB+XFNaR+x9j;4w+8L_E){5y%wN>`#(WQ#KlnT|geeS6Q5ebwWs-IQb*(j8~u z@o+3#b9kNZ#B*hEcV<y(m%6U+d!8*?E)N1b&_IJ;n9`?79W*cTo5Cv9q0&l%8HSu) zdY%a=vM}=AB<l%T3Z0p%`4xKg0=X|_DY!*@iei9e%+sz%-x=J-0$EHpAim)<MXTi7 zHqUXdM(e{zB$cyE>-{Gr6Vh6te=C3fMb_k>dPdo5gjghIz&fFAAcs7bP$2vw$|#{q z`%_f#3}(b=b%Gi*B7CZLEn>M%H>?q>4Z16ZL@t}n8qbMwK4x5}OvyM~HGg2SM(Z2} wN#gIa=?zC77$8!mIJFoTo2r@@DF0t7DW^(w<$We<(OJhPol<mq|JZ`^8@{<js{jB1 literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/Vonoroi.class b/bin/plugins/ragini/voronoidiagram/Vonoroi.class new file mode 100644 index 0000000000000000000000000000000000000000..f73fed301a91ddbc16667025e9c358180f22dcbe GIT binary patch literal 7012 zcmb_h4SbbV8ULU6-raY*90m><+<|jCkbU7qjPRnEvH{Bh8xS$k;BI>v7w_(!_ukEc znPTD>;ztP?ex;U}nx)A_Ax){QEH%xKG*c@x&C(*x(s2Es^WG0If4unnx$VB^d7pF6 z^E~JIK6j6Nu;T#$N2_`pmcqooSbtA6o@z`+I7Ax<63Ik75$%pfdXkae#wC17CZaa{ z3L{rX1|p5INW7<ULFa0xE3IIsqG>1EJ*c2s6iVU)PBI<sa#9L`w)VM^)GCFV*8Ovs z8;PxK?(T7BaDP`Ko=QjJY3{G}*fuM-l>3Su?vF)N6v&I4aBAgB?y?7xPERxuSD56% zYso^hkb45ofMdk-;xord^g8L}8rgFk^_rfkaI@E@yl@`!6wdCkFekXjvb?ahOBDRG z65UP^K9p;eVT^*WrgljQ6hazB2naMzBZy%F9ipKzT%bcWN-;v9!!$<XAcYaF(YQ0e zzqiv#E{=4@9EGyhL{}uXB$ABEdlu<WuZq&%o;GkDk@_rIUNCoX`CcwlygYBw;-0Mj z6^5k}$@HAoMRe4ZjRu9u`}fDJ$4{8kn(9jQ_61RoBSjO93LRbs%<i4xq3;i|m{GeV zh$)zAGbk}>|I+16uW<}Mr4a0Ka);yIn%ZSvtQnv)g7`F!wJ|*x(*5aZtntKTGO{M6 z5e9Ya7o{mQ)GTZLaL~_iF=o#!DkzeSq!US=fxARu3XNVexTef$nC$Fq*0J#!g}VJ~ zKn&TIObkT3on#Ov;3P55ERofNZC-Vh)kd>I_5K;PC8F_k5KSl->&(??!DkuGaY=b} zScXMQknY~9F;Bw8xST|K5DU<5qfOz6{WHjgoyI~TpxfGIdo&V@u4Mq8fW;c0gQzv` z4AK~NHC{P!z7y?P)k$NBz)LkcaEik4l#@OwkxnOiMRVdL9(s~xS(iLj<1~DMUe;*{ z$jNysPdN;QAXcE$M#Q_sxY<>sOT@Jk{b|`Bgo7R%D?PQCOPU(1j24@jb_!ZtfYlnO zBSyk)?M`oBdX2H%DPp9!MgsKLqPF(lsFVTEgBh2gc9TfkpbvN$IA;%ye&It8NzY0o zlHKA|XKD<B!l(`-&}_k-rSV0BTPmmjlEyhWm-()_HRh~LcgDLF7I+!YmC(yk@-<iZ zoTu?+oKFQcw<hU7^t6RuT=M%r7NZL^F2qIDgJDCff0CSXx~6p;T%xf7moiv8qbbv; z#Jx^rT=swh!()-Sqlv%EG%lBfVa1FuU#amGe3gfv+uW6OA`(b#UP2jKEiE5Q$(uAb z<7?z2agbuRS6Jl5CvQ%Vv*p)G!E*3*jV-u_*&)S5=_FlE4}9{>JfzBIn+3Q|<9gh{ zqqntpJ26L8Tz|mQ$dMFo)VK*ZGv#)hZt`TW?Fa5Q4Dbc`mc}jEY9!1V$I}V&N<R=a zG`X$Bw>54vzL%u$Ex;Wb-@%=x!myGgBVB2e@4O32p0}9$dm491o(Q=4NKoI`xJM$| zmITFsmYko_*p7RdwwTBlC!>AR_?_jY$9(j99P(qY6MgK!4{Yr8%+|TXYTPe1FCcdr zXHdN2hZ+w`Z3^~APUi){Meo2ajUVC1TuEnR)E`J?%w~rjcv$17Vj;g1>+2O&{#@e` z{DM3NmOJt8KIuIa=6UHYn;|^3X1vsm*+(@VGcnTK>c)uh{*}fP;vdG0<Sr`vwZ>DX z-$^iAN8@7IXEdJ0Z&)vB*=DvkH3uf0%lLVX-wF>m`I8AVV~Rzw;Q(aMwR_Sj#+@@$ zrVa68o_7^0InBz?QY)VUmRoi+e5Mn850V~L&0A-Zjf#gXZgHjHeZ3?aGZopNG(%C$ zeJx75@5OHANsy|dXH4**Z0yKhZBaVXb^5$WpSc^^_=m#b`|lxTqg=ZFsbM1!#5;J` z#=ktbiAQMs8~>5)?U;sZekW!1*R+VaR^WY&|BA~?6fZFz?|lg4X3}~NX$2u&Leg=E z5~hO6Qhr<c6iN&CiFuLqDy@oCfP7PDNTu@EG}Shdf-2UkL<QaERi<)Hw=AH1Q<T<f zxU@<|18aIC4ALoTgjOSS81dIBs!Xd<>R|VT1N8QEgd6-dvt0`1T8(kn4`wNZw5rHq zTngj0I%Ho8{HDW7u~$^g=kI_bD>k^Qlh}w%b;?87Se<+X7bW_WUC!*N<UpOh^&Ke+ z;A=}f?j&c$BB_+zChY8W6Nk~5K7K#LFK6VsO~?|<as-M|V%~ZAHY2azX5_`&jJ$Sp z43I(@M)7$t-!3+EfJ5uHV|1Nw8^+c(Y(qs|{WgrRo4gH`bs_&YRNZ9=9L{GY*@4^r z7)^HNyw#84+gSdFI9Gvc&K^V2ND>n;k)uFIP!t-S&?E|H8K{P0$x#kPEd}#)zK*n9 zu@>`P4l{Nq>O1Pxc1#Wz*WH7P42}vF--~Glc}fk9>7*Lw?wN*vx#2K2%YPVoABW?q z9>w`Ahrk9ZVkF?}*ohN5g!Fct*t!!<9osQG$7_!NX87--W=`gUsto4Ky7~+jW$<}| zmGYXwvJ93J8lOS8%*`Xrwb3omF4P+?Zg^OY%A=<?WN=0X1EFF*HeZA4z27%&!Rzk( zTA5$F`C2^3ot4BHChpwX;UJOYL%|Hzg@@(9_2Ga416*`*c!YuFNf|f#GPojK>aGlx zW^h#jy!t^TJHq~l=>wEpXkP0AAwP{zTHn~1!8b#tS)N&nw|+Fm($KIB@)XMrq0)T_ z869o?;02iyHK{EwbbH}U-wliE_BkG@t_u&(VeihKl-TuQo7l=wAS9#Nvp$1ua*X?U zuy9dbs3?O6a&r&)W#%V>`<cO!1aW-sh2x4}a<WR$qKokY2u3tHtt1r48qjvfP1m9R z|8QGSm&L6Ox$D+$x*p}B!2FOM4oo&uliaP-N(=*vzn9TQm-q|z(gk~s@Vi3XI=ZC0 za0Ig;uk$J{sS4?w6}3^mh+@oWn3aZx7mT!Lq1oUXDZg&(o*A-KJ{deN$`5Wuwdn34 z<5`uV5%Th622UH3gt;VS+%kjbZW(%3LevMQ3{{S1!b|y8;HgX+5mcd*d8~`cp&JcY z$#0u_xFU*H-o)E^d0vJTX9jp-Ka=;gLAKmyv0pu#ed9UUg>&&J*5Nr`O8<)Wco!F{ zVYpZwj7!uc-s$SGQO(3<ss)#;({QEg<E5$}SE)g4Qs?1nwE@?w&A3V3h+EVhxQ&_R zcD0L*$1}KFy^M@{mA&bExX&uZPHPPAx2o`fRg1^1qw$0_8&6tsJY}7Mr>%ZGV-4b2 zYaL#&F2jq~wRp+eir1|B@w)W{-msp>Th^P{?X&Q<uN-~85cc>QFyx!6l<!2sOI49c zRlAuunS`>bO8e&F1^kYQs@+$N7x5A-avO=43Hekp`tW-~e(N#Jbs_b#nub3RS46Gc zjz1C#sO@Tb7TTp2;}zm;jP^C*Pk0r@JjpBgGm~El_4yE9;}}#Ms22nIYH^ecQPUZ` z&e>t=MrzQ7Hmh^-7vi+KL#@Uegoe`!m-17BQtDu>3(-0^;BR;nBdD8;T*x<-1;XI) z7JY)XX^2ixVnf;dF3bGb{Eh=dXv|@4`hxrzeA)3sI3FY3^)gfVG!fpxKUvA~@4)+* zJH(eP^?m3Ju`ZVus0f+dUlT<UI_@7(HiX!RIOdje&%Ud3oQGJ%KALSAhV8{Rdn|5~ z0;uEyku8187&THL$JH~ic4zQ*T?a@1if!0UL}h&j?-i<F8S5le35rz^WekK0Dpo46 zTLH)AEATiv$sRJW<jcq`qwBJa+NJCZ?Fy#!4`j?>j=kc7CIPEA-m6qbNp7t$Q%cHB zMMjmb%&3D3*wHR_EV1JX;+bZFeOHk>2*Xtw#;Q@6phhFioY2Ppsvv56R@AXLR#hs| zh?1*zR@8fVOldo2)@Kxp#@gBLI554a!9`4GosyY>>47o+i7Vx^dQ4zU(Mt1J-6^NI z;!aYqBqLEhY*5r8R9hwg6;VaC9foREZRDBja>}c2Cg((T<gN}UWU-N$rm88UkL}I` nHGz<y4a{UUk&s07ICTV}0RMe9NjRz+Rm)LsiuF*c4%Ytw)x(Rn literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/VoronoiDiagram$1.class b/bin/plugins/ragini/voronoidiagram/VoronoiDiagram$1.class new file mode 100644 index 0000000000000000000000000000000000000000..7d58e8aae4c5ca48f2bbef413d11c35e1bc5c0af GIT binary patch literal 4706 zcmb7H+jA4=75|;Jtd*tp9Ycg^LKBzRm>@8XGnNSiY?Im;Y%Vo{G$d<zD=)SsdnFkR zC0D?KmLv_~9$Fx2oF*wPE*1m|A=8&Om+4IV(wRP`Y5UO0KhTH9J!e;vWlDU}jJ==E zckY+pS$*>L^;-aH@UaSou(ZE75jG>SfTi=p3=BrCXe4TOnR?jL`vM)#*GA`S#c~xc zLb(|l3iRt{ByL!NHJ!1zrHA6}&Ub=4-fhMzma*#A+32n(<PYk-6_G?=f0R|n2-M8l zR<c*|RfL+#*{N%;>L9opqFqKFSha>+xaCx+L50VQ929HFLkS_LQdkRH&4{rv(bs8M zTlLOfgHX~M4e7ldx@F4u6wxKo5thx$nTq8coz@pk#Ef>!h{cR9!urbAUHYIN(09iJ z#-I_22R6uklN{?OuEIvNFVHRtscEclmBfei$e<nzG>3*7>{ESJhZpm)Kt(xW$!t=t z;aj+u;L$@NcB-O=&@{^=S2>O*;%0APjb-UWt!6A<@5Msguj1Q;Qai-S*BTx`1zR<_ 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 R{1z{K`Ay3&Z~WxX{{R{HhFkyu literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/VoronoiDiagram$2.class b/bin/plugins/ragini/voronoidiagram/VoronoiDiagram$2.class new file mode 100644 index 0000000000000000000000000000000000000000..7ee89814ccb6cf9482a2ab2d5ae2481605467144 GIT binary patch literal 1640 zcmbtUTTc@~6#k|y-F97U1x2lhsH>E=uux2hDIuB)iAmK5NE3}O)9qM>EW2cPTVwx+ zKg7gad@wxwql{;^7X%wZrOoc1nK_s5d~?qE_4~(90A;Lch%qc5I_;Kp1Iy?1kygj^ zJ=c>>$y+`@u<E_#v)<AyYe+C;_j!j~4tHDDtH!>tLk&p=bKr?L+wZ)#Z;7tjv9`K( z?$=}x3Rn0H$#72w<_blw4Ghi`x<Zy41TfrWSj~@Tx>#pORK2E1gJIHuhLnytG6vGf zGQ{&rAybpCc-cN^2!EG19KkSE^K9-Ac&XO?&4hx_urd|`vrO<aoxZ2)9x*4H3~!F} z7{ys-ycjP;xaT!@KOBmR$|t=eTP_dVK4tRp>_8j;9cc3+7<J?@tKk+yX`D(ha2q;9 zircmb0&|@TBcO7#DbKlKA|v@EBUikybEi$ZkB7SFDL?Zsb{S?)Rt8btua4J4r=tK| zglC4evoEnyJKdF31{xkR%nsNcg-Ju6VSS)6CKWpMQ^CMB%rNLX(Isq4)jHEB=f<*v z#t{4q@l3u3L*rt+Wwu<~@dD|#dUt4GMRmQdhKb~k>=It%xl6;T>hK^C)ZO~=ZDXEt zjMFm#md&csLBlgnPZ}!wOC&u)jQ)ULD1L!a_=d}$Xcfa1dM8Oo9Zr#KD4DFLah1MI z(MCttNsi%0<moN#D&MKXXBgjcQ~8NUestv|HUTY`jC{@a^!mQY0&}<%`A-qzyQF=O zY<m&a*?mI)lp>m>qcAU#y^1thC?4TK=?Dv7v3LqLsVdkiwFHWhRO-WB!g92mgN0R+ QrbtUAr+y36*5xO;Kk#bSYybcN literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/VoronoiDiagram$MethodType.class b/bin/plugins/ragini/voronoidiagram/VoronoiDiagram$MethodType.class new file mode 100644 index 0000000000000000000000000000000000000000..2776a301b394ef1ff036df6a52a1d45750a99215 GIT binary patch literal 1660 zcmbtUTW=Ck5dKcNEp%-w)oL#))mCAx#k;m(OKq_dxg@0}AwHeb6}B$B&9ad2uM{;l z8ja8XDC3+13R-;-dEo5K&U`c9%y;(dw-28I+(tTp5rzjxX0vKojkv?<FybxSu`Sy; zFnHDB^?0dkZgtItobJ}_gWdL#9)Oo&?2xy3+~ig@p0=8G24yRq-Pp@-lo?jCLn0>_ z0;R%EAz#Qacy{vJ3|@=Zb%t=ZU$5vohE=85(R6+<w@}*1?xl+itIz+VtdgvlGy`{y z>PBNFs=H|)=n8xa!VHm3ZdRHmclF4YZt|wZ+mT(zAo9X#*j5M(XH=ZU6oWt61BymZ zHk~=?ij{(teO`qRegy#qvkcSyg1t3FdV3JD7gPj9tfC;ou-K2?q2^qprAP9*QLXLU zPR+ItBHIo>s)@YIDirv|(}Idos0`y-!_xE3`o8Y$@_kbd+OBZ3#EBi*(iwsWQ9&-o zF!d)+T?W@x1QDXixizCfV`#`VkuY4lyD=J3G<K3dg|@ia)F~$!jSauV5boe!0CyQC z2DH*{xO!d1eLP?Ya>wEAiha~(&<2SV_7C-nn;2Zq4_8KrAs`zpykN);ruBpv8(Mc_ zvI!Lrkz}|xh`ed?Mk8@@R)gac*N!ehsAxBxivGk9+nfCL(k_cZ5bvT<wYb}KDB{@w zs6a>#-TWFAS2LESJF;875x^$H(!X4N>c0P3N!=u2dg%M)OHGTr0MJP~mnZ3#-h_q1 zfQcEQUJ*%pK7}#L8z<`}+2XhT5v&}Z@Ptpl$K)HFljgKHJR{9HX<qb&FG+LW|B0eK z9h@tcy&cRI%f1fgi*In{H9?JFk^Vz;0(WtPKAl&kSG=Li-Yfi++V+xP)vnLI$2IN7 zJ81pvF-htn5m=?R6B1!cBC1%Dv?!CXg%}u?5$~ajlM$*<dkgKAEGwGvOXs?TQM&;> zm>_QA7J0-h?$a#9ET=lSQhw&qK9`e%XU;QwjN41Uqp_c~f+WV39)?CuiUvYqrX6GT c3)tWDJa|NrBUr<_JX6>ZnUv4)7+a~C@AtZu)&Kwi literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/VoronoiDiagram$buttonlist.class b/bin/plugins/ragini/voronoidiagram/VoronoiDiagram$buttonlist.class new file mode 100644 index 0000000000000000000000000000000000000000..ba7298c4d3b57d600e3f139943774c09590f65d6 GIT binary patch literal 1537 zcmb_cZBG+H5PqhG7S2^FDEI>63qoIz14I#vDDsk!R4~yrA)1(NS=%GmJ92le_`#pR zk1<gpn)n0!QO4P8p(QcJCN}Br%-qh-GtbQIuixK)0+_|~I3k4kJ-b@69N+XLZ<bke zJ=bxq9ZQxxSuyi<b+xXJ6{<ntI=1BpadZ(9yRs%tTRJ6ktFWtzY>g2{LaY1`n5w3n zz+5f{mh0r$Njb_R#DcQrk4+P%a-9Uvvgaa043-Ep$<AC;c|zBUyQ6wRI4=-KkAW!q z1bUGmM3eeJU(RyWX0=jK-fLN~6`?=p7Nwn+o~8AMu}i}zEOdmRg*ncnPllAdRNi~n ztEe5qXfpR#*48wG*;GD`D}+>gx|Z#|vV8Z#_4djJu3<Qi>x9YnKBwy|FoGL|9$73Z zKP=I9r$nE@%8Kjwfph{tYv3ks$8n1=(H`Q7i@+U>5xRXVP+WjaGWF(+Xq(C^l?$#H z1{)WcK$87y`xVOxi@vTwqy;i{`$x8G%RPaq<CAh<Tc!nOj?ZYz5bo>NnIlXm{~5$8 z|5ABfnuh}Oc+@0%hVZsSqR+^@r5Ct+xcQ}5;)xq>*JXs={|n-DbG43urh)K8b7&BZ zS8mlSs&z}x+`wtCDLobhvElIBv0_W#*R?mA4-r>~Ysvp^P$Hoxn_ssmBKm5!o?~r} zwFvJ<I`b7GeTWO6S&QHzuQ5IYY@nZ45y}PzaEUd-WehfM_{87z4QuHy5I-=qt@k5b z{f5yK>F&Xam}-iXP0>6!#Ox6sG=m%ArJGpARtR9Q9;5+)!(joBIW2H9*#?wxJ`-gq ev2^ATi_N=Q6VXs3SPIvtc*eV?g1GaR5%~iSQmYdH literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/VoronoiDiagram.class b/bin/plugins/ragini/voronoidiagram/VoronoiDiagram.class new file mode 100644 index 0000000000000000000000000000000000000000..32ea41cc352f2d4d6fddbfcbfb188c9348566b99 GIT binary patch literal 16092 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 literal 0 HcmV?d00001 diff --git a/bin/plugins/ragini/voronoidiagram/dkmax.class b/bin/plugins/ragini/voronoidiagram/dkmax.class new file mode 100644 index 0000000000000000000000000000000000000000..837754a7213db5c06f2aa413d6d777525679c0e7 GIT binary patch literal 331 zcma)%K}y6x5Ji6_nM7lB#_<Fqg1WH5tuh-y5P~k0*;kS#_L!ulCmFn!E5U^a@K9o< z^#IaPzy9Y_y#D(B_yll)g9HKL=%pEI)2)?b5u-NN+0L5EaP7EN)pN_Q2_nL5#T!-) zceT1NR=Vs7fvE^|O9-Vzh_B>8zYu$Jx+Fx`w$dp=WEr-wO_=7U(|1E#X!poPqY3le zmfS4anbH4+QU7GtgyZ}lWS4~W!49s}H)cGTdfxL96^9TK`Dq|;g4l0~SAiahWTuiT gQ4*b;y<_Li*LG#bJ`AxZd-hwv6f<#zeczh@0M~y;z5oCK literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..16157b0 --- /dev/null +++ b/pom.xml @@ -0,0 +1,84 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <!-- Inherited Icy Parent POM --> + <parent> + <groupId>org.bioimageanalysis.icy</groupId> + <artifactId>parent-pom-plugin</artifactId> + <version>1.0.3</version> + </parent> + + <!-- Project Information --> + <artifactId>voronoi</artifactId> + <version>1.0.0</version> + + <packaging>jar</packaging> + + <name>Voronoi</name> + <description></description> + <url></url> + <inceptionYear>2020</inceptionYear> + + <organization> + <name>Institut Pasteur</name> + <url>https://pasteur.fr</url> + </organization> + + <licenses> + <license> + <name>GNU GPLv3</name> + <url>https://www.gnu.org/licenses/gpl-3.0.en.html</url> + <distribution>repo</distribution> + </license> + </licenses> + + <developers> + <developer> + <id>sdallongeville</id> + <name>Stéphane Dallongeville</name> + <url>https://research.pasteur.fr/fr/member/stephane-dallongeville/</url> + <roles> + <role>founder</role> + <role>lead</role> + <role>architect</role> + <role>developer</role> + <role>debugger</role> + <role>tester</role> + <role>maintainer</role> + <role>support</role> + </roles> + </developer> + </developers> + + <!-- Project properties --> + <properties> + + </properties> + + <!-- Project build configuration --> + <build> + + </build> + + <!-- List of project's dependencies --> + <dependencies> + <!-- The core of Icy --> + <dependency> + <groupId>org.bioimageanalysis.icy</groupId> + <artifactId>icy-kernel</artifactId> + </dependency> + + </dependencies> + + <!-- Icy Maven repository (to find parent POM) --> + <repositories> + <repository> + <id>icy</id> + <name>Icy's Nexus</name> + <url>https://icy-nexus.pasteur.fr/repository/Icy/</url> + </repository> + </repositories> +</project> \ No newline at end of file diff --git a/src/main/java/plugins/ragini/voronoidiagram/AFL.java b/src/main/java/plugins/ragini/voronoidiagram/AFL.java new file mode 100644 index 0000000..454d347 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/AFL.java @@ -0,0 +1,89 @@ +package plugins.ragini.voronoidiagram; + +//Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. +//Jad home page: http://www.kpdus.com/jad.html +//Decompiler options: packimports(3) +//Source File Name: AFL.java + +import java.io.PrintStream; +import java.util.Vector; + +//Referenced classes of package delaunay: +// QuadEdge + +public class AFL +{ + + public AFL() + { + list = new Vector(); + } + + public QuadEdge putTest(QuadEdge e) + { + int index = contains(e); + if(index >= 0) + { + return (QuadEdge)list.remove(index); + } else + { + list.add(e); + return null; + } + } + + public void put(QuadEdge e) + { + list.add(e); + } + + public void remove(QuadEdge e) + { + list.remove(e); + } + + public int contains(QuadEdge e1) + { + int index; + for(index = 0; index < list.size(); index++) + { + QuadEdge e2 = get(index); + if(e1.equals(e2) || e1.equals(e2.sym())) + break; + } + + if(index < list.size()) + return index; + else + return -1; + } + + public boolean isEmpty() + { + return list.isEmpty(); + } + + public QuadEdge extract() + { + return (QuadEdge)list.remove(0); + } + + public int size() + { + return list.size(); + } + + QuadEdge get(int index) + { + return (QuadEdge)list.elementAt(index); + } + + public void print() + { + for(int i = 0; i < list.size(); i++) + System.out.println((new StringBuilder("[")).append(get(i).orig()).append(",").append(get(i).dest()).append("]").toString()); + + } + + private Vector list; +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/Alpha_Morph.java b/src/main/java/plugins/ragini/voronoidiagram/Alpha_Morph.java new file mode 100644 index 0000000..4ecf47b --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/Alpha_Morph.java @@ -0,0 +1,1327 @@ +package plugins.ragini.voronoidiagram; + +//Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. +//Jad home page: http://www.kpdus.com/jad.html +//Decompiler options: packimports(3) +//Source File Name: Alpha_Morph.java + + +import ij.ImagePlus; +import ij.WindowManager; +import ij.gui.GUI; +import ij.plugin.frame.PlugInFrame; +import java.awt.*; +import java.awt.event.*; +import java.io.File; +import java.io.PrintStream; +import java.util.Vector; +import javax.swing.*; + +//Referenced classes of package delaunay: +// DelaunayTriangulator, Display, DT, Vertex + +public class Alpha_Morph extends PlugInFrame + implements Runnable +{ + + public Alpha_Morph(Neighbor[] data, double _minx, double _miny, double _maxx, double _maxy) + { + super("Alpha_Morph"); + minx = _minx; + miny = _miny; + maxx = _maxx; + maxy = _maxy; + load = data; + running = false; + waiting = true; + counter = 0; + canAddPoints = true; + fileImage = null; + rnd = 30; + rank = 0; + rank2 = 0; + toggle = 0; + toggle1 = 1; + toggle2 = 2; + toggle3 = 3; + toggleBin = 0; + angle = -1D; + epsilon = 0.39269908169872414D; + myThread = null; + sites = null; + sitesBin = null; + dt = new DelaunayTriangulator[4]; + disp = new Display[4]; + for(int i = 0; i < 4; i++) + { + dt[i] = new DelaunayTriangulator(); + disp[i] = new Display(dt[i]); + } + + slider = new JSlider(0, 360, 0); + slider_opacity = new JSlider(0, 100, 100); + b1 = new Button(" Process All "); + b2 = new Button(" Seeds "); + b3 = new Button(" Dual "); + bComp = new Button(" Comp "); + b6 = new Button(" Binarize "); + bE = new Button(" Erode "); + tOrdre = new TextField((new StringBuilder(String.valueOf(rank))).toString(), 2); + tOrdre2 = new TextField((new StringBuilder(String.valueOf(rank2))).toString(), 2); + bD = new Button(" Dilation "); + bDFuzzy = new Button(" Fuzzy Dilation "); + b4 = new Button(" Clear "); + // b5 = new Button(" Generate "); + b7 = new Button(" Load Point Set "); + // b8 = new Button(" Save Point Set "); + //i7 = new Button(" Load Image "); + i8 = new Button(" Save Image "); + bC = new Button("Edges/Faces"); + // bConv = new Button("Convert"); + bInter = new Button(" Binary Op."); + t0 = new TextField("1", 2); + t1 = new TextField((new StringBuilder(String.valueOf(rnd))).toString(), 2); + t2 = new TextField((new StringBuilder(String.valueOf(DT.densityParameter))).toString(), 2); + t3 = new TextField((new StringBuilder(String.valueOf(DT.vertexAngle.x))).toString(), 2); + t4 = new TextField((new StringBuilder(String.valueOf(DT.jitter))).toString(), 2); + t8 = new TextField("22.5", 2); + tvoid = new TextField("", 2); + log = new TextArea(10, 20); + p1 = new Panel(); + p2 = new Panel(); + p3 = new Panel(); + p4 = new Panel(); + init(); + } + + public void init() + { + p1.setLayout(new FlowLayout()); + p1.add(b1); + p1.add(b2); + p1.add(b4); + //p1.add(b5); + p1.add(b3); + p1.add(bComp); + p1.add(b6); + p1.add(bE); + p1.add(tOrdre); + p1.add(bD); + p1.add(bDFuzzy); + p1.add(tOrdre2); + p2.setLayout(new GridLayout(16, 2)); + p2.add(b7); + // p2.add(b8); + //p2.add(i7); + p2.add(i8); + p2.add(new Label("Scale Factor ")); + p2.add(t0); + p2.add(new Label("Random points ")); + p2.add(t1); + p2.add(new Label("Density parameter ")); + p2.add(t2); + p2.add(new Label("Jitter ")); + p2.add(t4); + JRadioButton type1 = new JRadioButton("Size"); + JRadioButton type2 = new JRadioButton("Radius", true); + ButtonGroup tbb = new ButtonGroup(); + tbb.add(type1); + tbb.add(type2); + class _cls1SelectItemListenerTb + implements ItemListener + { + + public void itemStateChanged(ItemEvent e) + { + AbstractButton sel = (AbstractButton)e.getItemSelectable(); + if(e.getStateChange() == 1) + if(sel.getText().equals("Radius")) + DT.type = 1; + else + if(sel.getText().equals("Size")) + DT.type = 0; + } + + final Alpha_Morph this$0; + + _cls1SelectItemListenerTb() + { + super(); + this$0 = Alpha_Morph.this; + } + } + + type1.addItemListener(new _cls1SelectItemListenerTb()); + type2.addItemListener(new _cls1SelectItemListenerTb()); + JPanel pTb = new JPanel(); + pTb.add(type1); + pTb.add(type2); + p2.add(new Label("Criterium: ")); + p2.add(pTb); + p2.add(bC); + // p2.add(bConv); + p2.add(new Label("Opacity ")); + p2.add(slider_opacity); + p2.add(new Label("Angle morpho ")); + p2.add(slider); + p2.add(new Label("Angle")); + p2.add(new Label("Epsilon")); + p2.add(t3); + p2.add(t8); + p2.add(new Label("Binary Operators ...")); + p2.add(tvoid); + JRadioButton rbb1 = new JRadioButton("1"); + JRadioButton rbb2 = new JRadioButton("2", true); + JRadioButton rbb3 = new JRadioButton("3"); + JRadioButton rbb4 = new JRadioButton("4"); + ButtonGroup bgg = new ButtonGroup(); + bgg.add(rbb1); + bgg.add(rbb2); + bgg.add(rbb3); + bgg.add(rbb4); + class _cls1SelectItemListener1 + implements ItemListener + { + + public void itemStateChanged(ItemEvent e) + { + AbstractButton sel = (AbstractButton)e.getItemSelectable(); + if(e.getStateChange() == 1) + if(sel.getText().equals("1")) + toggle1 = 0; + else + if(sel.getText().equals("2")) + toggle1 = 1; + else + if(sel.getText().equals("3")) + toggle1 = 2; + else + if(sel.getText().equals("4")) + toggle1 = 3; + } + + final Alpha_Morph this$0; + + _cls1SelectItemListener1() + { + super(); + this$0 = Alpha_Morph.this; + } + } + + rbb1.addItemListener(new _cls1SelectItemListener1()); + rbb2.addItemListener(new _cls1SelectItemListener1()); + rbb3.addItemListener(new _cls1SelectItemListener1()); + rbb4.addItemListener(new _cls1SelectItemListener1()); + JPanel p6 = new JPanel(); + p6.add(rbb1); + p6.add(rbb2); + p6.add(rbb3); + p6.add(rbb4); + p2.add(new Label("Operand 1")); + p2.add(p6); + JRadioButton rbbb1 = new JRadioButton("1"); + JRadioButton rbbb2 = new JRadioButton("2"); + JRadioButton rbbb3 = new JRadioButton("3", true); + JRadioButton rbbb4 = new JRadioButton("4"); + ButtonGroup bggg = new ButtonGroup(); + bggg.add(rbbb1); + bggg.add(rbbb2); + bggg.add(rbbb3); + bggg.add(rbbb4); + class _cls1SelectItemListener2 + implements ItemListener + { + + public void itemStateChanged(ItemEvent e) + { + AbstractButton sel = (AbstractButton)e.getItemSelectable(); + if(e.getStateChange() == 1) + if(sel.getText().equals("1")) + toggle2 = 0; + else + if(sel.getText().equals("2")) + toggle2 = 1; + else + if(sel.getText().equals("3")) + toggle2 = 2; + else + if(sel.getText().equals("4")) + toggle2 = 3; + } + + final Alpha_Morph this$0; + + _cls1SelectItemListener2() + { + super(); + this$0 = Alpha_Morph.this; + } + } + + rbbb1.addItemListener(new _cls1SelectItemListener2()); + rbbb2.addItemListener(new _cls1SelectItemListener2()); + rbbb3.addItemListener(new _cls1SelectItemListener2()); + rbbb4.addItemListener(new _cls1SelectItemListener2()); + JPanel p7 = new JPanel(); + p7.add(rbbb1); + p7.add(rbbb2); + p7.add(rbbb3); + p7.add(rbbb4); + p2.add(new Label("Operand 2")); + p2.add(p7); + JRadioButton rbbbb1 = new JRadioButton("1"); + JRadioButton rbbbb2 = new JRadioButton("2"); + JRadioButton rbbbb3 = new JRadioButton("3"); + JRadioButton rbbbb4 = new JRadioButton("4", true); + ButtonGroup bgggg = new ButtonGroup(); + bgggg.add(rbbbb1); + bgggg.add(rbbbb2); + bgggg.add(rbbbb3); + bgggg.add(rbbbb4); + class _cls1SelectItemListener3 + implements ItemListener + { + + public void itemStateChanged(ItemEvent e) + { + AbstractButton sel = (AbstractButton)e.getItemSelectable(); + if(e.getStateChange() == 1) + if(sel.getText().equals("1")) + toggle3 = 0; + else + if(sel.getText().equals("2")) + toggle3 = 1; + else + if(sel.getText().equals("3")) + toggle3 = 2; + else + if(sel.getText().equals("4")) + toggle3 = 3; + } + + final Alpha_Morph this$0; + + _cls1SelectItemListener3() + { + super(); + this$0 = Alpha_Morph.this; + } + } + + rbbbb1.addItemListener(new _cls1SelectItemListener3()); + rbbbb2.addItemListener(new _cls1SelectItemListener3()); + rbbbb3.addItemListener(new _cls1SelectItemListener3()); + rbbbb4.addItemListener(new _cls1SelectItemListener3()); + JPanel p8 = new JPanel(); + p8.add(rbbbb1); + p8.add(rbbbb2); + p8.add(rbbbb3); + p8.add(rbbbb4); + p2.add(new Label("Result")); + p2.add(p8); + JRadioButton rb1 = new JRadioButton("1", true); + JRadioButton rb2 = new JRadioButton("2"); + JRadioButton rb3 = new JRadioButton("3"); + JRadioButton rb4 = new JRadioButton("4"); + ButtonGroup bg = new ButtonGroup(); + bg.add(rb1); + bg.add(rb2); + bg.add(rb3); + bg.add(rb4); + class _cls1SelectItemListener + implements ItemListener + { + + public void itemStateChanged(ItemEvent e) + { + AbstractButton sel = (AbstractButton)e.getItemSelectable(); + if(e.getStateChange() == 1) + if(sel.getText().equals("1")) + toggle = 0; + else + if(sel.getText().equals("2")) + toggle = 1; + else + if(sel.getText().equals("3")) + toggle = 2; + else + if(sel.getText().equals("4")) + toggle = 3; + } + + final Alpha_Morph this$0; + + _cls1SelectItemListener() + { + super(); + this$0 = Alpha_Morph.this; + } + } + + rb1.addItemListener(new _cls1SelectItemListener()); + rb2.addItemListener(new _cls1SelectItemListener()); + rb3.addItemListener(new _cls1SelectItemListener()); + rb4.addItemListener(new _cls1SelectItemListener()); + JPanel p5 = new JPanel(); + p5.add(rb1); + p5.add(rb2); + p5.add(rb3); + p5.add(rb4); + p1.add(p5); + p1.add(bInter); + JRadioButton rbbin1 = new JRadioButton("Inter", true); + JRadioButton rbbin2 = new JRadioButton("Union"); + ButtonGroup bgbin = new ButtonGroup(); + bgbin.add(rbbin1); + bgbin.add(rbbin2); + class _cls1SelectItemListenerBin + implements ItemListener + { + + public void itemStateChanged(ItemEvent e) + { + AbstractButton sel = (AbstractButton)e.getItemSelectable(); + if(e.getStateChange() == 1) + if(sel.getText().equals("Inter")) + toggleBin = 0; + else + if(sel.getText().equals("Union")) + toggleBin = 1; + } + + final Alpha_Morph this$0; + + _cls1SelectItemListenerBin() + { + super(); + this$0 = Alpha_Morph.this; + } + } + + rbbin1.addItemListener(new _cls1SelectItemListenerBin()); + rbbin2.addItemListener(new _cls1SelectItemListenerBin()); + JPanel p9 = new JPanel(); + p9.add(rbbin1); + p9.add(rbbin2); + p1.add(p9); + p3.setLayout(new BorderLayout()); + p3.add("Center", log); + p3.add("North", p2); + reset(); + p4.setLayout(new GridLayout(2, 2)); + for(int i = 0; i < 4; i++) + p4.add(disp[i]); + + add("Center", p4); + add("East", p3); + add("South", p1); + pack(); + GUI.center(this); + setVisible(true); + slider.setMajorTickSpacing(20); + slider.setMinorTickSpacing(10); + slider.setPaintTicks(false); + slider.setPaintLabels(false); + slider_opacity.setMajorTickSpacing(10); + slider_opacity.setMinorTickSpacing(5); + slider_opacity.setPaintTicks(false); + slider_opacity.setPaintLabels(false); + slider.addMouseListener(new MouseListener() { + { + //super(); + this$0 = Alpha_Morph.this; + } + + public void mousePressed(MouseEvent mouseevent) + { + } + + public void mouseClicked(MouseEvent mouseevent) + { + } + + public void mouseReleased(MouseEvent me) + { + angle = (360 * me.getX()) / slider.getWidth(); + if(angle > 360D) + angle = 360D; + if(angle < 0.0D) + angle = 0.0D; + String angleS = (new StringBuilder()).append(angle).toString(); + slider.setValue((int)angle / 1); + t3.setText(angleS); + try + { + double angleRadian = ((360D - angle) * 3.1415926535897931D * 2D) / 360D; + DT.vertexAngle.x = Math.cos(angleRadian); + DT.vertexAngle.y = Math.sin(angleRadian); + } + catch(NumberFormatException nfe) + { + DT.vertexAngle.x = -1D; + DT.vertexAngle.y = -1D; + } + } + + public void mouseEntered(MouseEvent mouseevent) + { + } + + public void mouseExited(MouseEvent mouseevent) + { + } + + final Alpha_Morph this$0; + + + } +); + slider_opacity.addMouseListener(new MouseListener() { + + public void mousePressed(MouseEvent mouseevent) + { + } + + public void mouseClicked(MouseEvent mouseevent) + { + } + + public void mouseReleased(MouseEvent me) + { + DT.opacity = (float)me.getX() / (float)slider.getWidth(); + disp[toggle].repaint(); + } + + public void mouseEntered(MouseEvent mouseevent) + { + } + + public void mouseExited(MouseEvent mouseevent) + { + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + // super(); + } + } +); + t0.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + String s = e.getActionCommand(); + try + { + DT.res = Float.valueOf(s).intValue(); + } + catch(NumberFormatException nfe) + { + DT.res = 1.0D; + } + if(DT.res < 1.0D) + DT.res = 1.0D; + t0.setText((new StringBuilder(String.valueOf(DT.res))).toString()); + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + // super(); + } + } +); + t1.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + String s = e.getActionCommand(); + try + { + rnd = Integer.valueOf(s).intValue(); + } + catch(NumberFormatException nfe) + { + rnd = 30; + } + if(rnd < 3) + rnd = 3; + t1.setText((new StringBuilder(String.valueOf(rnd))).toString()); + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + // super(); + } + } +); + t2.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + String s = e.getActionCommand(); + try + { + DT.densityParameter = Double.valueOf(s).doubleValue(); + } + catch(NumberFormatException nfe) + { + DT.densityParameter = 1.5D; + } + if(DT.densityParameter < 0.0D) + DT.densityParameter = 1.0D; + t2.setText((new StringBuilder(String.valueOf(DT.densityParameter))).toString()); + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + /// super(); + } + } +); + t3.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + String s = e.getActionCommand(); + angle = -1D; + try + { + angle = Double.valueOf(s).doubleValue(); + if(angle < 0.0D) + { + DT.vertexAngle.x = -1D; + DT.vertexAngle.y = -1D; + } else + { + double angleRadian = ((360D - angle) * 3.1415926535897931D * 2D) / 360D; + DT.vertexAngle.x = Math.cos(angleRadian); + DT.vertexAngle.y = Math.sin(angleRadian); + } + } + catch(NumberFormatException nfe) + { + DT.vertexAngle.x = -1D; + DT.vertexAngle.y = -1D; + } + t3.setText((new StringBuilder(String.valueOf(angle))).toString()); + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + //super(); + } + } +); + t4.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + String s = e.getActionCommand(); + try + { + DT.jitter = Double.valueOf(s).doubleValue(); + } + catch(NumberFormatException nfe) + { + DT.jitter = 0.0D; + } + if(DT.jitter > 0.10000000000000001D) + DT.jitter = 0.0D; + if(DT.jitter < -0.10000000000000001D) + DT.jitter = 0.0D; + t4.setText((new StringBuilder(String.valueOf(DT.jitter))).toString()); + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + // super(); + } + } +); + t8.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + String s = e.getActionCommand(); + epsilon = 0.39269908169872414D; + try + { + epsilon = Double.valueOf(s).doubleValue(); + if(epsilon < 0.0D) + epsilon = 0.0D; + else + epsilon = (epsilon * 3.1415926535897931D) / 180D; + } + catch(NumberFormatException nfe) + { + epsilon = 0.39269908169872414D; + } + t8.setText((new StringBuilder(String.valueOf((epsilon * 180D) / 3.1415926535897931D))).toString()); + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + // super(); + } + } +); + tOrdre.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + String s = e.getActionCommand(); + try + { + rank = Integer.valueOf(s).intValue(); + } + catch(NumberFormatException nfe) + { + rank = 0; + } + if(rank < 0) + rank = 0; + tOrdre.setText((new StringBuilder(String.valueOf(rank))).toString()); + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + //super(); + } + } +); + tOrdre2.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + String s = e.getActionCommand(); + try + { + rank2 = Integer.valueOf(s).intValue(); + } + catch(NumberFormatException nfe) + { + rank2 = 0; + } + if(rank2 < 0) + rank2 = 0; + tOrdre.setText((new StringBuilder(String.valueOf(rank2))).toString()); + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + // super(); + } + } +); + b1.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + if(waiting) + waiting = false; + for(int i = 0; i < 4; i++) + disp[i].run(0); + + b6.setEnabled(true); + b3.setEnabled(true); + bE.setEnabled(true); + bD.setEnabled(true); + tOrdre.setEnabled(true); + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + //super(); + } + } +); + b2.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + disp[toggle].swap(18); + if(b2.getBackground() == Color.RED) + b2.setBackground(Color.LIGHT_GRAY); + else + b2.setBackground(Color.RED); + if(b6.isEnabled()) + b6.setEnabled(false); + else + b6.setEnabled(true); + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + // super(); + } + } +); + b3.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + disp[toggle].swap(13); + disp[toggle].repaint(); + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + // super(); + } + } +); + bComp.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + dt[toggle].constructComp(); + disp[toggle].repaint(); + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + // super(); + } + } +); + b4.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + reset(); + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + // super(); + } + } +); + /* b5.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + reset(); + disp[toggle].resetAll(true); + disp[toggle].clearPoints(); + disp[toggle].enableAdding(true); + disp[toggle].loadPoints(rnd, minx, miny, maxx, maxy, load); + disp[toggle].show(10); + disp[toggle].repaint(); + b1.setEnabled(true); + b3.setEnabled(false); + b6.setEnabled(false); + bE.setEnabled(false); + bD.setEnabled(false); + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + //super(); + } + } +);*/ + b6.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + rank = 0; + disp[toggle].setRank(rank); + rank2 = 0; + disp[toggle].setRank2(rank2); + tOrdre.setText((new Integer(rank)).toString()); + tOrdre2.setText((new Integer(rank2)).toString()); + dt[toggle].constructBin(sitesBin); + disp[toggle].hide(11); + disp[toggle].repaint(); + b6.setEnabled(false); + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + //super(); + } + } +); + bE.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + rank++; + disp[toggle].setRank(rank); + tOrdre.setText((new Integer(rank)).toString()); + dt[toggle].constructErode(); + disp[toggle].repaint(); + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + //super(); + } + } +); + bD.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + rank2++; + disp[toggle].setRank2(rank2); + tOrdre2.setText((new Integer(rank2)).toString()); + dt[toggle].constructDilate(angle, epsilon); + disp[toggle].repaint(); + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + // super(); + } + } +); + bDFuzzy.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + dt[toggle].constructFuzzyDilate(angle, epsilon); + disp[toggle].repaint(); + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + // super(); + } + } +); + bInter.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + disp[toggle].run(0); + disp[toggle3].hide(11); + if(toggleBin == 0) + dt[toggle3].constructInter(dt[toggle1], dt[toggle2]); + else + dt[toggle3].constructUnion(dt[toggle1], dt[toggle2]); + disp[toggle3].repaint(); + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + // super(); + } + } +); + bC.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + disp[toggle].swap(17); + disp[toggle].repaint(); + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + // super(); + } + } +); + /* bConv.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + final JFrame frame = new JFrame(); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + final Dialog d = new Dialog(frame, (new StringBuilder("The jitter parameter will be set to ")).append(DT.jitter).toString()); + d.setVisible(true); + d.setSize(400, 100); + d.setLocationRelativeTo(frame); + Button dbtn; + d.add(dbtn = new Button("OK"), "South"); + dbtn.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + d.dispose(); + frame.dispose(); + disp[toggle].convertImage(); + } + + final _cls23 this$1; + private final Dialog val$d; + private final JFrame val$frame; + + + { + this$1 = _cls23.this; + d = dialog; + frame = jframe; + super(); + } + } +); + } + + final Alpha_Morph this$0; + + + + { + this$0 = Alpha_Morph.this; + //super(); + } + } +);*/ + b7.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + reset(); + disp[toggle].resetAll(true); + disp[toggle].clearPoints(); + disp[toggle].enableAdding(true); + disp[toggle].loadPoints(rnd, minx, miny, maxx, maxy, load); + disp[toggle].show(10); + disp[toggle].repaint(); + b1.setEnabled(true); + b3.setEnabled(false); + b6.setEnabled(false); + bE.setEnabled(false); + bD.setEnabled(false); + + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + //super(); + } + } +); + /* b8.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + JFrame frame = new JFrame("File"); + FileDialog fd = new FileDialog(frame, "Quel fichier ?", 1); + fd.setVisible(true); + String selectedItem = fd.getFile(); + if(selectedItem != null) + { + File file = new File((new StringBuilder(String.valueOf(fd.getDirectory()))).append(File.separator).append(fd.getFile()).toString()); + System.out.println((new StringBuilder("saving file ")).append(fd.getDirectory()).append(File.separator).append(fd.getFile()).toString()); + disp[toggle].writePoints(file); + } + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + //super(); + } + } +);*/ + /* i7.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + ImagePlus imp = WindowManager.getCurrentImage(); + if(imp == null) + { + JFrame frame = new JFrame(); + FileDialog fd = new FileDialog(frame, "Quel fichier ?", 0); + fd.setVisible(true); + String selectedItem = fd.getFile(); + if(selectedItem != null) + { + File file = new File((new StringBuilder(String.valueOf(fd.getDirectory()))).append(File.separator).append(fd.getFile()).toString()); + System.out.println((new StringBuilder("loading file ")).append(fd.getDirectory()).append(File.separator).append(fd.getFile()).toString()); + fileImage = file; + disp[toggle].loadImage(file); + } + return; + } else + { + java.awt.Image image = imp.getImage(); + disp[toggle].loadImage(image); + return; + } + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + //super(); + } + } +);*/ + i8.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + JFrame frame = new JFrame("File"); + FileDialog fd = new FileDialog(frame, "Quel fichier ?", 1); + fd.setVisible(true); + String selectedItem = fd.getFile(); + if(selectedItem != null) + { + File file = new File((new StringBuilder(String.valueOf(fd.getDirectory()))).append(File.separator).append(fd.getFile()).toString()); + System.out.println((new StringBuilder("saving file ")).append(fd.getDirectory()).append(File.separator).append(fd.getFile()).toString()); + disp[toggle].writeImage(file); + } + } + + final Alpha_Morph this$0; + + + { + this$0 = Alpha_Morph.this; + // super(); + } + } +); + myThread = new Thread(this); + myThread.start(); + } + + public void reset() + { + for(int i = 0; i < 4; i++) + { + disp[i].resetAll(true); + disp[i].clearPoints(); + disp[i].enableAdding(true); + disp[i].show(10); + disp[i].hide(17); + disp[i].hide(11); + disp[i].hide(18); + disp[i].repaint(); + dt[i].resetAll(); + } + + running = false; + sites = null; + sitesBin = null; + counter = 0; + b1.setEnabled(false); + b2.setEnabled(false); + b3.setEnabled(false); + b4.setEnabled(true); + //b5.setEnabled(true); + b6.setEnabled(false); + bE.setEnabled(false); + bD.setEnabled(false); + bC.setEnabled(true); + b2.setBackground(Color.LIGHT_GRAY); + } + + public void run() + { + do + { + b4.setEnabled(true); + //b5.setEnabled(true); + while(waiting) + if(disp[toggle].numPoints() > 2) + { + b1.setEnabled(true); + b2.setEnabled(true); + } + b4.setEnabled(false); + // b5.setEnabled(false); + for(int i = 0; i < 4; i++) + { + disp[toggle].resetAll(false); + dt[toggle].resetAll(); + } + + b2.setBackground(Color.LIGHT_GRAY); + disp[toggle].enableAdding(true); + running = true; + sites = disp[toggle].getPoints(); + disp[toggle].setSites(sites); + disp[toggle].show(8); + for(int i = 0; i < 4; i++) + if(i != toggle) + { + disp[i].setPoints(sites); + disp[i].setSites(sites); + disp[i].show(8); + disp[i].repaint(); + } + + sitesBin = disp[toggle].getPointsBin(); + disp[toggle].show(11); + disp[toggle].show(5); + disp[toggle].show(6); + disp[toggle].show(1); + startTime = System.currentTimeMillis(); + if(counter == 0) + { + for(int i = 0; i < 4; i++) + { + dt[i].inCoDeTotal(disp[i], sites, sitesBin); + dt[i].setMeasure(); + } + + } else + { + dt[toggle].inCoDeTotal(disp[toggle], sites, sitesBin); + dt[toggle].setMeasure(); + } + counter++; + endTime = System.currentTimeMillis(); + time = endTime - startTime; + time /= 4D; + log.append("Algorithm: Incremental construction\n"); + log.append((new StringBuilder("Total vertices: ")).append(disp[toggle].numPoints()).append("\n").toString()); + log.append((new StringBuilder("Total edges: ")).append(dt[toggle].getEdges().size()).append("\n").toString()); + log.append((new StringBuilder("Total faces: ")).append(dt[toggle].getFaces().size()).append("\n").toString()); + int eulerNumber = (dt[toggle].getFaces().size() - dt[toggle].getEdges().size()) + disp[toggle].numPoints(); + log.append((new StringBuilder("Euler number: ")).append(eulerNumber).append("\n").toString()); + log.append((new StringBuilder("No. of Delaunay tests: ")).append(DT.counter2).append("\n").toString()); + log.append((new StringBuilder("Mesure Mean: ")).append(dt[toggle].getMeasureMean()).append(" \n").toString()); + log.append((new StringBuilder("Mesure Median: ")).append(dt[toggle].getMeasureMedian()).append(" \n").toString()); + log.append("\n"); + log.append((new StringBuilder("Elapsed time: ")).append(time).append(" msec\n").toString()); + log.append("\n"); + for(int i = 0; i < 4; i++) + disp[i].enableAdding(true); + + disp[toggle].repaint(); + running = false; + waiting = true; + } while(true); + } + + boolean running; + boolean waiting; + int counter; + boolean canAddPoints; + File fileImage; + int rnd; + int rank; + int rank2; + int toggle; + int toggle1; + int toggle2; + int toggle3; + int toggleBin; + long startTime; + long endTime; + long time; + double angle; + double epsilon; + private Thread myThread; + Neighbor[] load; + Vertex sites[]; + Vertex sitesBin[]; + DelaunayTriangulator dt[]; + Display disp[]; + JSlider slider; + JSlider slider_opacity; + Button b1; + Button b2; + Button b3; + Button bComp; + Button b6; + Button bE; + TextField tOrdre; + TextField tOrdre2; + Button bD; + Button bDFuzzy; + Button b4; +// Button b5; + Button b7; + //Button b8; + //Button i7; + Button i8; + Button bC; +// Button bConv; + Button bInter; + TextField t0; + TextField t1; + TextField t2; + TextField t3; + TextField t4; + TextField t8; + TextField tvoid; + TextArea log; + Panel p1; + Panel p2; + Panel p3; + Panel p4; + double minx; + double miny; + double maxx; + double maxy; +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/Arcs.java b/src/main/java/plugins/ragini/voronoidiagram/Arcs.java new file mode 100644 index 0000000..6ed041f --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/Arcs.java @@ -0,0 +1,33 @@ +package plugins.ragini.voronoidiagram; + +public class Arcs { + + private int id; + private float dist; + private Arcs next; + + public void setID(int i) { + id = i; + } + + public void setDist(float d) { + dist = d; + } + + public void setNext(Arcs a) { + next = a; + } + + public Arcs next() { + return next; + } + + public float dist() { + return dist; + } + + public int id() { + return id; + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/ArraySetter.java b/src/main/java/plugins/ragini/voronoidiagram/ArraySetter.java new file mode 100644 index 0000000..9c8ae53 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/ArraySetter.java @@ -0,0 +1,17 @@ +package plugins.ragini.voronoidiagram; + +public class ArraySetter implements Setter<NVert []> { + + private NVert [] var; + + @Override + public void set(NVert [] input) { + var = input; + } + + @Override + public NVert [] get() { + return var; + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/Circ.java b/src/main/java/plugins/ragini/voronoidiagram/Circ.java new file mode 100644 index 0000000..77a21c1 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/Circ.java @@ -0,0 +1,33 @@ +package plugins.ragini.voronoidiagram; + +import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; + +public class Circ { + + private Point2D center; + private double radius; + private Point2D corner; + private double width; + private Rectangle2D rec; + + public Circ(Point2D c, double r) { + center = c; + radius = r; + width = r*2; + corner = new Point2D.Double(center.getX()-r, center.getY()-r); + rec = new Rectangle2D.Double(corner.getX(), corner.getY(), width, width); + } + + public double r() { + return radius; + } + + public Rectangle2D rectangle() { + return rec; + } + + //private float cx, cy, r; + //private int nbr1, nbr2, nbr3; + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/Constants.java b/src/main/java/plugins/ragini/voronoidiagram/Constants.java new file mode 100644 index 0000000..8c296c9 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/Constants.java @@ -0,0 +1,377 @@ +package plugins.ragini.voronoidiagram; + +import java.awt.geom.Point2D; +import java.util.ArrayList; + +public class Constants { + + private int maxSites; + private int le; + private int re; + private int maxVerts; + private int maxEdges; + private int maxTris; + private int triangulate; + private int rng; + private int vrdebug; + + private float vxmin, vxmax, vymin, vymax, vdeltax, vdeltay; + + private Vert[] GLsites, USites, verts; + private EdgeS[] vedges; + private Tri[] tris; + private Tri[] dtris; + + private NVert[] chverts, uchverts; + private Neighbor [] _sites; + private int nsites; + private Point2D [][] lines; + private int lineindex; + + private int lbnd; + private int bbnd; + private int rbnd; + private int tbnd; + private int PQhashsize; + private int nedges; + + private Site bottomsite; + private double sqrt_nsites; + + private int edgex; + private int edgey; + private int maxbinx; + private int maxbiny; + + private ArrayList<EdgeRNG> relativeneighbors; + + public Constants() { + maxSites = 2*4096; + le = 0; + re = 1; + maxVerts = 3*maxSites; + maxEdges = 2*maxSites; + maxTris = maxEdges; + verts = new Vert[maxVerts]; + vedges = new EdgeS[maxEdges]; + tris = new Tri[maxTris]; + chverts = new NVert[maxVerts]; + uchverts = new NVert[maxVerts]; + lbnd = 0; + bbnd = 1; + rbnd = 2; + tbnd = 3; + triangulate = 0; + rng = 0; + vrdebug = 0; + lineindex = 0; + } + + public Vert[] getGLSites() { + //System.out.println("retrieving GLsites"); + return GLsites; + } + + public int le() { + //System.out.println("retrieving le"); + return le; + } + + public int re() { + //System.out.println("retrieving re"); + return re; + } + + public int nsites() { + //System.out.println("retrieving nsites"); + return nsites; + } + + public void setNSites(int n) { + //System.out.println("setting nsites"); + nsites = n; + lines = new Point2D[n*3][2]; + } + + public NVert[] chverts() { + //System.out.println("retrieving chverts"); + return chverts; + } + + public int triangulate() { + //System.out.println("retrieving triangulate"); + return triangulate; + } + + public EdgeS[] vedges() { + //System.out.println("retrieving vedges"); + return vedges; + } + + public int vrdebug() { + //System.out.println("retrieving vrdebug"); + return vrdebug; + } + + public int maxEdges() { + //System.out.println("retrieving maxedges"); + return maxEdges; + } + + public Vert[] verts() { + //System.out.println("retrieving verts"); + return verts; + } + + public int maxVerts() { + //System.out.println("retrieving maxverts"); + return maxVerts; + } + + public int maxTris() { + //System.out.println("retrieving maxtris"); + return maxTris; + } + + public Tri[] tris() { + //System.out.println("retrieving tris"); + return tris; + } + + public Tri[] dtris() { + //System.out.println("retrieving dtris"); + return dtris; + } + + public void setdtris(Tri [] _dtris) { + //System.out.println("setting dtris"); + dtris = _dtris; + } + + public Neighbor[] sites() { + //System.out.println("retrieving sites"); + return _sites; + } + + public int maxSites() { + //System.out.println("retrieving maxsites"); + return maxSites; + } + + public Vert[] USites() { + //System.out.println("retrieving usites"); + return USites; + } + + public NVert[] uchverts() { + //System.out.println("retrieving uchverts"); + return uchverts; + } + + public void setTriangulate(int n) { + //System.out.println("setting triangulate"); + triangulate = n; + } + + public int lbnd() { + //System.out.println("retrieving lbnd"); + return lbnd; + } + + public int bbnd() { + //System.out.println("retrieving bbnd"); + return bbnd; + } + + public int rbnd() { + //System.out.println("retrieving rbnd"); + return rbnd; + } + + public int tbnd() { + //System.out.println("retrieving tbnd"); + return tbnd; + } + + public void setvxmin(float m) { + //System.out.println("setting vxmin"); + vxmin = m; + } + + public void setvxmax(float m) { + //System.out.println("setting vxmax"); + vxmax = m; + } + + public void setvymin(float m) { + //System.out.println("setting vymin"); + vymin = m; + } + + public void setvymax(float m) { + //System.out.println("setting vymax"); + vymax = m; + } + + public float vxmin() { + //System.out.println("retrieving vxmin"); + return vxmin; + } + + public float vxmax() { + //System.out.println("retrieving vxmax"); + return vxmax; + } + + public float vymin() { + //System.out.println("retrieving vymin"); + return vymin; + } + + public float vymax() { + //System.out.println("retrieving vymax"); + return vymax; + } + + public float vdeltax() { + //System.out.println("retrieving vdeltax"); + return vdeltax; + } + + public void setBottomSite(Site s) { + //System.out.println("setting bottomsite"); + bottomsite = s; + } + + public Site bottomsite() { + //System.out.println("retrieving bottomsite"); + return bottomsite; + } + + public void setTris(Tri[] tri) { + //System.out.println("setting tris"); + tris = tri; + } + + public void setvdeltax(float d) { + //System.out.println("setting vdeltax"); + vdeltax = d; + } + + public void setvdeltay(float d) { + //System.out.println("setting vdeltay"); + vdeltay = d; + } + + public int nedges() { + //System.out.println("retrieving nedges"); + return nedges; + } + + public void setnedges(int n) { + //System.out.println("setting nedges"); + nedges = n; + } + + public int PQhashsize() { + //System.out.println("retrieving pqhashsize"); + return PQhashsize; + } + + public float vdeltay() { + //System.out.println("retrieving vdeltay"); + return vdeltay; + } + + public void setsqrtnsites(double n) { + //System.out.println("setting sqrtnsites"); + sqrt_nsites = n; + } + + public double sqrtnsites() { + //System.out.println("retrieving sqrtnsites"); + return sqrt_nsites; + } + + public void setPQhashsize(int n) { + PQhashsize = n; + } + + public void setchverts (NVert[] varray) { + chverts = varray; + } + + public void setUSites(Vert[] sites) { + USites = sites; + } + + public void setGLsites(Vert[] sites) { + GLsites = sites; + } + + public void setSites(Neighbor[] sites){ + _sites = sites; + } + + public Point2D[][] lines() { + return lines; + } + + public void setlineindex(int n) { + lineindex = n; + } + + public int lineindex() { + return lineindex; + } + + public int rng() { + return rng; + } + + public void setrng(int r) { + rng = r; + } + + public int getedgex() { + return edgex; + } + + public int getedgey() { + return edgey; + } + + public void setedgex(int n) { + edgex = n; + } + + public void setedgey(int n) { + edgey = n; + } + + public int maxbinx() { + return maxbinx; + } + + public int maxbiny() { + return maxbiny; + } + + public void setmaxbinx(int b) { + maxbinx = b; + } + + public void setmaxbiny(int b) { + maxbiny = b; + } + + public ArrayList<EdgeRNG> relativeneighbors() { + return relativeneighbors; + } + + public void setrelativeneighbors(ArrayList<EdgeRNG> l) { + relativeneighbors = l; + } +} + + diff --git a/src/main/java/plugins/ragini/voronoidiagram/DT.java b/src/main/java/plugins/ragini/voronoidiagram/DT.java new file mode 100644 index 0000000..1ccd14f --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/DT.java @@ -0,0 +1,50 @@ +package plugins.ragini.voronoidiagram; + +//Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. +//Jad home page: http://www.kpdus.com/jad.html +//Decompiler options: packimports(3) +//Source File Name: DT.java + +//Referenced classes of package delaunay: +// Vertex, Face + +public class DT +{ + + public DT() + { + } + + public static int nextCoord(int i) + { + return i != 0 ? 0 : 1; + } + + public static final int XAXIS = 0; + public static final int YAXIS = 1; + public static final int ZAXIS = 2; + public static final int ALG_INCODE = 0; + public static final int ALG_DEWALL = 1; + public static final int ALG_GUIBAS = 2; + public static int counter1; + public static int counter2; + public static int counter3; + public static float opacity = 1.0F; + public static int type = 1; + public static int step = 40; + public static double res = 1.0D; + public static double jitter = 0.01D; + public static double MAX_VALUE; + public static double densityParameter = 0.5D; + public static Vertex vertexAngle = new Vertex(-1D, -1D); + public static int frame; + public static Face face_null = new Face(); + public static Vertex vertex_null = new Vertex(0.0D, 0.0D); + public static Vertex vertex_infty; + + static + { + MAX_VALUE = 100000D; + vertex_infty = new Vertex(MAX_VALUE, MAX_VALUE); + } +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/Delaunay.java b/src/main/java/plugins/ragini/voronoidiagram/Delaunay.java new file mode 100644 index 0000000..81c931c --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/Delaunay.java @@ -0,0 +1,121 @@ +package plugins.ragini.voronoidiagram; + +public class Delaunay { + + public Arcs InitArcD() { + Arcs item; + + item = new Arcs(); + item.setNext(null); + item.setID(-1); + item.setDist(-1); + return item; + + } + + public void AddArc(Arcs IVert, int v2, float dist, IntSetter nset) { + Arcs item = InitArcD(); + Arcs courant; //does n always have to get set only to 1? + + item.setID(v2); + item.setDist(dist); + + if (IVert.next() == null) { + IVert.setNext(item); + nset.set(1); + } + else { + courant = IVert.next(); + if (courant.dist() > dist) { + IVert.setNext(item); + item.setNext(courant); + nset.set(1); + } + else { + while ((courant.next()!=null) && (courant.next().dist() <= dist) && (courant.id() != v2)) { + courant = courant.next(); + } + if (courant.id() != v2) { + item.setNext(courant.next()); + courant.setNext(item); + nset.set(1); + } + } + } + } + + public GraphD [] InitGDelaunay(int n) { + GraphD [] item; + int i; + + item = new GraphD [n]; + for(i = 0; i < n; i++) { + item[i].setArcs(null); + item[i].setNbArcs((short) 0); + } + return item; + } + + public void InsertArc(GraphD[] Graph, int Vertice1, int Vertice2) { + float dist; + float min; + Arcs IVert, Courant, Item; + int n = 0; + IntSetter nset = new IntSetter(n); + + dist = (float) Math.sqrt((Graph[Vertice1].pt().X() - Graph[Vertice2].pt().X()) * (Graph[Vertice1].pt().X()-Graph[Vertice2].pt().X()) + (Graph[Vertice1].pt().Y() - Graph[Vertice2].pt().Y()) * (Graph[Vertice1].pt().Y()- Graph[Vertice2].pt().Y())); + if (Graph[Vertice1].arcs() == null) { + IVert = InitArcD(); + + AddArc(IVert, Vertice2, dist, nset); + n = nset.get(); + Graph[Vertice1].setArcs(IVert); + Graph[Vertice1].setNbArcs((short) (Graph[Vertice1].nbarcs() + n)); //does this cast work? + } + else { + IVert = Graph[Vertice1].arcs(); + + if (IVert.next().dist() > dist) { + Item = InitArcD(); + Item.setID(Vertice2); + Item.setDist(dist); + Item.setNext(IVert.next()); + Graph[Vertice1].setNbArcs((short) (Graph[Vertice1].nbarcs() + 1)); + Graph[Vertice1].arcs().setNext(Item); + } + else { + AddArc(IVert, Vertice2, dist, nset); //or, maybe could have it return the number of new arcs? + n = nset.get(); + Graph[Vertice1].setNbArcs((short) (Graph[Vertice1].nbarcs() + n)); + } + } + + if(Graph[Vertice2].arcs() == null) { + IVert = InitArcD(); + AddArc(IVert, Vertice1, dist, nset); + n = nset.get(); + Graph[Vertice2].setNbArcs((short) (Graph[Vertice1].nbarcs() + n)); + Graph[Vertice2].setArcs(IVert); + } + else { + IVert = Graph[Vertice2].arcs(); + + if (IVert.next().dist() > dist) { + Courant = IVert; + Item = InitArcD(); + Item.setID(Vertice1); + Item.setDist(dist); + Item.setNext(IVert.next()); + Graph[Vertice2].setNbArcs((short) (Graph[Vertice1].nbarcs() + 1)); + Graph[Vertice2].arcs().setNext(Item); + } + else { + AddArc(IVert, Vertice1, dist, nset); + n = nset.get(); + Graph[Vertice2].setNbArcs((short) (Graph[Vertice1].nbarcs() + n)); + } + } + + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/DelaunayTriangulator.java b/src/main/java/plugins/ragini/voronoidiagram/DelaunayTriangulator.java new file mode 100644 index 0000000..b35b7da --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/DelaunayTriangulator.java @@ -0,0 +1,581 @@ +package plugins.ragini.voronoidiagram; + +//Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. +//Jad home page: http://www.kpdus.com/jad.html +//Decompiler options: packimports(3) +//Source File Name: DelaunayTriangulator.java + +import java.io.PrintStream; +import java.util.*; + +//Referenced classes of package delaunay: +// DT, Face, QuadEdge, AFL, +// UniformGrid, Display, Vertex + +public class DelaunayTriangulator +{ + + public DelaunayTriangulator() + { + faces = new Vector(); + edges = new Vector(); + radiusMean = 0.0D; + DT.counter1 = 0; + DT.counter2 = 0; + DT.counter3 = 0; + } + + public void resetAll() + { + faces.clear(); + edges.clear(); + radiusMean = 0.0D; + DT.counter1 = 0; + DT.counter2 = 0; + DT.counter3 = 0; + } + + private void ajouterFace(Face f) + { + faces.addElement(f); + DT.counter3++; + } + + public Enumeration extractFaces() + { + return faces.elements(); + } + + public Vector getFaces() + { + return faces; + } + + public void setMeasure() + { + Enumeration listing = extractFaces(); + Vector auxV = new Vector(); + double measureMean = 0.0D; + int count = 0; + while(listing.hasMoreElements()) + { + Face f = (Face)listing.nextElement(); + double rad = f.getMeasure(); + if(rad < DT.MAX_VALUE) + { + count++; + auxV.add(new Double(rad)); + measureMean += rad; + } + } + double aux[] = new double[auxV.size()]; + for(int i = 0; i < count; i++) + aux[i] = ((Double)auxV.get(i)).doubleValue(); + + Arrays.sort(aux); + measureMedian = aux[count / 2]; + this.measureMean = measureMean / (double)count; + } + + public void setRadius() + { + Enumeration listing = extractFaces(); + Vector auxV = new Vector(); + double radiusMean = 0.0D; + int count = 0; + while(listing.hasMoreElements()) + { + Face f = (Face)listing.nextElement(); + double rad = f.getInvRadius(); + if(rad < DT.MAX_VALUE) + { + count++; + auxV.add(new Double(rad)); + radiusMean += rad; + } + } + double aux[] = new double[auxV.size()]; + for(int i = 0; i < count; i++) + aux[i] = ((Double)auxV.get(i)).doubleValue(); + + Arrays.sort(aux); + radiusMedian = aux[count / 2]; + this.radiusMean = radiusMean / (double)count; + } + + public void setSize() + { + Enumeration listing = extractFaces(); + Vector auxV = new Vector(); + double sizeMean = 0.0D; + int count = 0; + while(listing.hasMoreElements()) + { + Face f = (Face)listing.nextElement(); + double size = f.getInvSize(); + if(size < DT.MAX_VALUE) + { + count++; + auxV.add(new Double(size)); + sizeMean += size; + } + } + double aux[] = new double[auxV.size()]; + for(int i = 0; i < count; i++) + aux[i] = ((Double)auxV.get(i)).doubleValue(); + + Arrays.sort(aux); + sizeMedian = aux[count / 2]; + this.sizeMean = sizeMean / (double)count; + } + + public double getRadiusMean() + { + return radiusMean; + } + + public double getRadiusMedian() + { + return radiusMedian; + } + + public double getSizeMean() + { + return sizeMean; + } + + public double getSizeMedian() + { + return sizeMedian; + } + + public double getMeasureMean() + { + return measureMean; + } + + public double getMeasureMedian() + { + return measureMedian; + } + + public double getThresholdOpt() + { + return measureMedian * DT.densityParameter; + } + + public Vector getEdges() + { + return edges; + } + + public Enumeration extractEdges() + { + return edges.elements(); + } + + private void extractEdges(QuadEdge edge) + { + DT.counter1 = 0; + extractEdges(edge, 0x7fffffff); + edges.clear(); + Stack stk = new Stack(); + int counter = -1; + stk.push(edge); + while(!stk.isEmpty()) + { + QuadEdge e = (QuadEdge)stk.pop(); + if(e.getCounter() != counter) + { + DT.counter1++; + if(e.isCanonical()) + edges.add(e); + else + edges.add(e.sym()); + } + e.setCounter(counter); + e.sym().setCounter(counter); + if(e.onext().getCounter() != counter) + stk.push(e.onext()); + if(e.sym().onext().getCounter() != counter) + stk.push(e.sym().onext()); + } + } + + public Enumeration extractEdges(QuadEdge edge, int counter) + { + Vector edges = new Vector(); + Stack stk = new Stack(); + stk.push(edge); + while(!stk.isEmpty()) + { + QuadEdge e = (QuadEdge)stk.pop(); + if(e.getCounter() < counter) + if(e.isCanonical()) + edges.add(e); + else + edges.add(e.sym()); + e.setCounter(counter); + e.sym().setCounter(counter); + if(e.onext().getCounter() < counter) + stk.push(e.onext()); + if(e.sym().onext().getCounter() < counter) + stk.push(e.sym().onext()); + } + return edges.elements(); + } + + private QuadEdge putEdge(QuadEdge e, double med, int coord, AFL left, AFL center, AFL right) + { + int i = e.type(med, coord); + QuadEdge qe; + if(i < 0) + qe = left.putTest(e); + else + if(i == 0) + qe = center.putTest(e); + else + qe = right.putTest(e); + return qe; + } + + public QuadEdge inCoDeTotal(Display disp, Vertex sites[], Vertex sitesBin[]) + { + QuadEdge tri = inCoDe(disp, sites); + extractEdges(tri); + constructDual(); + return tri; + } + + public QuadEdge inCoDe(Display disp, Vertex sites[]) + { + UniformGrid grid = new UniformGrid(sites, sites.length); + AFL list = new AFL(); + AFL list_aux = new AFL(); + System.out.println("Debut inCode"); + disp.setQuadEdge(null); + disp.setRange(0.0D, 0.0D, 1.0D, 1.0D); + disp.setCenterAFL(list); + disp.setTriangles(faces); + disp.setEdges(edges); + disp.breakBig(); + int count = 0; + Vertex seed = new Vertex(grid.XMin() + grid.XSize() / 2D, grid.YMin() + grid.YSize() / 2D); + Vertex A = grid.findNearestPoint(seed); + Vertex B = grid.findNearestPoint(A); + Vertex C = grid.findDelaunayPoint(A, B); + if(C == null) + C = grid.findDelaunayPoint(B, A); + if(C == null) + return QuadEdge.makeEdge(A, B); + Vertex S = Vertex.findCenter(A, B, C); + double rad = Vertex.distance(S, A); + disp.setCircle(S, rad); + disp.setTriangle(A, B, C); + if(Vertex.ccw(A, B, C)) + { + Vertex pom = B; + B = C; + C = pom; + } + QuadEdge a = QuadEdge.makeEdge(A, B); + QuadEdge b = QuadEdge.makeEdge(B, C); + a.sym().splice(b); + QuadEdge c = QuadEdge.connect(b, a); + QuadEdge tri = a; + disp.setQuadEdge(tri); + list.put(a); + list.put(b); + list.put(c); + Face f = new Face(a, b, c); + ajouterFace(f); + a.setFace(f); + b.setFace(f); + c.setFace(f); + disp.breakBig(); + for(; !list.isEmpty(); disp.breakBig()) + { + count++; + a = list.extract(); + QuadEdge olda = list_aux.putTest(a); + if(olda != null) + System.out.println("InCode deja traite"); + A = a.orig(); + B = a.dest(); + C = grid.findDelaunayPoint(A, B); + if(C != null && olda == null) + { + S = Vertex.findCenter(A, B, C); + rad = Vertex.distance(S, A); + disp.setCircle(S, rad); + disp.setTriangle(A, B, C); + b = QuadEdge.makeEdge(A, C); + c = QuadEdge.makeEdge(C, B); + f = null; + QuadEdge oldb = list.putTest(b); + QuadEdge oldc = list.putTest(c); + if(oldb == null && oldc == null) + { + a.splice(b); + a.lnext().splice(c.sym()); + b.sym().splice(c); + f = new Face(a.sym(), b, c); + b.setFace(f); + c.setFace(f); + } else + if(oldb == null) + { + a.splice(b); + if(oldc.lnext() != b.sym()) + oldc.lnext().splice(b.sym()); + if(oldc.onext() != a.sym()) + { + oldc.lnext().splice2(b.lnext()); + oldc.splice2(a.sym()); + } + f = new Face(a.sym(), b, oldc.sym()); + b.setFace(f); + oldc.sym().setFace(f); + } else + if(oldc == null) + { + if(a.lnext() != c.sym()) + a.lnext().splice(c.sym()); + oldb.splice(c); + if(a.onext() != oldb.sym()) + { + oldb.lnext().splice2(a.sym().rprev()); + a.splice2(oldb.sym()); + } + f = new Face(a.sym(), oldb.sym(), c); + oldb.sym().setFace(f); + c.setFace(f); + } else + { + if(a.onext() != oldb.sym()) + a.splice2(oldb.sym()); + if(oldb.onext() != oldc.sym()) + { + oldc.lnext().splice2(oldb.sym().rprev()); + oldb.splice2(oldc.sym()); + } + f = new Face(a.sym(), oldb.sym(), oldc.sym()); + oldb.sym().setFace(f); + oldc.sym().setFace(f); + } + a.sym().setFace(f); + ajouterFace(f); + } + } + + disp.setCircle(null, 0.0D); + disp.setTriangle(null, null, null); + System.out.println((new StringBuilder("Fin inCode : ")).append(count).append(" passages\n").toString()); + return tri; + } + + private void constructDual() + { + for(Enumeration listing = extractEdges(); listing.hasMoreElements();) + { + QuadEdge e = (QuadEdge)listing.nextElement(); + QuadEdge r = e.rot(); + r.setData(e.rightFace().getBary()); + if(e.sym().rightFace() != null) + r.sym().setData(e.sym().rightFace().getBary()); + } + + } + + private void setFacesV8_bin(Vertex sitesBin[]) + { + Enumeration listing = extractFaces(); + if(sitesBin.length == 0) + { + double alpha = getThresholdOpt(); + while(listing.hasMoreElements()) + { + Face f = (Face)listing.nextElement(); + if(f.getMeasure() > alpha) + f.setVal(1.0F); + else + f.setVal(0.0F); + } + } else + { + while(listing.hasMoreElements()) + { + Face f = (Face)listing.nextElement(); + f.setVal(0.0F); + for(int i = 0; i < sitesBin.length; i++) + if(f.contains(sitesBin[i]) == 1) + f.setVal(1.0F); + + } + } + } + + private void setFacesV8_erode() + { + float e; + Face f; + for(Enumeration listing = extractFaces(); listing.hasMoreElements(); f.setValAux(e)) + { + e = 1.0F; + f = (Face)listing.nextElement(); + for(Iterator iter = f.extractFacesVoisines(); iter.hasNext();) + { + Face ff = (Face)iter.next(); + e = Math.min(e, ff.getVal()); + } + + } + + for(Enumeration listing = extractFaces(); listing.hasMoreElements(); f.setVal(f.getValAux())) + f = (Face)listing.nextElement(); + + } + + private void setFacesV8_dilate(double angle, double epsilon, int ordre) + { + float e; + Face f; + for(Enumeration listing = extractFaces(); listing.hasMoreElements(); f.setValAux(e)) + { + e = 0.0F; + f = (Face)listing.nextElement(); + for(Iterator iter = f.extractFacesVoisines(angle, epsilon); iter.hasNext();) + { + Face ff = (Face)iter.next(); + e = Math.max(e, Math.max(f.getVal(), (ff.getVal() + (1.0F - (float)ordre / (float)DT.step)) - 1.0F)); + } + + } + + for(Enumeration listing = extractFaces(); listing.hasMoreElements(); f.setVal(f.getValAux())) + f = (Face)listing.nextElement(); + + } + + private void setEdgesV8() + { + for(Enumeration listing = extractEdges(); listing.hasMoreElements();) + { + QuadEdge e = (QuadEdge)listing.nextElement(); + if(e.sym().rightFace() != null) + { + e.setLambda(Math.min(e.rightFace().getVal(), e.sym().rightFace().getVal())); + e.setMu(Math.max(e.rightFace().getVal(), e.sym().rightFace().getVal())); + e.sym().setLambda(Math.min(e.rightFace().getVal(), e.sym().rightFace().getVal())); + e.sym().setMu(Math.max(e.rightFace().getVal(), e.sym().rightFace().getVal())); + } else + { + e.setLambda(1.0F - e.rightFace().getVal()); + e.setMu(e.rightFace().getVal()); + e.sym().setLambda(1.0F - e.rightFace().getVal()); + e.sym().setMu(e.rightFace().getVal()); + } + } + + } + + public void constructBin(Vertex sitesBin[]) + { + setFacesV8_bin(sitesBin); + setEdgesV8(); + } + + public void constructErode() + { + setFacesV8_erode(); + setEdgesV8(); + } + + public void constructDilate(double angle, double epsilon) + { + setFacesV8_dilate(angle, epsilon, 0); + setEdgesV8(); + } + + public void constructFuzzyDilate(double angle, double epsilon) + { + for(int k = 0; k < DT.step + 1; k++) + setFacesV8_dilate(angle, epsilon, k); + + setEdgesV8(); + } + + public void constructInter(DelaunayTriangulator dt1, DelaunayTriangulator dt2) + { + Enumeration listing = extractFaces(); + Enumeration listing1 = dt1.extractFaces(); + Face f; + Face f1; + Face f2; + for(Enumeration listing2 = dt2.extractFaces(); listing.hasMoreElements() && listing1.hasMoreElements() && listing2.hasMoreElements(); f.setVal(Math.min(f1.getVal(), f2.getVal()))) + { + f = (Face)listing.nextElement(); + f1 = (Face)listing1.nextElement(); + f2 = (Face)listing2.nextElement(); + } + + setEdgesV8(); + } + + public void constructUnion(DelaunayTriangulator dt1, DelaunayTriangulator dt2) + { + Enumeration listing = extractFaces(); + Enumeration listing1 = dt1.extractFaces(); + Face f; + Face f1; + Face f2; + for(Enumeration listing2 = dt2.extractFaces(); listing.hasMoreElements() && listing1.hasMoreElements() && listing2.hasMoreElements(); f.setVal(Math.max(f1.getVal(), f2.getVal()))) + { + f = (Face)listing.nextElement(); + f1 = (Face)listing1.nextElement(); + f2 = (Face)listing2.nextElement(); + } + + setEdgesV8(); + } + + public void constructComp() + { + Face f; + for(Enumeration listing = extractFaces(); listing.hasMoreElements(); f.setVal(1.0F - f.getVal())) + f = (Face)listing.nextElement(); + + setEdgesV8(); + } + + public void expliciter() + { + Enumeration listing = extractEdges(); + System.out.println((new StringBuilder("Enumeration des ")).append(getEdges().size()).append(" edges ").toString()); + QuadEdge e; + for(; listing.hasMoreElements(); e.expliciter()) + { + e = (QuadEdge)listing.nextElement(); + System.out.println((new StringBuilder()).append(e).append(" Associ\357\277\275 aux triangles ").append(e.rightFace()).append(" ").append(e.sym().rightFace()).toString()); + } + + listing = extractFaces(); + System.out.println((new StringBuilder("Enumeration des ")).append(getFaces().size()).append(" faces").toString()); + Face f; + for(; listing.hasMoreElements(); f.extractFacesVoisines()) + { + f = (Face)listing.nextElement(); + System.out.println(f); + } + + } + + private Vector faces; + private Vector edges; + private double radiusMean; + private double radiusMedian; + private double measureMean; + private double measureMedian; + private double sizeMean; + private double sizeMedian; +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/Display.java b/src/main/java/plugins/ragini/voronoidiagram/Display.java new file mode 100644 index 0000000..497769d --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/Display.java @@ -0,0 +1,791 @@ +package plugins.ragini.voronoidiagram; +//Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. +//Jad home page: http://www.kpdus.com/jad.html +//Decompiler options: packimports(3) +//Source File Name: Display.java + + +import java.awt.*; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.image.BufferedImage; +import java.awt.image.RenderedImage; +import java.io.*; +import java.util.*; +import javax.imageio.ImageIO; +import javax.swing.JFrame; +import javax.swing.JOptionPane; + +//Referenced classes of package delaunay: +// Vertex, QuadEdge, Face, DT, +// UniformGrid, DelaunayTriangulator, AFL + +public class Display extends Canvas + implements MouseListener +{ + + public void dimensionize() + { + w = getWidth(); + h = getHeight(); + ss = Math.min((double)w / xsize, (double)h / ysize); + ss_int = Math.min(w, h); + setSize(ss_int, ss_int); + } + + synchronized void run(int mode) + { + playmode = mode; + stopped = false; + } + + synchronized void stop() + { + stopped = true; + } + + void breakSmall() + { + if(playmode == 1) + stopped = true; + if(stopped) + { + repaint(); + while(stopped) ; + } + } + + void breakBig() + { + if(playmode == 1 || playmode == 2) + stopped = true; + if(stopped) + { + repaint(); + while(stopped) ; + } + } + + Display(DelaunayTriangulator dt) + { + this.dt = null; + ug = null; + center = null; + left = null; + right = null; + tri = null; + triangles = null; + edges = null; + S = null; + A = null; + B = null; + C = null; + sites = null; + Q = null; + Q1 = null; + Q2 = null; + Q3 = null; + frame = 1; + coord = -1; + rank = 1; + rank2 = 1; + loadImage = false; + pts = new Vector(); + ptsBin = new Vector(); + canAdd = false; + xoff = 0.0D; + yoff = 0.0D; + xsize = 1.0D; + ysize = 1.0D; + ss = 1.0D; + sx = 1.0D; + ssy = 1.0D; + x0 = 0; + y0 = 0; + w = 400; + h = 400; + ss_int = 1; + stopped = false; + playmode = 0; + enabled = new boolean[19]; + this.dt = dt; + resetAll(true); + setBackground(Color.white); + addMouseListener(this); + dimensionize(); + } + + public void setRank(int rank) + { + this.rank = rank; + } + + public void setRank2(int rank2) + { + this.rank2 = rank2; + } + + public void addPoint(Vertex v) + { + if(enabled[18]) + ptsBin.add(v); + else + pts.add(v); + } + + public void clearPoints() + { + pts.clear(); + ptsBin.clear(); + image = null; + loadImage = false; + } + + public int numPoints() + { + return pts.size(); + } + + public Vertex[] getPoints() + { + Vertex sites[] = new Vertex[pts.size()]; + pts.copyInto(sites); + return sites; + } + + public void setPoints(Vertex sites[]) + { + pts.clear(); + for(int i = 0; i < sites.length; i++) + pts.add(sites[i]); + + } + + public Vertex[] getPointsBin() + { + Vertex sites[] = new Vertex[ptsBin.size()]; + ptsBin.copyInto(sites); + return sites; + } + + public void loadPoints(int n, double oldminx, double oldminy, double oldmaxx, + double oldmaxy, Neighbor[] sites) + { + pts.clear(); + for(Neighbor s: sites) + { + double x = s.getCoord().X(); + double newx = (((x - oldminx) * (1))/(oldmaxx - oldminx)); + double y = s.getCoord().Y(); + double newy = (((y - oldminy) * (1))/(oldmaxy - oldminy)); + pts.add(new Vertex(newx, newy, pts.size())); + } + + } + + public void enableAdding(boolean flag) + { + canAdd = flag; + } + + public void mouseClicked(MouseEvent mouseevent) + { + } + + public void mouseReleased(MouseEvent mouseevent) + { + } + + public void mouseEntered(MouseEvent mouseevent) + { + } + + public void mouseExited(MouseEvent mouseevent) + { + } + + public void mousePressed(MouseEvent e) + { + e.consume(); + if(canAdd) + { + Vertex v = new Vertex((double)(e.getX() - x0) / ss + xoff, (double)(e.getY() - y0) / ss + yoff, pts.size()); + addPoint(v); + setSites(getPoints()); + repaint(); + } + } + + public void show(int flag) + { + enabled[flag] = true; + } + + public void hide(int flag) + { + enabled[flag] = false; + } + + public void swap(int flag) + { + if(!enabled[flag]) + enabled[flag] = true; + else + enabled[flag] = false; + } + + public void setRange(double xo, double yo, double xs, double ys) + { + xoff = xo; + yoff = yo; + xsize = xs; + ysize = ys; + ss = Math.min((double)w / xsize, (double)h / ysize); + } + + public void setWindow(int xleft, int yleft, int width, int height) + { + x0 = xleft; + y0 = yleft; + w = width; + h = height; + ss = Math.min((double)w / xsize, (double)h / ysize); + } + + int xconv(double x) + { + return (int)((x - xoff) * ss) + x0; + } + + int yconv(double y) + { + return (int)((y - yoff) * ss) + y0; + } + + int dconv(double x) + { + return (int)(x * ss); + } + + public void setCenterAFL(AFL c) + { + center = c; + } + + public void setLeftAFL(AFL l) + { + left = l; + } + + public void setRightAFL(AFL r) + { + right = r; + } + + public void setTriangulation(AFL t) + { + tri = t; + } + + public void setGrid(UniformGrid u) + { + ug = u; + } + + public void setCircle(Vertex c, double r) + { + S = c; + rad = r; + } + + public void setTriangle(Vertex a, Vertex b, Vertex c) + { + A = a; + B = b; + C = c; + } + + public void setSites(Vertex ss[]) + { + sites = ss; + } + + public void setSplittingLine(int c, double m) + { + coord = c; + med = m; + } + + public void setQuadEdge(QuadEdge q) + { + Q = q; + } + + public void setQuadEdge3(QuadEdge q1, QuadEdge q2, QuadEdge q3) + { + Q1 = q1; + Q2 = q2; + Q3 = q3; + } + + public void setTriangles(Vector triangles) + { + this.triangles = triangles; + } + + public void setEdges(Vector edges) + { + this.edges = edges; + } + + public void resetAll(boolean flag) + { + ug = null; + center = left = right = null; + tri = null; + S = null; + A = B = C = null; + sites = null; + coord = -1; + Q = null; + Q1 = Q2 = Q3 = null; + rank = 1; + if(flag) + { + for(int i = 0; i < 19; i++) + enabled[i] = false; + + } + } + + private void dessineMesh(Graphics g) + { + float surface = 0.0F; + if(enabled[17]) + { + System.out.println("Mode Contour"); + g.setColor(Color.green); + for(Enumeration listing = edges.elements(); listing.hasMoreElements();) + { + QuadEdge e = (QuadEdge)listing.nextElement(); + QuadEdge e_sym = e.sym(); + if(e.getMu() >= 1.0F && e.getLambda() == 0.0F) + { + float grey = (float)Math.min(1.0D, e.getMu()); + grey = 1.0F - grey; + g.setColor(new Color(grey, grey, grey)); + Graphics2D g2 = (Graphics2D)g; + g2.setStroke(new BasicStroke(3F)); + g2.drawLine(xconv(e.orig().x), yconv(e.orig().y), xconv(e_sym.orig().x), yconv(e_sym.orig().y)); + g2.setStroke(new BasicStroke(1.0F)); + } + } + + } else + { + System.out.println("Mode Region"); + for(Enumeration listing = triangles.elements(); listing.hasMoreElements();) + { + Face f = (Face)listing.nextElement(); + QuadEdge list_edges[] = new QuadEdge[3]; + list_edges = f.getEdges(); + int x[] = new int[3]; + int y[] = new int[3]; + for(int i = 0; i < 3; i++) + { + x[i] = xconv(list_edges[i].orig().x); + y[i] = yconv(list_edges[i].orig().y); + } + + if(f.getVal() > 0.0F && f.getVal() <= 1.0F) + { + float grey = f.getVal(); + surface = (float)((double)surface + 1.0D / f.getMeasure()); + g.setColor(new Color(grey, grey, grey, DT.opacity)); + g.fillPolygon(x, y, 3); + g.setColor(Color.BLACK); + g.drawPolygon(x, y, 3); + } + } + + } + System.out.println(surface); + } + + public void paint(Graphics g) + { + dimensionize(); + getGraphics().setColor(Color.BLACK); + getGraphics().drawRect(1, 1, ss_int - 2, ss_int - 2); + setWindow(0, 0, w, h); + setVisible(true); + if(image != null) + g.drawImage(image, 0, 0, ss_int, ss_int, this); + + g.setPaintMode(); + if(triangles != null) + dessineMesh(g); + if(ug != null && enabled[0]) + { + g.setColor(Color.lightGray); + g.fillRect(xconv(ug.XMin()), yconv(ug.YMin()), dconv(ug.XSize()), dconv(ug.YSize())); + } + if(pts != null && enabled[10]) + { + g.setColor(Color.BLACK); + for(int i = 0; i < pts.size(); i++) + { + Vertex v = (Vertex)pts.elementAt(i); + g.drawLine(xconv(v.x), yconv(v.y), xconv(v.x), yconv(v.y)); + } + + } + if(ptsBin != null && (enabled[10] || enabled[8])) + { + g.setColor(Color.BLACK); + for(int i = 0; i < ptsBin.size(); i++) + { + Vertex v = (Vertex)ptsBin.elementAt(i); + g.drawLine(xconv(v.x), yconv(v.y), xconv(v.x), yconv(v.y)); + } + + } + if(sites != null && enabled[8]) + { + g.setColor(Color.BLACK); + for(int i = 0; i < sites.length; i++) + g.drawLine(xconv(sites[i].x), yconv(sites[i].y), xconv(sites[i].x), yconv(sites[i].y)); + + } + if(coord >= 0 && ug != null && enabled[9]) + { + g.setColor(Color.blue); + if(coord == 0) + g.drawLine(xconv(med), yconv(ug.YMin()), xconv(med), yconv(ug.YMax())); + else + g.drawLine(xconv(ug.XMin()), yconv(med), xconv(ug.XMax()), yconv(med)); + } + if(Q != null && enabled[11]) + { + g.setColor(Color.BLACK); + QuadEdge qe; + for(Enumeration e = dt.extractEdges(Q, frame++); e.hasMoreElements(); g.drawLine(xconv(qe.orig().x), yconv(qe.orig().y), xconv(qe.dest().x), yconv(qe.dest().y))) + qe = (QuadEdge)e.nextElement(); + + } + if(Q != null && enabled[13]) + { + g.setColor(Color.red); + for(Enumeration e = dt.extractEdges(Q, frame++); e.hasMoreElements();) + { + QuadEdge qr = (QuadEdge)e.nextElement(); + QuadEdge qe = qr.rot(); + if(qe.orig() != null && qe.dest() != null) + g.drawLine(xconv(qe.orig().x), yconv(qe.orig().y), xconv(qe.dest().x), yconv(qe.dest().y)); + } + + } + if(center != null && enabled[1]) + { + g.setColor(Color.black); + for(int i = 0; i < center.size(); i++) + { + QuadEdge e = center.get(i); + g.drawLine(xconv(e.orig().x), yconv(e.orig().y), xconv(e.dest().x), yconv(e.dest().y)); + } + + } + if(left != null && enabled[2]) + { + g.setColor(Color.green); + for(int i = 0; i < left.size(); i++) + { + QuadEdge e = left.get(i); + g.drawLine(xconv(e.orig().x), yconv(e.orig().y), xconv(e.dest().x), yconv(e.dest().y)); + } + + } + if(right != null && enabled[3]) + { + g.setColor(Color.green); + for(int i = 0; i < right.size(); i++) + { + QuadEdge e = right.get(i); + g.drawLine(xconv(e.orig().x), yconv(e.orig().y), xconv(e.dest().x), yconv(e.dest().y)); + } + + } + if(enabled[12]) + { + System.out.println("OK EDGE3"); + if(Q1 != null) + { + g.setColor(Color.green); + g.drawLine(xconv(Q1.orig().x), yconv(Q1.orig().y), xconv(Q1.dest().x), yconv(Q1.dest().y)); + g.drawRect(xconv(0.20000000000000001D * Q1.orig().x + 0.80000000000000004D * Q1.dest().x) - 1, yconv(0.20000000000000001D * Q1.orig().y + 0.80000000000000004D * Q1.dest().y) - 1, 3, 3); + } + if(Q2 != null) + { + g.setColor(Color.blue); + g.drawLine(xconv(Q2.orig().x), yconv(Q2.orig().y), xconv(Q2.dest().x), yconv(Q2.dest().y)); + g.drawRect(xconv(0.20000000000000001D * Q2.orig().x + 0.80000000000000004D * Q2.dest().x) - 1, yconv(0.20000000000000001D * Q2.orig().y + 0.80000000000000004D * Q2.dest().y) - 1, 3, 3); + } + if(Q3 != null) + { + g.setColor(Color.gray); + g.drawLine(xconv(Q3.orig().x), yconv(Q3.orig().y), xconv(Q3.dest().x), yconv(Q3.dest().y)); + g.drawRect(xconv(0.20000000000000001D * Q3.orig().x + 0.80000000000000004D * Q3.dest().x) - 1, yconv(0.20000000000000001D * Q3.orig().y + 0.80000000000000004D * Q3.dest().y) - 1, 3, 3); + } + } + if(A != null && B != null && C != null && enabled[6]) + { + g.setColor(Color.red); + g.drawLine(xconv(A.x), yconv(A.y), xconv(B.x), yconv(B.y)); + g.drawString("A", xconv(A.x), yconv(A.y)); + g.setColor(Color.pink); + g.drawLine(xconv(B.x), yconv(B.y), xconv(C.x), yconv(C.y)); + g.drawLine(xconv(C.x), yconv(C.y), xconv(A.x), yconv(A.y)); + } + if(S != null && enabled[5]) + { + g.setColor(Color.red); + System.out.println((new StringBuilder("rad ")).append(rad).append(" et S ").append(S).toString()); + g.drawOval(xconv(S.x - rad), yconv(S.y - rad), dconv(2D * rad), dconv(2D * rad)); + } + } + + public void writeImage(File file) + { + try + { + Rectangle r = getBounds(); + Image image = createImage(r.width, r.height); + Graphics g = image.getGraphics(); + paint(g); + ImageIO.write((RenderedImage)image, "png", file); + } + catch(IOException ioe) + { + ioe.printStackTrace(); + } + } + + public void writePoints(File file) + { + String filename = file.toString(); + String ext = filename.substring(filename.lastIndexOf('.') + 1, filename.length()); + try + { + if(ext.equals("txt")) + { + FileWriter fwriter = new FileWriter(filename); + BufferedWriter bw = new BufferedWriter(fwriter); + for(int i = 0; i < pts.size(); i++) + { + bw.write((new StringBuilder(String.valueOf(sites[i].x))).append("\t").append(sites[i].y).toString()); + bw.newLine(); + } + + bw.close(); + } else + { + ObjectOutputStream obj_out = new ObjectOutputStream(new FileOutputStream(file)); + try + { + obj_out.writeObject(pts); + obj_out.close(); + } + catch(IOException iox) + { + System.out.println("File saving error..."); + iox.printStackTrace(); + } + } + } + catch(FileNotFoundException fnf) + { + System.out.println("File not found..."); + fnf.printStackTrace(); + } + catch(Exception fnf) + { + System.out.println("Exception..."); + fnf.printStackTrace(); + } + } + + public void loadImage(File file) + { + String name = file.getAbsolutePath(); + image = Toolkit.getDefaultToolkit().getImage(name); + loadImage = true; + repaint(); + } + + public void loadImage(Image imp) + { + image = imp; + loadImage = true; + repaint(); + } + + public void convertImage() + { + Random rand = new Random(); + if(image != null) + { + BufferedImage bimage = toBufferedImage(image); + int rgbs[] = (int[])null; + int w = bimage.getWidth(); + int h = bimage.getHeight(); + System.out.println((new StringBuilder("w ")).append(w).append(" h ").append(h).toString()); + rgbs = new int[w * h]; + bimage.getRGB(0, 0, w, h, rgbs, 0, w); + int mask = 255; + int count = 0; + for(int i = 0; i < h; i++) + { + for(int j = 0; j < w; j++) + { + int rgb = bimage.getRGB(j, i); + int rouge = rgb >> 16 & mask; + int vert = rgb >> 8 & mask; + int bleu = rgb & mask; + if(rouge == 255 && bleu == 0 && vert == 0) + { + int x = (j * this.w) / w; + int y = (i * this.h) / h; + if(canAdd) + { + count++; + Vertex v = new Vertex((double)(x - x0) / ss + xoff + DT.jitter * rand.nextDouble(), (double)(y - y0) / ss + yoff + DT.jitter * rand.nextDouble(), pts.size()); + pts.add(v); + setSites(getPoints()); + repaint(); + } + } + } + + } + + System.out.println((new StringBuilder(String.valueOf(count))).append(" points.").toString()); + } else + { + JOptionPane.showMessageDialog(new JFrame(), "No loaded image. Please use Load Image", "Dialog", 0); + } + } + + public void loadPoints(Neighbor[] sites) + { + //resetAll(true); + //clearPoints(); + pts.clear(); + + for(Neighbor s: sites) + { + if (s == null) + System.out.println("null"); + else System.out.println("not null"); + pts.add(new Vertex(s.getCoord().X(), s.getCoord().Y(), pts.size())); + } + //setSites(getPoints()); + //show(8); + + // repaint(); + + // enableAdding(true); + } + + private BufferedImage toBufferedImage(Image image) + { + if(image instanceof BufferedImage) + return (BufferedImage)image; + BufferedImage bimage = null; + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + try + { + int transparency = 1; + GraphicsDevice gs = ge.getDefaultScreenDevice(); + GraphicsConfiguration gc = gs.getDefaultConfiguration(); + bimage = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null), transparency); + } + catch(HeadlessException headlessexception) { } + if(bimage == null) + { + int type = 1; + bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type); + } + Graphics g = bimage.createGraphics(); + g.drawImage(image, 0, 0, null); + g.dispose(); + return bimage; + } + + Image image; + Graphics2D graphic; + DelaunayTriangulator dt; + UniformGrid ug; + AFL center; + AFL left; + AFL right; + AFL tri; + Vector triangles; + Vector edges; + Vertex S; + Vertex A; + Vertex B; + Vertex C; + Vertex sites[]; + QuadEdge Q; + QuadEdge Q1; + QuadEdge Q2; + QuadEdge Q3; + int frame; + double rad; + double med; + int coord; + int rank; + int rank2; + boolean loadImage; + Vector pts; + Vector ptsBin; + boolean canAdd; + double xoff; + double yoff; + double xsize; + double ysize; + double ss; + double sx; + double ssy; + int x0; + int y0; + int w; + int h; + int ss_int; + boolean stopped; + int playmode; + public static final int CONTROL_PLAY = 0; + public static final int CONTROL_SHORTSTEP = 1; + public static final int CONTROL_LONGSTEP = 2; + public static final int GRID = 0; + public static final int AFLCENTER = 1; + public static final int AFLLEFT = 2; + public static final int AFLRIGHT = 3; + public static final int TRIANGULATION = 4; + public static final int CIRCLE = 5; + public static final int TRIANGLE = 6; + public static final int EDGE1 = 7; + public static final int SITES = 8; + public static final int SPLITLINE = 9; + public static final int POINTVEC = 10; + public static final int QUADEDGE = 11; + public static final int QUADEDGE3 = 12; + public static final int ROT = 13; + public static final int ALPHA = 14; + public static final int ERODE = 15; + public static final int DILATE = 16; + public static final int CONTOUR = 17; + public static final int BINARIZE = 18; + public static final int DUMMY = 19; + boolean enabled[]; +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/Edge.java b/src/main/java/plugins/ragini/voronoidiagram/Edge.java new file mode 100644 index 0000000..8e522e4 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/Edge.java @@ -0,0 +1,51 @@ +package plugins.ragini.voronoidiagram; + +public class Edge { + + private float a, b, c; + private Site[] ep; + private Site[] reg; + private int edgenbr; + + public Edge() { + ep = new Site[2]; + reg = new Site[2]; + } + + public float a() { + return a; + } + + public float b() { + return b; + } + + public float c() { + return c; + } + + public Site[] ep() { + return ep; + } + + public Site[] reg() { + return reg; + } + + public void seta(double d) { + a = (float) d; + } + + public void setb(double d) { + b = (float) d; + } + + public void setc(double d) { + c = (float) d; + } + + public void setedgenbr(int n) { + edgenbr = n; + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/EdgeL.java b/src/main/java/plugins/ragini/voronoidiagram/EdgeL.java new file mode 100644 index 0000000..1ff58ba --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/EdgeL.java @@ -0,0 +1,8 @@ +package plugins.ragini.voronoidiagram; + +public class EdgeL { + + private int id1, id2; + private dkmax maxk; + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/EdgeList.java b/src/main/java/plugins/ragini/voronoidiagram/EdgeList.java new file mode 100644 index 0000000..987e6c4 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/EdgeList.java @@ -0,0 +1,318 @@ +package plugins.ragini.voronoidiagram; + +public class EdgeList { + + private HalfEdge ELleftend, ELrightend; + private int ELhashsize; + private HalfEdge[] ELhash; + + private Constants constants; + private VRegion vregion; + + public EdgeList(Constants _constants, VRegion reg) { + constants = _constants; + vregion = reg; + } + + public HalfEdge leftend() { + return ELleftend; + } + + public HalfEdge rightend() { + return ELrightend; + } + + public void ELinitialize() { + //System.out.println("initializing edge list"); + int i; + ELhashsize = (int) (2 * constants.sqrtnsites()); + ELhash = new HalfEdge[ELhashsize]; + //System.out.println("hash size: " + ELhashsize); + for (i = 0; i < ELhashsize; i ++) { + ELhash[i] = new HalfEdge(-1); + } + + ELleftend = HEcreate(null, 0, -1); + ELrightend = HEcreate(null, 0, -1); + ELleftend.setLeft(null); + ELleftend.setRight(ELrightend); + ELrightend.setLeft(ELleftend); + ELrightend.setRight(null); + ELhash[0] = ELleftend; + ELhash[ELhashsize - 1] = ELrightend; + } + + public HalfEdge HEcreate(Edge e, int pm, int origin) { + //System.out.println("creating new halfedge"); + HalfEdge answer; + + answer = new HalfEdge(origin); + answer.setEdge(e); + answer.setPM(pm); + answer.setNext(null); + answer.setVertex(null); + answer.setNull(false); + return answer; + } + + public void ELinsert(HalfEdge lb, HalfEdge newhe) { + //if(lb == null) System.out.println("lb null"); + //else if (newhe == null) System.out.println("newhe null"); + //else if (lb.eledge() == null) {System.out.println("lb edge null"); System.out.println("newhe: " + newhe.eledge().a() + ", " + newhe.eledge().b() + ", " + newhe.eledge().c()); } + //else System.out.println("inserting: " + newhe.eledge().a() + ", " + newhe.eledge().b() + ", " + newhe.eledge().c() + ", " + "after " + lb.eledge().a() + ", " + lb.eledge().b() + ", " + lb.eledge().c()); + //System.out.println("inserting halfedge"); + newhe.setLeft(lb); + newhe.setRight(lb.right()); + //if (lb.right().eledge() == null) System.out.println("the right of lb is null"); + //else System.out.println(newhe.right().eledge().a() + ", " + newhe.right().eledge().b() + ", " + newhe.right().eledge().c() + " is to the right of: " + newhe.eledge().a() + ", " + newhe.eledge().b() + ", " + newhe.eledge().c()); + lb.right().setLeft(newhe); + lb.setRight(newhe); + if (lb == ELrightend) {ELrightend = newhe;} + } + + public HalfEdge ELgethash(int b) { + HalfEdge he; + + if(b < 0 || b >= ELhashsize) { + return null; + } + + he = ELhash[b]; + //System.out.println("trying bucket: " + b); + //if (he == null) System.out.println("null at bucket: " + b); + if (he.isNull() || !he.isDeleted()) { + return he; + } + /* Hash table points to deleted half edge. Patch as necessary. */ + ELhash[b] = new HalfEdge(-1); + //some memory stuff, may return null + return null; + } + + public HalfEdge ELleftbnd(Point p) { + int i, bucket = 0; + HalfEdge he; + + bucket = (int) ((p.X() - constants.vxmin())/constants.vdeltax() * ELhashsize); + //System.out.println("bucket: " + bucket); + if (bucket < 0) + bucket = 0; + + if (bucket >= ELhashsize) + bucket = ELhashsize -1; + + he = ELgethash(bucket); + if (he.isNull()) { + for (i = 1; true; i ++) { + //fix this for loop + if (ELgethash(bucket - i) != null) { + if (!(he = ELgethash(bucket - i)).isNull()) { + break; + }} + if (ELgethash(bucket + i) != null) { + if (!(he = ELgethash(bucket + 1)).isNull()) { + break; + }} + } + + } + + if (he == ELleftend) { + he = he.right(); + while (he != ELrightend && right_of(he, p)) { + he = he.right(); + } + he = he.left(); + } + + else if (he != ELrightend ) { + if (right_of(he, p)) { + he = he.right(); + while (he != ELrightend && right_of(he, p)) { + he = he.right(); + } + he = he.left(); } + } + + else { + he = he.left(); + while (he != ELleftend && !right_of(he,p)) { + he = he.left(); + } + } + + if (bucket > 0 && bucket < ELhashsize - 1) { + if (!ELhash[bucket].isNull()) + //System.out.println("valid bucket"); + ELhash[bucket] = he; + } + return he; + + } + + public boolean right_of(HalfEdge el, Point p) { + //returns 1 if p is to the right of halfedge e + Edge e; + Site topsite; + int right_of_site; + boolean above, fast; + float dxp, dyp, dxs, t1, t2, t3, y1; + + e = el.eledge(); + topsite = e.reg()[1]; + right_of_site = (p.X() > topsite.getCoord().X()) ? 1: 0; + if (right_of_site == 1 && el.elpm() == constants.le()) + return true; + else if (right_of_site == 0 && el.elpm() == constants.re()) + return false; + + if (e.a() == 1) { + dyp = p.Y() - topsite.getCoord().Y(); + dxp = p.X() - topsite.getCoord().X(); + fast = false; + if ((right_of_site == 0 & e.b()< 0) | (right_of_site == 1 & e.b()>=0)) { + above = (dyp >= e.b()*dxp); + fast = above; + } + else { + above = (p.X() + p.Y()*e.b() > e.c()); + if (e.b() < 0) + above = !above; + if (!above) + fast = true; + } + if (!fast) { + dxs = topsite.getCoord().X() - (e.reg()[0]).getCoord().X(); + above = ((e.b() * (dxp * dxp - dyp * dyp)) < (dxs * dyp * (1 + 2*dxp/dxs + e.b()*e.b()))); + if (e.b() < 0) + above = !above; + } + } + else { //e.b() == 1 + y1 = e.c() - e.a()*p.X(); + t1 = p.Y() - y1; + t2 = p.X() - topsite.getCoord().X(); + t3 = y1 - topsite.getCoord().Y(); + above = (t1*t1 > (t2*t2 + t3*t3)); + } + return (el.elpm() == constants.le() ? above : !above); + } + + public void ELdelete(HalfEdge he) { + he.left().setRight(he.right()); + he.right().setLeft(he.left()); + he.setEdge(null); + he.setDeleted(true); + } + + public HalfEdge ELright(HalfEdge he) { + return he.right(); + } + + public HalfEdge ELleft(HalfEdge he) { + return he.left(); + } + + public Neighbor leftReg(HalfEdge he) { + if (he.eledge() == null) + return (Neighbor) constants.bottomsite(); + return (Neighbor) (he.elpm() == constants.le() ? he.eledge().reg()[constants.le()] : he.eledge().reg()[constants.re()]); + } + + public Neighbor rightReg(HalfEdge he) { + if (he.eledge() == null) + return (Neighbor) constants.bottomsite(); + return (Neighbor) (he.elpm() == constants.le() ? he.eledge().reg()[constants.re()] : he.eledge().reg()[constants.le()]); + } + + public Edge bisect(Site s1, Site s2) { + float dx, dy, adx, ady; + Edge newedge; + //System.out.println("bisecting:"); + //System.out.println("s1: " + s1.getCoord().X() + " " + s1.getCoord().Y()); + //System.out.println("s2: " + s2.getCoord().X() + " " + s2.getCoord().Y()); + + newedge = new Edge(); + newedge.reg()[0] = s1; + newedge.reg()[1] = s2; + newedge.ep()[0] = null; + newedge.ep()[1] = null; + + dx = s2.getCoord().X() - s1.getCoord().X(); //System.out.println("dx: " + dx); + dy = s2.getCoord().Y() - s1.getCoord().Y(); //System.out.println("dy: " + dy); + adx = dx > 0 ? dx : -dx; + ady = dy > 0 ? dy : -dy; + + newedge.setc(s1.getCoord().X() * dx + s1.getCoord().Y() * dy +(dx*dx + dy*dy)*0.5); + //newedge.setc((dx*dx + dy*dy)*0.5); + if (adx > ady) { + newedge.seta(1); //System.out.println("a: " + newedge.a()); + newedge.setb(dy/dx); //System.out.println("b: " + newedge.b()); + if (dx == 0) System.out.println("dividing by zero"); + newedge.setc(newedge.c()/dx); //System.out.println("c: " + newedge.c()); + } + else { + newedge.setb(1); //System.out.println("b: " + newedge.b()); + newedge.seta(dx/dy); //System.out.println("a: " + newedge.a()); + if (dy == 0) System.out.println("dividing by zero"); + newedge.setc(newedge.c()/dy); //System.out.println("c: " + newedge.c()); + } + newedge.setedgenbr(constants.nedges()); + vregion.outBisector(newedge); + constants.setnedges(constants.nedges() +1); + return newedge; + } + + public void v_endpoint(Edge e, int origin, int lr, Site s) { + e.ep()[lr] = s; + if (e.ep()[constants.re() - lr] == null) + return; + vregion.outEP(e, origin); + } + + public Site sintersect(HalfEdge el1, HalfEdge el2) { + Edge e1, e2, e; + HalfEdge el; + + float d, xint, yint; + int right_of_site; + Neighbor v; + + e1 = el1.eledge(); + e2 = el2.eledge(); + + if (e1 == null || e2 == null) + return null; + + if (e1.reg()[1] == e2.reg()[1]) + return null; + + d = e1.a() * e2.b() - e1.b()*e2.a(); + if (d==0) return null; + if ((-1 * (10 ^ -10)) < d && d < (10 ^ 10)) + return null; + + xint = (e1.c() * e2.b() - e2.c() * e1.b())/d; + yint = (e2.c() * e1.a() - e1.c() * e2.a())/d; + + if ((e1.reg()[1].getCoord().Y() < e2.reg()[1].getCoord().Y()) || (e1.reg()[1].getCoord().Y() == e2.reg()[1].getCoord().Y() && e1.reg()[1].getCoord().X() < e2.reg()[1].getCoord().X())) { + el = el1; + e = e1; + } + else { + el = el2; + e = e2; + } + right_of_site = (xint >= e.reg()[1].getCoord().X()) ? 1 : 0; + if ((right_of_site == 1 && el.elpm() == constants.le()) || right_of_site == 0 && el.elpm() == constants.re()) + return null; + + v = new Neighbor(); + v.setRefCnt(0); + v.setCoord(new Point()); + v.getCoord().setX(xint); + v.getCoord().setY(yint); + return v; + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/EdgeRNG.java b/src/main/java/plugins/ragini/voronoidiagram/EdgeRNG.java new file mode 100644 index 0000000..9740600 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/EdgeRNG.java @@ -0,0 +1,34 @@ +package plugins.ragini.voronoidiagram; + +import java.awt.geom.Line2D; +import java.util.ArrayList; + +public class EdgeRNG extends Line2D.Double { + + private Neighbor n1, n2; + private ArrayList<Neighbor> endpoints; + private double length; + + public EdgeRNG(Neighbor g1, Neighbor g2) { + super(g1.getCoord().X(), g1.getCoord().Y(), g2.getCoord().X(), g2.getCoord().Y()); + n1 = g1; + n2 = g2; + endpoints = new ArrayList<Neighbor>(2); + endpoints.add(n1); + endpoints.add(n2); + length = distance(g1.getCoord().X(), g1.getCoord().Y(), g2.getCoord().X(), g2.getCoord().Y()); + } + + public ArrayList<Neighbor> endpoints() { + return endpoints; + } + + private double distance(double ax, double ay, double bx, double by) { + return (Math.sqrt((bx - ax)*(bx - ax) + (by - ay)*(by - ay))); + } + + public double length() { + return length; + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/EdgeS.java b/src/main/java/plugins/ragini/voronoidiagram/EdgeS.java new file mode 100644 index 0000000..08c1749 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/EdgeS.java @@ -0,0 +1,65 @@ +package plugins.ragini.voronoidiagram; + +public class EdgeS { + + private float x1, y1, x2, y2; + private int nbr1, nbr2; + private float xm, ym; + + public void setx1(float x) { + x1 = x; + } + + public void sety1(float y) { + y1 = y; + } + + public void setx2(float x) { + x2 = x; + } + + public void sety2(float y) { + y2 = y; + } + + public void setnbr1(int n) { + nbr1 = n; + } + + public void setnbr2(int n) { + nbr2 = n; + } + + public void setxm(float x) { + xm = x; + } + + public void setym(float y) { + ym = y; + } + + public float x1() { + return x1; + } + + public float y1() { + return y1; + } + + public float x2() { + return x2; + } + + public float y2() { + return y2; + } + + public int nbr1() { + return nbr1; + } + + public int nbr2() { + return nbr2; + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/Face.java b/src/main/java/plugins/ragini/voronoidiagram/Face.java new file mode 100644 index 0000000..64b1e1a --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/Face.java @@ -0,0 +1,291 @@ +package plugins.ragini.voronoidiagram; + +//Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. +//Jad home page: http://www.kpdus.com/jad.html +//Decompiler options: packimports(3) +//Source File Name: Face.java + +import java.util.ArrayList; +import java.util.Iterator; + +//Referenced classes of package delaunay: +// QuadEdge, DT, Vertex + +public class Face +{ + + public Face() + { + id_f = id; + id++; + edges = new QuadEdge[3]; + S = DT.vertex_infty; + B = DT.vertex_infty; + setVal(0.0F); + setInvRadius(0.0D); + setInvSize(0.0D); + setMeasure(0.0D); + counter = 0; + } + + public Face(QuadEdge a, QuadEdge b, QuadEdge c) + { + this(); + setEdges(a, b, c); + setCenter(); + setBary(); + setInvSize(Math.max(Math.max(Vertex.distance(B, a.orig()), Vertex.distance(B, b.orig())), Vertex.distance(B, c.orig()))); + setInvRadius(Vertex.distance(S, a.orig())); + if(DT.type == 1) + setMeasure(getInvRadius()); + else + setMeasure(getInvSize()); + } + + public Iterator extractFacesVoisines() + { + ArrayList f_liste = new ArrayList(); + for(int i = 0; i < 3; i++) + { + QuadEdge e = edges[i]; + QuadEdge ee = e; + int count = 0; + do + { + count++; + ee = ee.onext(); + Face fff = ee.rightFace(); + if(fff == null) + fff = DT.face_null; + if(!f_liste.contains(fff)) + f_liste.add(fff); + } while(ee != e && count < 30); + } + + return (Iterator)f_liste.listIterator(); + } + + public Iterator extractFacesVoisines2() + { + ArrayList f_liste = new ArrayList(); + for(int i = 0; i < 3; i++) + { + QuadEdge e = edges[i]; + Face fff = e.sym().rightFace(); + if(fff == null) + fff = DT.face_null; + if(!f_liste.contains(fff)) + f_liste.add(fff); + } + + return (Iterator)f_liste.listIterator(); + } + + public Iterator extractFacesVoisines(double angle, double epsilon) + { + if(angle < 0.0D) + return extractFacesVoisines(); + ArrayList f_liste = new ArrayList(); + for(int i = 0; i < 3; i++) + { + QuadEdge e = edges[i]; + QuadEdge ee = e; + int count = 0; + do + { + count++; + Face fff = ee.rightFace(); + if(fff == null) + fff = DT.face_null; + if(!f_liste.contains(fff)) + if(fff != DT.face_null) + { + if(ecartAngle(fff) < epsilon) + f_liste.add(fff); + } else + { + f_liste.add(fff); + } + ee = ee.onext(); + } while(ee != e && count < 30); + } + + return (Iterator)f_liste.listIterator(); + } + + public Iterator extractFacesVoisines2(double angle, double epsilon) + { + if(angle < 0.0D) + return extractFacesVoisines2(); + ArrayList f_liste = new ArrayList(); + for(int i = 0; i < 3; i++) + { + QuadEdge e = edges[i]; + Face fff = e.sym().rightFace(); + if(fff == null) + fff = DT.face_null; + if(!f_liste.contains(fff)) + if(fff != DT.face_null) + { + if(ecartAngle(fff) < epsilon) + f_liste.add(fff); + } else + { + f_liste.add(fff); + } + } + + return (Iterator)f_liste.listIterator(); + } + + public void setCenter() + { + S = Vertex.findCenter(edges[0].orig(), edges[1].orig(), edges[2].orig()); + } + + public void setBary() + { + B = Vertex.findBary(edges[0].orig(), edges[1].orig(), edges[2].orig()); + } + + public Vertex getCenter() + { + return S; + } + + public Vertex getBary() + { + return B; + } + + public float getVal() + { + return val; + } + + public float getValAux() + { + return val_aux; + } + + public void setValAux(float val) + { + val_aux = val; + } + + public void setVal(float val) + { + this.val = val; + } + + public QuadEdge[] getEdges() + { + return edges; + } + + public void setEdges(QuadEdge a, QuadEdge b, QuadEdge c) + { + edges[0] = a; + edges[1] = b; + edges[2] = c; + } + + public void setInvRadius(double radius) + { + if(radius == 0.0D) + invRadius = DT.MAX_VALUE; + else + invRadius = 1.0D / radius; + } + + public void setInvSize(double size) + { + if(size == 0.0D) + invSize = DT.MAX_VALUE; + invSize = 1.0D / size; + } + + public void setMeasure(double measure) + { + this.measure = measure; + } + + public double getInvRadius() + { + return invRadius; + } + + public double getInvSize() + { + return invSize; + } + + public double getMeasure() + { + return measure; + } + + public int contains(Vertex p) + { + if(invSize == 0.0D) + return 0; + double size = 1.0D / (double)(float)invSize; + return Vertex.distance(p, B) >= size / 3D ? 0 : 1; + } + + public void setCounter(int counter) + { + this.counter = counter; + } + + public int getCounter() + { + return counter; + } + + public double ecartAngle(Face f) + { + double angle2 = 0.0D; + Vertex angle = new Vertex(0.0D, 0.0D); + if(DT.vertexAngle.x == -1D && DT.vertexAngle.y == -1D) + return 0.0D; + angle.x = getCenter().x - f.getCenter().x; + angle.y = getCenter().y - f.getCenter().y; + double norme = Vertex.distance(getCenter(), f.getCenter()); + if(norme == 0.0D) + { + return 0.0D; + } else + { + double cosangle = angle.x * DT.vertexAngle.x + angle.y * DT.vertexAngle.y; + cosangle /= norme; + angle2 = Math.acos(cosangle); + return angle2; + } + } + + public String toString() + { + if(edges[0] != null) + return (new StringBuilder()).append(edges[0].orig()).append(" ").append(edges[1].orig()).append(" ").append(edges[2].orig()).toString(); + else + return null; + } + + private QuadEdge edges[]; + private int counter; + private double invRadius; + private double invSize; + private double measure; + private ArrayList e; + private ArrayList d; + private Vertex S; + private Vertex B; + float val; + float val_aux; + float val_aux_angle; + public int id_f; + static int id = 0; + +} + diff --git a/src/main/java/plugins/ragini/voronoidiagram/FreeList.java b/src/main/java/plugins/ragini/voronoidiagram/FreeList.java new file mode 100644 index 0000000..2b292a1 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/FreeList.java @@ -0,0 +1,8 @@ +package plugins.ragini.voronoidiagram; + +public class FreeList { + + private FreeNode head; + private int nodesize; + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/FreeNode.java b/src/main/java/plugins/ragini/voronoidiagram/FreeNode.java new file mode 100644 index 0000000..ccb74e3 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/FreeNode.java @@ -0,0 +1,7 @@ +package plugins.ragini.voronoidiagram; + +public class FreeNode { + + private FreeNode nextFree; + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/Geometry.java b/src/main/java/plugins/ragini/voronoidiagram/Geometry.java new file mode 100644 index 0000000..3c31008 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/Geometry.java @@ -0,0 +1,98 @@ +package plugins.ragini.voronoidiagram; + +public class Geometry { + + private int PQcount, PQmin; + private HalfEdge[] PQhash; + private Constants constants; + + public Geometry(Constants _constants) { + constants = _constants; + } + + public void PQinsert(HalfEdge he, Site v, double d) { + + + + HalfEdge last, next; + + he.setVertex(v); + he.setystar((float) (v.getCoord().Y() + d)); + last = PQhash[PQbucket(he)]; + while((next = last.PQnext()) != null && (he.ystar()>next.ystar() || (he.ystar() == next.ystar() && v.getCoord().X() > next.vertex().getCoord().X()))) { + last = next; + } + he.setPQnext(last.PQnext()); + last.setPQnext(he); + PQcount +=1; + //System.out.println("inserting halfedge: " + he.vertex().getCoord().X() + ", " + he.ystar()); + } + + public void PQdelete(HalfEdge he) { + HalfEdge last; + if (he.vertex() != null && he.vertex().getCoord() != null) + //System.out.println("removing halfedge: " + he.vertex().getCoord().X() + ", " + he.ystar()); + if (he.vertex() != null) { + last = PQhash[PQbucket(he)]; + while (last.PQnext() != he) { + last = last.PQnext(); + } + last.setPQnext(he.PQnext()); + PQcount -=1; + he.setVertex(null); + } + } + + public int PQbucket(HalfEdge he) { + int bucket; + + bucket = (int) ((he.ystar() - constants.vymin())/constants.vdeltay() * constants.PQhashsize()); ///////////will this cast work? + if (bucket < 0) bucket = 0; + if (bucket >= constants.PQhashsize()) { + bucket = constants.PQhashsize() - 1; + } + if (bucket < PQmin) { + PQmin = bucket; + } + return bucket; + } + + public boolean PQempty() { + return (PQcount == 0); + } + + public Point PQmin() { + Point answer = new Point(); + + while(PQhash[PQmin].PQnext() == null) { + PQmin++; + } + answer.setX(PQhash[PQmin].PQnext().vertex().getCoord().X()); + answer.setY(PQhash[PQmin].PQnext().ystar()); + return answer; + } + + public HalfEdge PQextractmin() { + HalfEdge curr; + + curr = PQhash[PQmin].PQnext(); + PQhash[PQmin].setPQnext(curr.PQnext()); + PQcount--; + return curr; + } + + public void PQinitialize() { + int i; + Point s; + + PQcount = 0; + PQmin = 0; + constants.setPQhashsize((int) (4 * constants.sqrtnsites())); + PQhash = new HalfEdge[constants.PQhashsize()]; + for (i = 0; i < constants.PQhashsize(); i ++) { + PQhash[i] = new HalfEdge(-1); + PQhash[i].setPQnext(null); + } + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/GraphD.java b/src/main/java/plugins/ragini/voronoidiagram/GraphD.java new file mode 100644 index 0000000..ebd2872 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/GraphD.java @@ -0,0 +1,29 @@ +package plugins.ragini.voronoidiagram; + +public class GraphD { + + private Point pt; + private Arcs arcs; + private short nbarcs; + + public void setArcs(Arcs a) { + arcs = a; + } + + public void setNbArcs(short s) { + nbarcs = s; + } + + public Point pt() { + return pt; + } + + public Arcs arcs() { + return arcs; + } + + public short nbarcs() { + return nbarcs; + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/HalfEdge.java b/src/main/java/plugins/ragini/voronoidiagram/HalfEdge.java new file mode 100644 index 0000000..212fc68 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/HalfEdge.java @@ -0,0 +1,103 @@ +package plugins.ragini.voronoidiagram; + +public class HalfEdge { + + private HalfEdge ELleft, ELRight; + private Edge ELedge; + private int ELrefcnt; + private int ELpm; + private Site vertex; + private float ystar; + private HalfEdge PQNext; + private boolean isnull; + private boolean isdeleted; + private int origin; + + public HalfEdge(int i) { + isnull = true; + isdeleted = false; + ELpm = -1; + origin = i; + } + + public Site vertex() { + return vertex; + } + + public Edge eledge() { + return ELedge; + } + + public int elpm() { + return ELpm; + } + + public void setLeft(HalfEdge l) { + ELleft = l; + } + + public void setRight(HalfEdge r) { + ELRight = r; + } + + public void setEdge(Edge e) { + ELedge = e; + } + + public void setPM(int p) { + ELpm = p; + } + + public void setNext(HalfEdge n) { + PQNext = n; + } + + public void setVertex(Site s) { + vertex = s; + } + + public HalfEdge left() { + return ELleft; + } + + public HalfEdge right() { + return ELRight; + } + + public void setystar(float d) { + ystar = d; + } + + public HalfEdge PQnext() { + return PQNext; + } + + public float ystar() { + return ystar; + } + + public void setPQnext(HalfEdge h) { + PQNext = h; + } + + public boolean isNull() { + return isnull; + } + + public boolean isDeleted() { + return isdeleted; + } + + public void setNull(boolean b) { + isnull = b; + } + + public void setDeleted(boolean b) { + isdeleted = b; + } + + public int origin() { + return origin; + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/Image_Extract.java b/src/main/java/plugins/ragini/voronoidiagram/Image_Extract.java new file mode 100644 index 0000000..8410708 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/Image_Extract.java @@ -0,0 +1,69 @@ +package plugins.ragini.voronoidiagram; + +//Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. +//Jad home page: http://www.kpdus.com/jad.html +//Decompiler options: packimports(3) +//Source File Name: Image_Extract.java + +import ij.ImagePlus; +import ij.WindowManager; +import ij.plugin.filter.MaximumFinder; +import ij.plugin.filter.PlugInFilter; +import ij.process.ByteProcessor; +import ij.process.ImageProcessor; +import java.awt.Rectangle; +import javax.swing.JOptionPane; + +public class Image_Extract + implements PlugInFilter +{ + + public Image_Extract() + { + } + + public int setup(String arg, ImagePlus imp) + { + return 127; + } + + public void run(ImageProcessor ip) + { + imp = WindowManager.getCurrentImage(); + ImageProcessor ip2 = imp.getProcessor().resize(imp.getWidth(), imp.getHeight()); + (new ImagePlus("Init", ip2)).show(); + ip = ip.convertToByte(true); + double tolerance = 30D; + double input = -1D; + String s = "30"; + s = JOptionPane.showInputDialog("Input the tolerance parameter (30 by default):", "30"); + input = Double.valueOf(s).doubleValue(); + if(input > 0.0D) + tolerance = input; + Rectangle r = ip.getRoi(); + ip.invert(); + ByteProcessor bp = (new MaximumFinder()).findMaxima(ip, tolerance, -808080D, 0, true, false); + ip.setPixels(bp.getPixels()); + ip.invertLut(); + ip = ip.convertToRGB(); + imp.setProcessor("RGB", ip); + imp.repaintWindow(); + int mask = 255; + for(int y = r.y; y < r.y + r.height; y++) + { + for(int x = r.x; x < r.x + r.width; x++) + { + int rgb = ip.get(x, y); + int rouge = rgb >> 16 & mask; + int vert = rgb >> 8 & mask; + int bleu = rgb & mask; + if(rouge == 0 && bleu == 0 && vert == 0) + ip.set(x, y, 0xff0000); + } + + } + + } + + private ImagePlus imp; +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/IntArraySetter.java b/src/main/java/plugins/ragini/voronoidiagram/IntArraySetter.java new file mode 100644 index 0000000..a4ad0bc --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/IntArraySetter.java @@ -0,0 +1,17 @@ +package plugins.ragini.voronoidiagram; + +public class IntArraySetter implements Setter<Integer[][]> { + + private Integer[][] var; + + @Override + public void set(Integer[][] input) { + var = input; + } + + @Override + public Integer[][] get() { + return var; + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/IntSetter.java b/src/main/java/plugins/ragini/voronoidiagram/IntSetter.java new file mode 100644 index 0000000..144fba8 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/IntSetter.java @@ -0,0 +1,21 @@ +package plugins.ragini.voronoidiagram; + +public class IntSetter implements Setter<Integer> { + + Integer n; + + public IntSetter (int i) { + n = new Integer(i); + } + + @Override + public void set(Integer input) { + n = input; + } + + @Override + public Integer get() { + return n; + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/MorphologicalOperators.java b/src/main/java/plugins/ragini/voronoidiagram/MorphologicalOperators.java new file mode 100644 index 0000000..926ba5d --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/MorphologicalOperators.java @@ -0,0 +1,15 @@ +package plugins.ragini.voronoidiagram; + +import icy.gui.dialog.MessageDialog; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginImageAnalysis; + +public class MorphologicalOperators extends Plugin implements PluginImageAnalysis { + + @Override + public void compute() { + // TODO Auto-generated by Icy4Eclipse + MessageDialog.showDialog("MorphologicalOperators is working fine !"); + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/NVert.java b/src/main/java/plugins/ragini/voronoidiagram/NVert.java new file mode 100644 index 0000000..051af85 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/NVert.java @@ -0,0 +1,39 @@ +package plugins.ragini.voronoidiagram; + +public class NVert { + + private int nbr1, nbr2, onhull, vpid; + + public int onhull() { + return onhull; + } + + public void setOnHull(int o) { + onhull = o; + } + + public int nbr1() { + return nbr1; + } + + public int nbr2() { + return nbr2; + } + + public void setNbr1(int n) { + nbr1 = n; + } + + public void setNbr2(int n) { + nbr2 = n; + } + + public void setVPid(int v) { + vpid = v; + } + + public int vpid() { + return vpid; + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/Neighbor.java b/src/main/java/plugins/ragini/voronoidiagram/Neighbor.java new file mode 100644 index 0000000..3d13260 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/Neighbor.java @@ -0,0 +1,32 @@ +package plugins.ragini.voronoidiagram; + +import java.util.ArrayList; + +public class Neighbor extends Site implements PointType { + + private double dist; + private Site site; + private ArrayList<Neighbor> samedist; + + public Neighbor() { + super(); + samedist = new ArrayList<Neighbor>(); + } + + public Site getSite() { + return site; + } + + public void addNeighbor(Neighbor n) { + neighbors.add(n); + } + + public void same(Neighbor n) { + samedist.add(n); + } + + public ArrayList<Neighbor> samedistpoints() { + return samedist; + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/Point.java b/src/main/java/plugins/ragini/voronoidiagram/Point.java new file mode 100644 index 0000000..7895654 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/Point.java @@ -0,0 +1,23 @@ +package plugins.ragini.voronoidiagram; + +public class Point { + + protected float x, y; + + public float X(){ + return x; + } + + public float Y() { + return y; + } + + public void setX(float _x) { + x = _x; + } + + public void setY(float _y) { + y = _y; + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/PointType.java b/src/main/java/plugins/ragini/voronoidiagram/PointType.java new file mode 100644 index 0000000..614a81c --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/PointType.java @@ -0,0 +1,5 @@ +package plugins.ragini.voronoidiagram; + +public interface PointType { + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/PointVor.java b/src/main/java/plugins/ragini/voronoidiagram/PointVor.java new file mode 100644 index 0000000..cce2fe3 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/PointVor.java @@ -0,0 +1,5 @@ +package plugins.ragini.voronoidiagram; + +public class PointVor { + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/Provider.java b/src/main/java/plugins/ragini/voronoidiagram/Provider.java new file mode 100644 index 0000000..dc34fc2 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/Provider.java @@ -0,0 +1,7 @@ +package plugins.ragini.voronoidiagram; + +public interface Provider<T> { + + public T next(); + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/QuadEdge.java b/src/main/java/plugins/ragini/voronoidiagram/QuadEdge.java new file mode 100644 index 0000000..177d362 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/QuadEdge.java @@ -0,0 +1,289 @@ +package plugins.ragini.voronoidiagram; + +//Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. +//Jad home page: http://www.kpdus.com/jad.html +//Decompiler options: packimports(3) +//Source File Name: QuadEdge.java + +import java.io.PrintStream; + +//Referenced classes of package delaunay: +// Vertex, Face + +public class QuadEdge +{ + + public QuadEdge(QuadEdge Onext, QuadEdge rot, Vertex data, boolean can) + { + this.Onext = Onext; + this.data = data; + this.rot = rot; + canonical = can; + counter = 0; + alpha = 0.0D; + } + + public static QuadEdge makeEdge(Vertex orig, Vertex dest) + { + QuadEdge q0 = new QuadEdge(null, null, null, true); + QuadEdge q1 = new QuadEdge(null, null, null, false); + QuadEdge q2 = new QuadEdge(null, null, null, false); + QuadEdge q3 = new QuadEdge(null, null, null, true); + q0.rot = q1; + q1.rot = q2; + q2.rot = q3; + q3.rot = q0; + q0.Onext = q0; + q1.Onext = q3; + q2.Onext = q2; + q3.Onext = q1; + q0.setData(orig); + q0.sym().setData(dest); + return q0; + } + + public static void splice(QuadEdge q1, QuadEdge q2) + { + QuadEdge alpha = q1.onext().rot(); + QuadEdge beta = q2.onext().rot(); + QuadEdge t1 = q2.onext(); + QuadEdge t2 = q1.onext(); + QuadEdge t3 = beta.onext(); + QuadEdge t4 = alpha.onext(); + q1.setOnext(t1); + q2.setOnext(t2); + alpha.setOnext(t3); + beta.setOnext(t4); + } + + public void splice(QuadEdge q) + { + splice(this, q); + } + + public static void splice2(QuadEdge q1, QuadEdge q2) + { + q2.rot().setOnext(q1.rotSym()); + q1.setOnext(q2); + } + + public void splice2(QuadEdge q) + { + splice2(this, q); + } + + public static QuadEdge connect(QuadEdge a, QuadEdge b) + { + QuadEdge q = makeEdge(a.dest(), b.orig()); + splice(q, a.lnext()); + splice(q.sym(), b); + return q; + } + + public static void deleteEdge(QuadEdge q) + { + splice(q, q.oprev()); + splice(q.sym(), q.sym().oprev()); + } + + public int getCounter() + { + return counter; + } + + public void setCounter(int c) + { + counter = c; + } + + public void setFace(Face f) + { + rightF = f; + } + + public void setFaces(Face f, Face g) + { + rightF = f; + sym().rightF = g; + } + + public void setAlpha(double alpha) + { + this.alpha = alpha; + } + + public double getAlpha() + { + return alpha; + } + + public void setLambda(float lbd) + { + lambda_val = lbd; + } + + public float getLambda() + { + return lambda_val; + } + + public void setMu(float lbd) + { + mu_val = lbd; + } + + public float getMu() + { + return mu_val; + } + + public void setOnext(QuadEdge next) + { + Onext = next; + } + + public void setRot(QuadEdge rot) + { + this.rot = rot; + } + + public void setData(Vertex data) + { + this.data = data; + } + + public QuadEdge onext() + { + return Onext; + } + + public QuadEdge rot() + { + return rot; + } + + public QuadEdge sym() + { + return rot.rot(); + } + + public Vertex orig() + { + return data; + } + + public Vertex dest() + { + return sym().orig(); + } + + public Vertex right() + { + return rot.orig(); + } + + public Vertex left() + { + return rot.sym().orig(); + } + + public Face rightFace() + { + return rightF; + } + + public QuadEdge rotSym() + { + return rot.sym(); + } + + public QuadEdge oprev() + { + return rot.onext().rot(); + } + + public QuadEdge lnext() + { + return rotSym().onext().rot(); + } + + public QuadEdge lprev() + { + return onext().sym(); + } + + public QuadEdge rnext() + { + return rot.onext().rotSym(); + } + + public QuadEdge rprev() + { + return sym().onext(); + } + + public boolean isCanonical() + { + return canonical; + } + + public boolean rightOf(Vertex s) + { + return s.ccw(sym().data, data); + } + + public static boolean rightOf(QuadEdge q, Vertex s) + { + return s.ccw(q.dest(), q.orig()); + } + + public boolean leftOf(Vertex s) + { + return s.ccw(data, dest()); + } + + public static boolean leftOf(Vertex s, QuadEdge q) + { + return s.ccw(q.orig(), q.dest()); + } + + boolean equals(QuadEdge e) + { + return orig() == e.orig() && dest() == e.dest(); + } + + boolean equivalent(QuadEdge e) + { + return orig() == e.orig() && dest() == e.dest() || orig() == e.dest() && dest() == e.orig(); + } + + public int type(double med, int axis) + { + if(!orig().test(med, axis)) + return dest().test(med, axis) ? 0 : -1; + return !dest().test(med, axis) ? 0 : 1; + } + + public String toString() + { + return (new StringBuilder()).append(data).append(" ").append(sym().data).toString(); + } + + public void expliciter() + { + QuadEdge sym = sym(); + System.out.println((new StringBuilder(" Edge")).append(this).append(" onext()").append(onext()).append(" oprev").append(oprev()).append(" lnext").append(lnext()).append(" rprev").append(rprev()).toString()); + System.out.println((new StringBuilder(" Edge inverse ")).append(sym).append(" onext()").append(sym.onext()).append(" oprev").append(sym.oprev()).append(" lnext").append(sym.lnext()).append(" rprev").append(sym.rprev()).toString()); + } + + private QuadEdge Onext; + private QuadEdge rot; + private Vertex data; + private int counter; + private Face rightF; + private double alpha; + private float lambda_val; + private float mu_val; + private boolean canonical; +} + diff --git a/src/main/java/plugins/ragini/voronoidiagram/ROI2DEdge.java b/src/main/java/plugins/ragini/voronoidiagram/ROI2DEdge.java new file mode 100644 index 0000000..5e4b0bc --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/ROI2DEdge.java @@ -0,0 +1,13 @@ +package plugins.ragini.voronoidiagram; + +import icy.roi.ROI2DLine; + +import java.awt.geom.Line2D; + +public class ROI2DEdge extends ROI2DLine { + + public ROI2DEdge(Line2D line) { + super(line.getP1(), line.getP2()); + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/ROI2DSite.java b/src/main/java/plugins/ragini/voronoidiagram/ROI2DSite.java new file mode 100644 index 0000000..f049367 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/ROI2DSite.java @@ -0,0 +1,22 @@ +package plugins.ragini.voronoidiagram; +import java.awt.geom.Point2D; + +import icy.roi.ROI2DPoint; + +public class ROI2DSite extends ROI2DPoint { + + private Site site; + + public ROI2DSite(Point2D dp) { + super(dp); + } + + public void setSite(Site s) { + site = s; + } + + public Site getSite() { + return site; + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/Setter.java b/src/main/java/plugins/ragini/voronoidiagram/Setter.java new file mode 100644 index 0000000..b2aa057 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/Setter.java @@ -0,0 +1,9 @@ +package plugins.ragini.voronoidiagram; + +public interface Setter<T> { + + public void set(T input); + + public T get(); + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/Site.java b/src/main/java/plugins/ragini/voronoidiagram/Site.java new file mode 100644 index 0000000..63d5eb5 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/Site.java @@ -0,0 +1,87 @@ +package plugins.ragini.voronoidiagram; + +import java.util.Comparator; +import java.util.PriorityQueue; + +public class Site { + + protected PriorityQueue<Neighbor> neighbors; + protected Point coord; + private int sitenbr, refcnt; + private ROI2DSite point; + + public Site() { + NeighborComp comp = new NeighborComp(); + neighbors = new PriorityQueue<Neighbor>(5, comp); + } + + public Point getCoord() { + return coord; + } + + public int sitenbr() { + return sitenbr; + } + + public void setRefCnt(int r) { + refcnt = r; + } + + public void setSiteNbr(int n) { + sitenbr = n; + } +///>>>???? + + public void setCoord(Point p) { + coord = p; + } + + public PriorityQueue<Neighbor> neighbors() { + return neighbors; + } + + private class NeighborComp implements Comparator<Neighbor> { + + @Override + public int compare(Neighbor n1, Neighbor n2) { + if (distance(coord.X(), coord.Y(), n1.getCoord().X(), n1.getCoord().Y()) > distance(coord.X(), coord.Y(), n2.getCoord().X(), n2.getCoord().Y())) + return 1; + else if (distance(coord.X(), coord.Y(), n1.getCoord().X(), n1.getCoord().Y()) < distance(coord.X(), coord.Y(), n2.getCoord().X(), n2.getCoord().Y())) + return -1; + else if (n1.getCoord().Y() > n2.getCoord().Y()) { + n2.same(n1); + n1.same(n2); + return 1; } + else if (n1.getCoord().Y() < n2.getCoord().Y()) { + n1.same(n2); + n2.same(n1); + return -1; } + else if (n1.getCoord().X() > n2.getCoord().X()) { + n2.same(n1); + n1.same(n2); + return 1; } + else if (n1.getCoord().X() < n2.getCoord().X()) { + n1.same(n2); + n2.same(n1); + return -1; } + else { + System.out.println("here"); + return 0; + } + } + + private double distance(double ax, double ay, double bx, double by) { + return (Math.sqrt((bx - ax)*(bx - ax) + (by - ay)*(by - ay))); + } + + } + + public void setPoint(ROI2DSite p) { + point = p; + } + + public ROI2DSite getPoint() { + return point; + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/SiteProvider.java b/src/main/java/plugins/ragini/voronoidiagram/SiteProvider.java new file mode 100644 index 0000000..c86a081 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/SiteProvider.java @@ -0,0 +1,26 @@ +package plugins.ragini.voronoidiagram; + +public class SiteProvider implements Provider<Neighbor> { + + private int index; + private int lim; + private Constants cons; + + public SiteProvider (Constants _cons) { + index = 0; + cons = _cons; + lim = cons.sites().length; + } + + @Override + public Neighbor next() { + Neighbor out = null; + if (index < lim) { + out = cons.sites()[index]; + index++; + } + //System.out.println("newsite: " + out.getCoord().X() + " " + out.getCoord().Y()); + return out; + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/Tri.java b/src/main/java/plugins/ragini/voronoidiagram/Tri.java new file mode 100644 index 0000000..f05a078 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/Tri.java @@ -0,0 +1,31 @@ +package plugins.ragini.voronoidiagram; + +public class Tri { + + private Vert v1, v2, v3; + + public void setV1(Vert v) { + v1 = v; + } + + public void setV2(Vert v) { + v2 = v; + } + + public void setV3(Vert v) { + v3 = v; + } + + public Vert v1() { + return v1; + } + + public Vert v2() { + return v2; + } + + public Vert v3() { + return v3; + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/UniformGrid.java b/src/main/java/plugins/ragini/voronoidiagram/UniformGrid.java new file mode 100644 index 0000000..18959ca --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/UniformGrid.java @@ -0,0 +1,719 @@ +package plugins.ragini.voronoidiagram; + +//Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. +//Jad home page: http://www.kpdus.com/jad.html +//Decompiler options: packimports(3) +//Source File Name: UniformGrid.java + +import java.util.Iterator; +import java.util.NoSuchElementException; + +//Referenced classes of package delaunay: +// Vertex, DT, QuadEdge + +public class UniformGrid +{ + class GridCell + { + + PointItem points; + int mark; + final UniformGrid this$0; + + GridCell() + { + super(); + this$0 = UniformGrid.this; + points = null; + mark = -1; + } + } + + class GridInterval + { + + void set() + { + x1 = y1 = 0; + x2 = xsize; + y2 = ysize; + } + + void set(int X1, int Y1, int X2, int Y2) + { + x1 = X1 < 0 ? 0 : X1; + y1 = Y1 < 0 ? 0 : Y1; + x2 = X2 > xsize ? xsize : X2; + y2 = Y2 > ysize ? ysize : Y2; + } + + void set(Vertex v, double radius) + { + int X1 = (int)((v.x - radius - xoffset) / cellsize); + int Y1 = (int)((v.y - radius - yoffset) / cellsize); + int X2 = (int)(((v.x + radius) - xoffset) / cellsize) + 1; + int Y2 = (int)(((v.y + radius) - yoffset) / cellsize) + 1; + set(X1, Y1, X2, Y2); + } + + public String toString() + { + if(x1 < x2 && y1 < y2) + return (new StringBuilder("[")).append(x1).append("..").append(x2 - 1).append("][").append(y1).append("..").append(y2 - 1).append("]").toString(); + else + return "[empty]"; + } + + int x1; + int y1; + int x2; + int y2; + final UniformGrid this$0; + + GridInterval(int X1, int Y1, int X2, int Y2) + { + super(); + this$0 = UniformGrid.this; + set(X1, Y1, X2, Y2); + } + + GridInterval(Vertex v, double radius) + { + super(); + this$0 = UniformGrid.this; + set(v, radius); + } + } + + class GridPosition + { + + int x; + int y; + final UniformGrid this$0; + + GridPosition(Vertex v) + { + super(); + this$0 = UniformGrid.this; + x = (int)((v.x - xoffset) / cellsize); + y = (int)((v.y - yoffset) / cellsize); + if(x < 0) + x = 0; + if(x >= xsize) + x = xsize - 1; + if(y < 0) + y = 0; + if(y >= ysize) + y = ysize - 1; + } + } + + class PointItem + { + + Vertex point; + PointItem next; + final UniformGrid this$0; + + PointItem() + { + super(); + this$0 = UniformGrid.this; + point = null; + next = null; + } + } + + class PointIterator + implements Iterator + { + + public boolean hasNext() + { + return ptr != null; + } + + public Object next() + { + if(ptr == null) + { + throw new NoSuchElementException(); + } else + { + Vertex res = ptr.point; + ptr = ptr.next; + return res; + } + } + + public void remove() + { + throw new UnsupportedOperationException(); + } + + PointItem ptr; + final UniformGrid this$0; + + PointIterator(int x, int y) + { + super(); + this$0 = UniformGrid.this; + ptr = null; + ptr = grid[x][y].points; + } + } + + + UniformGrid(Vertex verts[], int mincells) + { + grid = null; + array = null; + xsize = 0; + ysize = 0; + xoffset = 0.0D; + yoffset = 0.0D; + cellsize = 0.0D; + currentMark = 0; + array = new PointItem[verts.length]; + for(int i = 0; i < array.length; i++) + array[i] = new PointItem(); + + double xmax; + double xmin = xmax = verts[0].x; + double ymax; + double ymin = ymax = verts[0].y; + for(int i = 1; i < verts.length; i++) + { + if(verts[i].x < xmin) + xmin = verts[i].x; + if(verts[i].x > xmax) + xmax = verts[i].x; + if(verts[i].y < ymin) + ymin = verts[i].y; + if(verts[i].y > ymax) + ymax = verts[i].y; + } + + cellsize = Math.sqrt(((xmax - xmin) * (ymax - ymin)) / (double)mincells); + xsize = (int)Math.ceil((xmax - xmin) / cellsize); + ysize = (int)Math.ceil((ymax - ymin) / cellsize); + xoffset = xmin - (cellsize * (double)xsize - (xmax - xmin)) / 2D; + yoffset = ymin - (cellsize * (double)ysize - (ymax - ymin)) / 2D; + grid = new GridCell[xsize][ysize]; + for(int i = 0; i < xsize; i++) + { + for(int j = 0; j < ysize; j++) + grid[i][j] = new GridCell(); + + } + + for(int i = 0; i < verts.length; i++) + { + int x = (int)((verts[i].x - xoffset) / cellsize); + int y = (int)((verts[i].y - yoffset) / cellsize); + if(x < 0) + x = 0; + if(x >= xsize) + x = xsize - 1; + if(y < 0) + y = 0; + if(y >= ysize) + y = ysize - 1; + array[i].point = verts[i]; + array[i].next = null; + if(grid[x][y].points == null) + { + grid[x][y].points = array[i]; + } else + { + PointItem last; + for(last = grid[x][y].points; last.next != null; last = last.next); + last.next = array[i]; + } + } + + } + + public int XCells() + { + return xsize; + } + + public int YCells() + { + return ysize; + } + + public double XMin() + { + return xoffset; + } + + public double YMin() + { + return yoffset; + } + + public double XMax() + { + return xoffset + (double)xsize * cellsize; + } + + public double YMax() + { + return yoffset + (double)ysize * cellsize; + } + + public double XSize() + { + return (double)xsize * cellsize; + } + + public double YSize() + { + return (double)ysize * cellsize; + } + + public double CellSize() + { + return cellsize; + } + + public PointIterator cellIterator(int x, int y) + { + return new PointIterator(x, y); + } + + void resetAllMarks() + { + currentMark++; + } + + void setMark(int x, int y) + { + grid[x][y].mark = currentMark; + } + + void unsetMark(int x, int y) + { + grid[x][y].mark = currentMark - 1; + } + + boolean isMarked(int x, int y) + { + return grid[x][y].mark == currentMark; + } + + public int numPoints(int x1, int y1, int x2, int y2) + { + int cnt = 0; + for(int i = x1; i < x2; i++) + { + for(int j = y1; j < y2; j++) + { + for(PointIterator pi = cellIterator(i, j); pi.hasNext();) + { + pi.next(); + cnt++; + } + + } + + } + + return cnt; + } + + public double pseudoMedian(int axis) + { + int cfirst = 0; + int clast = 0; + int cnt = 0; + double med = 0.0D; + switch(axis) + { + default: + break; + + case 0: // '\0' + { + int pfirst = 0; + for(int plast = xsize - 1; pfirst < plast;) + if(cfirst <= clast) + { + cfirst += numPoints(pfirst, 0, pfirst + 1, ysize); + pfirst++; + } else + { + clast += numPoints(plast, 0, plast + 1, ysize); + plast--; + } + + for(int i = 0; i < ysize; i++) + { + for(PointIterator pi = cellIterator(pfirst, i); pi.hasNext();) + { + med += ((Vertex)pi.next()).x; + cnt++; + } + + } + + if(cnt > 0) + med /= cnt; + else + med = (double)pfirst * cellsize + xoffset; + break; + } + + case 1: // '\001' + { + int pfirst = 0; + for(int plast = ysize - 1; pfirst < plast;) + if(cfirst <= clast) + { + cfirst += numPoints(0, pfirst, xsize, pfirst + 1); + pfirst++; + } else + { + clast += numPoints(0, plast, xsize, plast + 1); + plast--; + } + + for(int i = 0; i < xsize; i++) + { + for(PointIterator pi = cellIterator(i, pfirst); pi.hasNext();) + { + med += ((Vertex)pi.next()).y; + cnt++; + } + + } + + if(cnt > 0) + med /= cnt; + else + med = (double)pfirst * cellsize + yoffset; + break; + } + } + return med; + } + + public Vertex findNearestPointLinear(Vertex v) + { + double dist = 0.0D; + Vertex found = null; + for(int i = 0; i < array.length; i++) + if(array[i].point != v) + { + double pom = Vertex.sqrDistance(v, array[i].point); + if(found == null || pom < dist) + { + found = array[i].point; + dist = pom; + } + } + + return found; + } + + public Vertex findDelaunayPointLinear(Vertex a, Vertex b) + { + double dist = 0.0D; + Vertex found = null; + for(int i = 0; i < array.length; i++) + if(array[i].point != a && array[i].point != b && Vertex.ccw(a, b, array[i].point)) + { + double pom = Vertex.delaunayDistance(a, b, array[i].point); + if(found == null || pom < dist) + { + found = array[i].point; + dist = pom; + } + } + + return found; + } + + public Vertex findFirst(Vertex v) + { + resetAllMarks(); + Vertex found = null; + GridPosition gp = new GridPosition(v); + GridInterval gr = new GridInterval(gp.x, gp.y, gp.x + 1, gp.y + 1); +label0: + while(found == null) + { + for(int i = gr.x1; i < gr.x2; i++) + { + for(int j = gr.y1; j < gr.y2; j++) + { + if(isMarked(i, j)) + continue; + for(PointIterator pi = cellIterator(i, j); pi.hasNext();) + { + Vertex pom = (Vertex)pi.next(); + if(pom != v) + { + found = pom; + break label0; + } + } + + setMark(i, j); + } + + } + + if(gr.x1 == 0 && gr.y1 == 0 && gr.x2 == xsize && gr.y2 == ysize) + break; + gr.set(gr.x1 - 1, gr.y1 - 1, gr.x2 + 1, gr.y2 + 1); + } + return found; + } + + public Vertex findNearestPoint(Vertex v) + { + Vertex found = findFirst(v); + if(found == null) + return null; + double dist = Vertex.distance(v, found); + GridInterval gr = new GridInterval(v, dist); + for(int i = gr.x1; i < gr.x2; i++) + { + for(int j = gr.y1; j < gr.y2; j++) + if(!isMarked(i, j)) + { + for(PointIterator pi = cellIterator(i, j); pi.hasNext();) + { + Vertex pom = (Vertex)pi.next(); + if(pom != v) + { + double dd = Vertex.distance(pom, v); + if(dd < dist) + { + dist = dd; + found = pom; + gr.set(v, dist); + } + } + } + + setMark(i, j); + } + + } + + return found; + } + + public Vertex findDelaunayPoint(Vertex a, Vertex b) + { + resetAllMarks(); + Vertex found = null; + GridPosition gp = new GridPosition(new Vertex((a.x + b.x) / 2D, (a.y + b.y) / 2D)); + GridInterval gr = new GridInterval(gp.x, gp.y, gp.x + 1, gp.y + 1); + Vertex S; +label0: + while(found == null) + { + for(int i = gr.x1; i < gr.x2; i++) + { + for(int j = gr.y1; j < gr.y2; j++) + { + if(isMarked(i, j)) + continue; + for(PointIterator pi = cellIterator(i, j); pi.hasNext();) + { + Vertex pom = (Vertex)pi.next(); + S = Vertex.findCenter(a, b, pom); + double rad = Vertex.distance(S, a); + if(pom != a && pom != b && Vertex.ccw(a, b, pom) && rad < DT.MAX_VALUE) + { + found = pom; + break label0; + } + } + + setMark(i, j); + } + + } + + if(gr.x1 == 0 && gr.y1 == 0 && gr.x2 == xsize && gr.y2 == ysize) + break; + gr.set(gr.x1 - 1, gr.y1 - 1, gr.x2 + 1, gr.y2 + 1); + } + if(found == null) + return null; + S = Vertex.findCenter(a, b, found); + double dist = Vertex.distance(S, a); + if(!Vertex.ccw(a, b, S)) + dist = -dist; + gr.set(S, Math.abs(dist)); + for(int i = gr.x1; i < gr.x2; i++) + { +label1: + for(int j = gr.y1; j < gr.y2; j++) + { + if(isMarked(i, j)) + continue; + for(PointIterator pi = cellIterator(i, j); pi.hasNext();) + { + Vertex pom = (Vertex)pi.next(); + if(pom != a && pom != b && Vertex.ccw(a, b, pom)) + { + S = Vertex.findCenter(a, b, pom); + double dd = Vertex.distance(S, a); + if(!Vertex.ccw(a, b, S)) + dd = -dd; + if(dd < dist) + { + dist = dd; + found = pom; + int x1 = gr.x1; + int y1 = gr.y1; + int y2 = gr.y2; + gr.set(S, Math.abs(dist)); + if(gr.x1 < x1 || gr.y1 < y1 || gr.y2 > y2) + { + i = gr.x1 - 1; + break label1; + } + } + } + } + + setMark(i, j); + } + + } + + return found; + } + + public QuadEdge findShortestCrossEdge(double med, int coord) + { + Vertex a = null; + Vertex b = null; + double d = 0.0D; + switch(coord) + { + case 0: // '\0' + for(int x = (int)((med - xoffset) / cellsize); a == null && x >= 0; x--) + { + for(int i = 0; i < ysize; i++) + { + for(PointIterator pi = cellIterator(x, i); pi.hasNext();) + { + Vertex pom = (Vertex)pi.next(); + double dd = Math.abs(pom.x - med); + if(pom.x < med && (a == null || dd < d)) + { + a = pom; + d = dd; + } + } + + } + + } + + if(a == null) + return null; + int xmax = xsize; + for(int x = (int)((med - xoffset) / cellsize); b == null || x < xmax; x++) + { + for(int i = 0; i < ysize; i++) + { + for(PointIterator pi = cellIterator(x, i); pi.hasNext();) + { + Vertex pom = (Vertex)pi.next(); + double dd = Vertex.distance(a, pom); + if(pom.x >= med && (b == null || dd < d)) + { + b = pom; + d = dd; + xmax = (int)(((med + d) - xoffset) / cellsize) + 1; + if(xmax > xsize) + xmax = xsize; + } + } + + } + + } + + break; + + case 1: // '\001' + for(int y = (int)((med - yoffset) / cellsize); a == null && y >= 0; y--) + { + for(int i = 0; i < xsize; i++) + { + for(PointIterator pi = cellIterator(i, y); pi.hasNext();) + { + Vertex pom = (Vertex)pi.next(); + double dd = Math.abs(pom.y - med); + if(pom.y < med && (a == null || dd < d)) + { + a = pom; + d = dd; + } + } + + } + + } + + if(a == null) + return null; + int ymax = ysize; + for(int y = (int)((med - yoffset) / cellsize); b == null || y < ymax; y++) + { + for(int i = 0; i < xsize; i++) + { + for(PointIterator pi = cellIterator(i, y); pi.hasNext();) + { + Vertex pom = (Vertex)pi.next(); + double dd = Vertex.distance(a, pom); + if(pom.y >= med && (b == null || dd < d)) + { + b = pom; + d = dd; + ymax = (int)(((med + d) - yoffset) / cellsize) + 1; + if(ymax > ysize) + ymax = ysize; + } + } + + } + + } + + break; + } + if(b == null) + return null; + else + return QuadEdge.makeEdge(a, b); + } + + private GridCell grid[][]; + private PointItem array[]; + private int xsize; + private int ysize; + private double xoffset; + private double yoffset; + private double cellsize; + private int currentMark; + + + + + + +} + diff --git a/src/main/java/plugins/ragini/voronoidiagram/VRegion.java b/src/main/java/plugins/ragini/voronoidiagram/VRegion.java new file mode 100644 index 0000000..e95a35d --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/VRegion.java @@ -0,0 +1,1071 @@ + package plugins.ragini.voronoidiagram; +import java.awt.geom.Line2D; +import java.awt.geom.Point2D; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; + + +public class VRegion { + + private float pxmin = 10^10, pxmax = -1*(10^10), pymin = 10^10, pymax = -1 * (10^10); + + private float[] xminymin, xminymax, xmaxymax, xmaxymin; + + private float Pxmin, Pxmax, Pymin, Pymax; + + private VertTheta[] corner; + + private int numverts, numvedges, numtris; + + private int[] inverse; + + private VertTheta [] vtlist, slist; + private int vtnum; + private Integer[][] adjlist; + + private int MAXVERTS; + private Constants constants; + private Vonoroi voronoi; + private ArrayList<Neighbor>[][] bins; + private VoronoiDiagram main; + + private static final int SAFE = -900000; + + public VRegion(Constants _constants, VoronoiDiagram v) { + xminymin = new float[3]; + xminymax = new float[3]; + xmaxymax = new float[3]; + xmaxymin = new float[3]; + vtlist = new VertTheta [1024]; + slist = new VertTheta [1024]; + adjlist = new Integer [MAXVERTS * 3][2]; + corner = new VertTheta[4]; + constants = _constants; + inverse = new int[constants.maxVerts()]; + main = v; + } + + public void setVoronoi(Vonoroi v) { + voronoi = v; + } + + public void outSite(Site s) { + + } + + public void outBisector(Edge e) { + //System.out.println("triangle line: " + "(" + e.reg()[0].getCoord().X() + "," + e.reg()[1].getCoord().Y() + ")" + " (" + e.reg()[0].getCoord().X() + "," + e.reg()[1].getCoord().Y() + ")"); + } + + public void clipLine(Edge e, int origin) { + Site s1, s2; + Site r1, r2; + float x1, x2, y1, y2; + + if (e.a() == 1 && e.b() >= 0) { + s1 = e.ep()[1]; + //if (s1 == null) System.out.println("s1 null"); + //else if (s1.getCoord() == null) System.out.println("s1 coord null"); + //else System.out.println("s1: " + s1.getCoord().X() + " " + s1.getCoord().Y()); + s2 = e.ep()[0]; + //if (s2 == null) System.out.println("s2 null"); + //else if (s2.getCoord() == null) System.out.println("s2 coord null"); + //else System.out.println("s2: " + s2.getCoord().X() + " " + s1.getCoord().Y()); + r1 = e.reg()[1]; + r2 = e.reg()[0]; + } + + else { + s1 = e.ep()[0]; + //if (s1 == null) System.out.println("s1 null"); + //else if (s1.getCoord() == null) System.out.println("s1 coord null"); + //else System.out.println("s1: " + s1.getCoord().X() + " " + s1.getCoord().Y()); + s2 = e.ep()[1]; + //if (s2 == null) System.out.println("s2 null"); + //else if (s2.getCoord() == null) System.out.println("s2 coord null"); + //else System.out.println("s2: " + s2.getCoord().X() + " " + s2.getCoord().Y()); + r1 = e.reg()[0]; + r2 = e.reg()[1]; + } + + if (s1 == null || s2 == null) { + NVert vA, vB; + int A, B; + + A = r1.sitenbr(); + B = r2.sitenbr(); + + vA = constants.chverts()[A]; + vB = constants.chverts()[B]; + + vA.setOnHull(1); + vB.setOnHull(1); + + if (vA.nbr1() == 1) { + vB.setNbr1(B); + } + else if (vA.nbr2() == -1) { + if(vA.nbr1() != B) { + vA.setNbr2(B); + } + } + + if (vB.nbr1() == -1) { + vB.setNbr1(A); + } + else if (vB.nbr2() == -1) { + if (vB.nbr1() != A) { + vB.setNbr2(A); + } + } + + } + + if(e.a() == 1) { + y1 = pymin; + if (s1 != null && s1.getCoord().Y() > pymin) { + y1 = s1.getCoord().Y(); + } + if (y1 > pymax) return; + x1 = e.c() - e.b()*y1; + y2 = pymax; + if (s2 != null && s2.getCoord().Y() < pymax) { + y2 = s2.getCoord().Y(); + } + if (y2 < pymin) return; + x2 = e.c() - e.b()*y2; + if ((x1 > pxmax & x2 > pxmax) | (x1 < pxmin & x2 <pxmin)) { + return; + } + if (x1 > pxmax) { + x1 = pxmax; + y1 = (e.c()-x1)/e.b(); + if (e.b() == 0) System.out.println("dividing by zero"); + + } + if (x1 < pxmin) { + x1 = pxmin; + y1 = (e.c() - x1)/e.b(); + if (e.b() == 0) System.out.println("dividing by zero"); + } + if (x2 > pxmax) { + x2 = pxmax; + y2 = (e.c() - x2)/e.b(); + if (e.b() == 0) System.out.println("dividing by zero"); + } + if (x2 < pxmin) { + x2 = pxmin; + y2 = (e.c() - x2)/e.b(); + if (e.b() == 0) System.out.println("dividing by zero"); + } + } + else { + x1 = pxmin; + if (s1 != null && s1.getCoord().X() > pxmin) { + x1 = s1.getCoord().X(); + } + if (x1 > pxmax) return; + y1 = e.c() - e.a() * x1; + x2 = pxmax; + if (s2 != null && s2.getCoord().X() < pxmax) { + x2 = s2.getCoord().X(); + } + if (x2 < pxmin) return; + y2 = e.c() - e.a() * x2; + if ((y1 > pymax & y2 > pymax) | (y1 < pymin & y2 < pymin)) return; + if (y1> pymax) { + y1 = pymax; + x1 = (e.c() - y1)/e.a(); + if(e.a() == 0) System.out.println("dividing by zero"); + } + if(y1 < pymin) { + y1 = pymin; + x1 = (e.c() - y1) /e.a(); + if(e.a() == 0) System.out.println("dividing by zero"); + } + if(y2 > pymax) { + y2 = pymax; + x2 = (e.c() - y2) /e.a(); + if(e.a() == 0) System.out.println("dividing by zero"); + } + if(y2 < pymin) { + y2 = pymin; + x2 = (e.c() - y2) /e.a(); + if(e.a() == 0) System.out.println("dividing by zero"); + } + } + + //draw line(x1,y1,x2,y2) + //System.out.println("line: " + "(" + x1 + "," + y1 + ")" + " (" + x2 + "," + y2 + ")"); + Point2D p1 = new Point2D.Double(x1, y1); + Point2D p2 = new Point2D.Double(x2, y2); + /*try { + Thread.sleep(2000); + } catch (InterruptedException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + }*/ + constants.lines()[constants.lineindex()][0] = p1; + constants.lines()[constants.lineindex()][1] = p2; + constants.setlineindex(constants.lineindex() + 1); + + if (constants.triangulate() == 0) { + constants.vedges()[numvedges] = new EdgeS(); + constants.vedges()[numvedges].setx1(x1); + constants.vedges()[numvedges].sety1(y1); + constants.vedges()[numvedges].setx2(x2); + constants.vedges()[numvedges].sety2(y2); + + constants.vedges()[numvedges].setnbr1(r1 != null ? r1.sitenbr() : SAFE); + constants.vedges()[numvedges].setnbr2(r2 != null ? r2.sitenbr() : SAFE-1); + + if (r1 != null && r2 != null) { + constants.vedges()[numvedges].setxm(avg(r1.getCoord().X(), r2.getCoord().X())); + constants.vedges()[numvedges].setym(avg(r1.getCoord().Y(), r2.getCoord().Y())); + } + + if(constants.vrdebug() == 1) { + ///System.out.println... + } + + if (numvedges < constants.maxEdges()) numvedges++; + else { + System.out.println("edge list overflow!"); + System.exit(-1); + } + + } + return; + + } + + public float avg(float a, float b) { + return (a + b)/2; + } + + public void outEP(Edge e, int origin) { + + if(constants.triangulate() == 0) { + clipLine(e, origin); + } + + if(constants.vrdebug() == 1) { + ///System.out.println... + } + + } + + public void outVertex (Site v) { + + if(constants.triangulate() == 0) { + constants.verts()[numverts] = new Vert(); + constants.verts()[numverts].setX(v.getCoord().X()); + constants.verts()[numverts].setY(v.getCoord().Y()); + + if (numverts < constants.maxVerts()) numverts++; + else { + System.out.println("nvert list overflow"); + System.exit(-1); //not sure if should use this + } + + } + + if(constants.vrdebug() == 1) { + ///System.out.println... + } + + } + + public int CHS_LEFTOF(float cx, float cy, float ax, float ay, float bx, float by) { + + /* predicate: true iff point c leftof directed line ab */ + /* observation: we should use two shortest disp vectors */ + + double dist_ab, dist_bc, dist_ca, max_dist; + double det_b, det_a, det_c; + double err_b, err_a, err_c; + + if (ax == bx && ay == by) { + System.out.println("indeterminate line"); + return 0; + } + + if ((cx == ax && cy == ay) ||(cx == bx && cy == by)) + return 0; + + dist_ab = Math.sqrt((bx - ax)*(bx - ax) + (by - ay)*(by - ay)); + dist_bc = Math.sqrt((cx - bx)*(cx - bx) + (cy - by)*(cy - by)); + dist_ca = Math.sqrt((ax - cx)*(ax - cx) + (ay - cy)*(ay - cy)); + + max_dist = max(dist_ab, max(dist_bc, dist_ca)); + + if(max_dist == dist_bc) { + /* use a as a pivot point [ie., form (c-a) x (b-a)] */ + det_a = (ax - cx) * (by - ay) - (ay - cy) * (bx - ax); + if (det_a == 0) return 0; + err_a = (Math.abs((ax - cx) * (by - ay)) + Math.abs((ay - cy) * (bx - ax)))/det_a; + if ((Math.abs(det_a) > (10^-6)) || (err_a < (10^-7))) { + return ((det_a > 0) ? 1 : 0); + } + else return 0; + } + else if (max_dist == dist_ca) { + /* use b as a pivot point [ie., form (a-b) x (c-b)] */ + det_b = (cx - bx) * (ay - by) - (cy - by) * (ax - bx); + if (det_b == 0) return 0; + err_b = (Math.abs((cx - bx) * (ay - by)) + Math.abs((cy - by) * (ax - bx)))/det_b; + if ((Math.abs(det_b) > (10^-6)) || (err_b < (10^-7))) { + return ((det_b > 0) ? 1 : 0); + } + else return 0; + } + else if (max_dist == dist_ab) { + /* use c as a pivot point [ie., form (b-c) x (a-c)] */ + det_c = (ax - cx) * (by - cy) - (ay - cy) * (bx - cx); + if (det_c == 0) { + return (0);} + err_c = (Math.abs((cx - ax) * (by - cy)) + Math.abs((cy - ay) * (bx - cx))) / det_c; + if ((Math.abs(det_c) > (10^-6)) || (err_c < (10^-7))) { + return ((det_c > 0)? 1 : 0); } + else { + return (0); } + } + else { + System.out.println("error max distance"); + } + return -3; + } + + public double max(double a, double b) { + return (a > b? a : b); + } + + public float max(float a, float b) { + return (a > b? a : b); + } + + public void outTriple(Neighbor s1, Neighbor s2, Neighbor s3) { + + Vert tmp; + Tri tri = null; + + if (constants.triangulate() == 1) { + if (numtris < constants.maxTris()) { + tri = new Tri(); + } + else { + System.out.println("triangle list overflow"); + System.exit(-1); + } + + tri.setV1(new Vert(constants.sites()[s1.sitenbr()].getCoord().X(), constants.sites()[s1.sitenbr()].getCoord().Y())); + tri.setV2(new Vert(constants.sites()[s2.sitenbr()].getCoord().X(), constants.sites()[s2.sitenbr()].getCoord().Y())); + tri.setV3(new Vert(constants.sites()[s3.sitenbr()].getCoord().X(), constants.sites()[s3.sitenbr()].getCoord().Y())); + + if (CHS_LEFTOF(tri.v3().X(), tri.v3().Y(), tri.v1().X(), tri.v1().Y(), tri.v2().X(), tri.v2().Y()) == 0) { + tmp = tri.v3(); + tri.setV3(tri.v2()); + tri.setV2(tmp); + } + + if(constants.rng() == 1) { + ArrayList<EdgeRNG> lines = new ArrayList<EdgeRNG>(); + lines.add(new EdgeRNG(s1, s2)); + lines.add(new EdgeRNG(s2, s3)); + lines.add(new EdgeRNG(s1, s3)); + for (EdgeRNG e: lines) { + boolean keep = true; + int i = 0; + for(Neighbor n: e.endpoints()) { + int thisbinx = (int) (Math.floor(n.getCoord().X()/constants.getedgex())) -1; + if (thisbinx < 0) thisbinx = 0; + int thisbiny = (int) (Math.floor(n.getCoord().Y()/constants.getedgey())) -1; + if (thisbiny < 0) thisbiny = 0; + int numbinsx = (int) Math.ceil(e.length()/constants.getedgex()) + 3; + int numbinsy = (int) Math.ceil(e.length()/constants.getedgey()) + 3; + int bstartx = thisbinx - numbinsx; + if (bstartx < 0) bstartx = 0; + int bendx = thisbinx + numbinsx; + if (bendx > constants.maxbinx()) bendx = constants.maxbinx(); + int bstarty = thisbiny - numbinsy; + if (bstarty < 0) bstarty = 0; + int bendy = thisbiny + numbinsy; + if (bendy> constants.maxbiny()) bendy = constants.maxbiny(); + for (int bx = bstartx; bx < bendx; bx++) { + for (int by = bstarty; by < bendy; by++) { + ArrayList<Neighbor> test = bins[bx][by]; + if (test != null) { + for (Neighbor t : test) { + if (t != e.endpoints().get(0) + && t != e.endpoints().get(1)) { + double dist = distance(n, t); + if (dist < e.length()) { + int otherend = (i == 0) ? 1: 0; + double dist2 = distance(e.endpoints().get(otherend), t); + if (dist2 < e.length()) keep = false; + } + } + } + } + } + } + i++; + } + if (keep == true) constants.relativeneighbors().add(e); + } + } + + constants.tris()[numtris] = tri; + numtris++; + + if (!s1.neighbors().contains(s2)) + s1.addNeighbor(s2); + if (!s1.neighbors().contains(s3)) + s1.addNeighbor(s3); + if (!s2.neighbors().contains(s1)) + s2.addNeighbor(s1); + if (!s2.neighbors().contains(s3)) + s2.addNeighbor(s3); + if (!s3.neighbors().contains(s1)) + s3.addNeighbor(s1); + if (!s3.neighbors().contains(s2)) + s3.addNeighbor(s2); + + } + } + + private double distance(Neighbor g1, Neighbor g2) { + return distance(g1.getCoord().X(), g1.getCoord().Y(), g2.getCoord().X(), g2.getCoord().Y()); + } + + private double distance(double ax, double ay, double bx, double by) { + return (Math.sqrt((bx - ax)*(bx - ax) + (by - ay)*(by - ay))); + } + + public void vdInit() { + numtris = 0; + numvedges = 0; + numverts = 0; + } + + public void emitSites(Site[] vsites, int nsites) { + //Printing some stuff... + //opening files + } + + private class scomp implements Comparator<Neighbor> { + + @Override + public int compare(Neighbor s1, Neighbor s2) { + if(s1.getCoord().Y() < s2.getCoord().Y()) return -1; + else if (s1.getCoord().Y() > s2.getCoord().Y()) return 1; + else if (s1.getCoord().X() < s2.getCoord().X()) return -1; + else if (s1.getCoord().X() > s2.getCoord().X()) return 1; + else return 0; + } + + } + + public void bBoxInit() { + int k; + float dx, dy, x, y; + + constants.setvxmin(10^10); + constants.setvxmax(-1*(10^10)); + constants.setvymin(10^10); + constants.setvymax(-1*(10^10)); + + Neighbor [] sites = new Neighbor[constants.nsites()]; + + //System.out.println("numsites: " + constants.nsites()); + for (k = 0; k < constants.nsites(); k++) { + //set sites all the same as GLsites (right now, the data read directly from the image) + + Point c = new Point(); + x = constants.getGLSites()[k].X(); //System.out.println("glsitex: " + x); + y = constants.getGLSites()[k].Y(); //System.out.println("glsitey: " + y); + c.setX(x); + c.setY(y); + Neighbor s = new Neighbor(); + s.setCoord(c); + s.setSiteNbr(k); + sites[k] = s; + + //System.out.println("setting site: " + s.getCoord().X() + " " + s.getCoord().Y()); + + //find the current bounds + + if(x < constants.vxmin()) { + constants.setvxmin(x); + } + + if (y < constants.vymin()) { + constants.setvymin(y); + } + + if (x > constants.vxmax()) { + constants.setvxmax(x); + } + + if (y > constants.vymax()) { + constants.setvymax(y); + } + + } + + if(constants.rng() == 1) { + constants.setrelativeneighbors(new ArrayList<EdgeRNG>(constants.nsites() * 2)); + int n = (int) Math.floor(Math.sqrt(constants.nsites())); + constants.setmaxbinx(n); + constants.setmaxbiny(n); + bins = new ArrayList[n][n]; + int edgex = (int) Math.floor((constants.vxmax()-constants.vxmin())/n); + constants.setedgex(edgex); + int edgey = (int) Math.floor((constants.vymax()-constants.vymin())/n); + constants.setedgey(edgey); + int binx; + int biny; + for(Neighbor j: sites) { + binx = (int) (Math.floor(j.getCoord().X()/edgex)) -1; + if (binx < 0) binx = 0; + biny = (int) (Math.floor(j.getCoord().Y()/edgey)) -1; + if (biny < 0) biny = 0; + if (bins[binx][biny] == null) { + bins[binx][biny] = new ArrayList<Neighbor>(); + } + bins[binx][biny].add(j); + } + } + + scomp comp = new scomp(); + + Arrays.sort(sites, comp); + + constants.setSites(sites); + + if (constants.vrdebug() == 1) { + emitSites(constants.sites(), constants.nsites()); //print some stuff... + } + + float epsilon = 1; + + dx = constants.vxmax() - constants.vxmin(); + dx = max(dx, epsilon); + + dy = constants.vymax() - constants.vymin(); + dy = max(dy, epsilon); + + pxmin = (float) (constants.vxmin() - (dx*0.25)); + pymin = (float) (constants.vymin() - (dy*0.25)); + pxmax = (float) (constants.vxmax() + (dx*0.25)); + pymax = (float) (constants.vymax() + (dy*0.25)); + + //Some more printing... + + } + + /* load_vsites(): + accept the n voronoi sites (x_n, y_n) + calculate and store the voronoi diagram over the n sites, + clipping all infinite edges to bbox: [xmin, ymin, xmax, ymax]. + + note: if (xmin,ymin,xmax,ymax are all == 0.0), OR + if these do not enclose the data, a bounding box + will be computed over the input. + + returns: + -1 if error + 0 otherwise +*/ + + //usites = data from image + //n = number of data points? + + public int loadVSites (int n, float[][] usites, float uxmin, float uymin, float uxmax, float uymax) { + int k, compute_bbox, sid; //tid; + float dx, dy; //x, y; + + if (n >= constants.maxSites()) { + System.out.println("error too many sites"); + return -1; + } + + compute_bbox = ((uxmin == 0) && (uymin == 0) && (uxmax == 0) && (uymax == 0)) ? 1 : 0; + + Vert[] USites = new Vert[n]; + Vert[] GLSites = new Vert[n]; + //NVert[] chverts = new NVert[constants.maxVerts()]; + for (k = 0; k < n; k++) { + Vert v = new Vert(); + v.setX(usites[k][0]); + //System.out.println("getting usites: " + usites[k][0] + " " + usites[k][1]); + v.setY(usites[k][1]); + USites[k] = v; + //System.out.println("set v: " + v.X() + " " + v.Y()); + Vert r = new Vert(); + r.setX(usites[k][0]); + r.setY(usites[k][1]); + GLSites[k] = r; + + //System.out.println("setting glsite: " + r.X() + " " + r.Y()); + + //here, GLsites is the same as USites, which is just data read directly from the image + constants.chverts()[k] = new NVert(); + constants.chverts()[k].setNbr1(-1); + constants.chverts()[k].setNbr2(-1); //what is the purpose of this? + constants.chverts()[k].setOnHull(0); + } + + constants.setUSites(USites); + constants.setGLsites(GLSites); + + constants.setNSites(n); + if (constants.nsites() <=2) { + for(k = 0; k < constants.nsites(); k++) { + constants.uchverts()[k].setVPid(k); + constants.uchverts()[k].setNbr1((k-1+constants.nsites()) % constants.nsites()); //what is the purpose of this? + constants.uchverts()[k].setNbr2((k+1+constants.nsites()) % constants.nsites()); + } + return -3; + } + + voronoi.sortGLSites(); //sort by data points and remove coincident sites + + bBoxInit(); //set some bounds + + /* now, if user punted on bbox calculation, OR if user bbox does not truly enclose + user data, we use our bbox (computed in initbbox). otherwise we take the user's. */ + + if (!(compute_bbox == 1 || uxmin > constants.vxmin() || uymin > constants.vymin() || uxmax < constants.vxmax() || uymax < constants.vymax())) { + //if we did not want to compute bbox or what the user gave (?) is larger than what was computed? + pxmin = uxmin; + pymin = uymin; + pxmax = uxmax; + pymax = uymax; + } + + xminymax[0] = pxmin; + xminymin[0] = pxmin; + xminymin[1] = pymin; + xmaxymin[1] = pymin; + + xmaxymax[0] = pxmax; + xmaxymin[0] = pxmax; + xmaxymax[1] = pymax; + xminymax[1] = pymax; + + corner[0] = new VertTheta(xminymin[0], xminymin[1]); + corner[1] = new VertTheta(xmaxymin[0], xmaxymin[1]); + corner[2] = new VertTheta(xmaxymax[0], xmaxymax[1]); + corner[3] = new VertTheta(xminymax[0], xminymax[1]); + + /* now: set the floating point tolerance values P*** to be 1 or 2 significant bits inside the p*** */ + /* be careful to use RELATIVE error; that is, to scale the tolerance to the bbox values themselves */ + /* now, if some user puts points way out in left field, our technique handles the ranges correctly */ + + dx = (pxmax - pxmin) * (1/4096); + dy = (pymax - pymin) * (1/4096); + + //cut a little off the edges? + + Pxmin = pxmin + dx; + Pxmax = pxmax - dx; + Pymin = pymin + dy; + Pymax = pymax - dy; + + /* compute inverse of external->internal sid mapping */ + /* given an internal site number, returns user index */ + + for (sid = 0; sid < constants.nsites(); sid++) { + inverse[sid] = constants.getGLSites()[sid].vpid(); //when did vpid get set and what is it? + } + + + //creating an inverse of some sort...? + /*for (sid = 0; sid < constants.nsites(); sid ++) { + if (constants.sites()[sid].getCoord().X() != constants.USites()[inverse[sid]].X()) + System.out.println("inverse error"); + if (constants.sites()[sid].getCoord().Y() != constants.USites()[inverse[sid]].Y()) + System.out.println("inverse error"); + } + */ + + vdInit(); //initialize counting numbers + + /* run the voronoi code, no triangulate */ + //constants.setTriangulate(0); + //voronoi.voronoi(); + + //bBoxInit(); + //constants.setTriangulate(1); + //System.out.println("triangulate: " + constants.triangulate()); + voronoi.voronoi(); + + for (sid = 0; sid < constants.nsites(); sid++) { + constants.sites()[sid].setSiteNbr(constants.getGLSites()[sid].vpid()); + constants.sites()[sid].getCoord().setX(constants.getGLSites()[sid].X()); + constants.sites()[sid].getCoord().setY(constants.getGLSites()[sid].Y()); + } + + return 0; + + } + + private class vtcomp implements Comparator<VertTheta> { + + @Override + public int compare(VertTheta v1, VertTheta v2) { + if (v1.theta() < v2.theta()) { + return -1; + } + else if (v1.theta() > v2.theta()) { + return 1; + } + else return 0; + } + + } + + /* + find_vregion(sid, plen, pverts) + given a site id 'sid' from 0..nsites-1 inclusive, + returns the voronoi polygon associated with that site + in the array 'pverts', and its length on call stack. + + the vertices are returned in counterclockwise order. + + returns: + -1 if error condition + plen > 2 [i.e., the # of verts in the voronoi polygon] otherwise +*/ + + public int findVRegion (int vsid, float[][] pverts) { + + //given a site id, returns the voronoi polygon associated with that site, with the vertices returned in counterclockwise order + + int sid, b, k, vnum, bnd1, bnd2, bdiff, sleft, lag, lead, p1a, p1b, p2a, p2b; + float x, y, x1, y1, x2, y2, theta1, theta2, lasttheta, dtheta, h; + + //ifdef statement here - but the identifier is never actually defined in the code, so perhaps it is not needed? + + if (vsid < 0 || vsid >= constants.nsites()){ + System.out.println("error site bounds"); + return -1; + } + + for (sid = 0; sid < constants.nsites(); sid++) { + if (constants.getGLSites()[sid].vpid() == vsid) + break; + } + + if (sid == constants.nsites()) { + System.out.println("can't find requested site"); + return -1; + } + + for (k = 0; k < 4; k++) { + corner[k].setTheta((float) Math.atan2((double) (corner[k].Y() - constants.getGLSites()[sid].Y()), (double) (corner[k].X() - constants.getGLSites()[sid].X()))); + } + + vtnum = 0; + for (k = 0; k < numvedges; k++) { + if (constants.vedges()[k].nbr1() == sid) { + slist[vtnum].setE1(k); + slist[vtnum].setE2(k); + slist[vtnum].setTheta((float) Math.atan2((double) (constants.vedges()[k].y1() - constants.getGLSites()[sid].Y()), (double) (constants.vedges()[k].x1() - constants.getGLSites()[sid].X()))); + slist[vtnum].setX(constants.vedges()[k].x1()); + slist[vtnum].setY(constants.vedges()[k].y1()); + + vtnum ++; + + slist[vtnum].setE1(k); + slist[vtnum].setE2(k); + slist[vtnum].setTheta((float) Math.atan2((double) (constants.vedges()[k].y2() - constants.getGLSites()[sid].Y()), (double) (constants.vedges()[k].x2() - constants.getGLSites()[sid].X()))); + slist[vtnum].setX(constants.vedges()[k].x2()); + slist[vtnum].setY(constants.vedges()[k].y2()); + + } + } + + vtcomp comp = new vtcomp(); + + Arrays.sort(slist, comp); + + lag = 0; + lead = 0; + + vtlist[lag] = slist[lead]; + lasttheta = -10; + + while (lead < vtnum) { + if (Math.abs((slist[lead].theta()- lasttheta)) > (10^-4)) { + lasttheta = slist[lead].theta(); + vtlist[lag] = slist[lead]; + lag++; + lead++; + } + else { + vtlist[lag-1].setE2(slist[lead].e1()); + lead++; + } + } + + vtnum = lag; + + vnum = 0; + for(k = 0; k < vtnum; k++) { + if (Math.abs(vtlist[(k + vtnum - 1) % vtnum].theta() - vtlist[k].theta()) < (10^-4)){ + System.out.println("region identical"); + return -1; + } + + x1 = vtlist[(k + vtnum - 1) % vtnum].X(); + y1 = vtlist[(k + vtnum - 1) % vtnum].Y(); + p1a = vtlist[(k + vtnum - 1) % vtnum].e1(); + p1b = vtlist[(k + vtnum - 1) % vtnum].e2(); + x2 = vtlist[k].X(); + y2 = vtlist[k].Y(); + p2a = vtlist[k].e1(); + p2b = vtlist[k].e2(); + + if (((p1a == p2a) || (p1a == p2b) || (p1b == p2b)) && (vtnum > 2)) { + sid = PUTV(vtlist[k], sid, pverts); + } + else { + bnd1 = NBOUND(x1, y1); + bnd2 = NBOUND(x2, y2); + + if (bnd1 >= 0 && bnd2 >=0) + bdiff = ((bnd2 - bnd1) + 4) % 4; + else + bdiff = 0; + + if (bdiff == 0) { + sid = PUTV(vtlist[k], sid, pverts); + } + else { + if (vtnum == 2) { + theta1 = vtlist[0].theta(); + theta2 = vtlist[1].theta(); + dtheta = theta2 - theta1; + + for(b = 0; b < 4; b++){ + if ( /*dtheta >= M_PI*/ (corner[b].theta() > theta1) && (corner[b].theta() < theta2)) { //theta is the angle measure? + vtlist[vtnum++] = corner[b]; + } + else if ( /*dtheta < M_PI*/ ((corner[b].theta() < theta1) || corner[b].theta() > theta2)) { + vtlist[vtnum++] = corner[b]; + } + } + + Arrays.sort(vtlist, comp); + + for(b = 0; b < vtnum; b++) { + sid = PUTV(vtlist[b], sid, pverts); + } + + break; + + } + + for (b = 0; b < bdiff; b++) { + sid = PUTV(corner[(bnd1 + b) % 4], sid, pverts); + } + + sid = PUTV(vtlist[k], sid, pverts); + } + } + } + + return vnum; + + } + + private int NBOUND(float x, float y) { + return (x >= Pxmax ? constants.rbnd() : (x <= Pxmin ? constants.lbnd() : (y >= Pymax ? constants.tbnd() : (y <= Pymin ? constants.bbnd() : -1)))); + } + + private int PUTV(VertTheta v, int vid, float[][] pverts) {////////////////// + pverts[vid][0] = v.X(); + pverts[vid][1] = v.Y(); + return (vid + 1); + } + + public int findDTriangles () {/////////////////// + if (numtris <= 0){ + constants.setdtris(null); + return -1; + } + else { + Tri[] dtris = new Tri[constants.maxTris()]; + int i = 0; + for (Tri t: constants.tris()) { + dtris[i] = t; + i++; + } + constants.setdtris(dtris); + return numtris; + } + } + + private boolean EMATCH(Vert Ap, Vert Aq, Vert Bp, Vert Bq) { + return (Ap == Bp && Aq == Bq); + } + + public int findDTAdjacencies (IntArraySetter dtadjset) { + int nadj = 0, j, k, nematched; + Tri trij, trik; + + if (numtris <= 0) { + dtadjset.set(null); + return -1; + } + else { + for (j = 0; j < numtris; j++) { + trij = constants.tris()[j]; + nematched = 0; + for (k = j + 1; k < numtris; k++) { + trik = constants.tris()[k]; + if (EMATCH(trij.v1(), trij.v2(), trik.v3(), trik.v2()) || EMATCH(trij.v1(), trij.v2(), trik.v2(), trik.v1()) || EMATCH(trij.v1(), trij.v2(), trik.v1(), trik.v3())) { + adjlist[nadj][0] = j; + adjlist[nadj++][1] = k; + nematched++; + } + else if (EMATCH(trij.v2(), trij.v3(), trik.v3(), trik.v2()) || EMATCH(trij.v1(), trij.v3(), trij.v2(), trik.v1()) || EMATCH(trij.v2(), trij.v3(), trik.v1(), trik.v3())) { + adjlist[nadj][0] = j; + adjlist[nadj++][1] = k; //what does the ++ denote? + nematched++; + } + else if (EMATCH(trij.v3(), trij.v1(), trik.v3(), trik.v2()) || EMATCH(trij.v3(), trij.v1(), trik.v2(), trik.v1()) || EMATCH(trij.v3(), trij.v1(), trik.v1(), trik.v3())) { + adjlist[nadj][0] = j; + adjlist[nadj++][1] = k; + nematched++; + } + if (nematched == 3) + break; + } + } + dtadjset.set(adjlist); //this should maybe be the other way around? + return nadj; + } + + } + + public int fident(float a, float b) { + float sum; + + sum = Math.abs(a) + Math.abs(b); + if (sum == 0) + return 1; + else { + sum = (a-b)/sum; + return ((sum > (2*(10^-7)) ? 1 : 0)); + } + + } + + public int xycollinear (float ax, float ay, float bx, float by, float cx, float cy) { + float AX, AY, BX, BY; + + AX = bx - ax; + AY = by - ay; + BX = cx - bx; + BY = cy - by; + + return fident(AX*BY, BX*AY); + + } + + public int findConvexHull(ArraySetter chvertset) { //type of chvertices?? + int k, nchverts, nbr1, nbr2; + NVert v1 = null, v2, T; + int start, lag, lead; + + if (constants.nsites() <= 2) { + chvertset.set(constants.uchverts()); + return constants.nsites(); + } + + for(k = 0; k < constants.nsites(); k++) { + v1 = constants.chverts()[k]; + if (v1.onhull() == 1 && v1.nbr1() != -1 && v1.nbr2() != -1) { + break; + } + } + if (k == constants.nsites()) { + System.out.println("no hull edge found"); + chvertset.set(null); + return -1; + } + + start = v1.vpid(); + lag = v1.vpid(); + lead = v1.nbr2(); + + k = 0; + + while(lag != start) { + if (k>0) + constants.uchverts()[k].setNbr1(constants.uchverts()[k-1].vpid()); + constants.uchverts()[k].setVPid(inverse[lag]); + constants.uchverts()[k++].setNbr2(inverse[lead]); + + if (lag == constants.chverts()[lead].nbr1()) { + lag = lead; + lead = constants.chverts()[lead].nbr2(); + } + else if (lag == constants.chverts()[lead].nbr2()) { + lag = lead; + lead = constants.chverts()[lead].nbr1(); + } + else { + System.out.println("inconsistent convex hull"); + return 0; + } + + } + + constants.uchverts()[0].setNbr1(constants.uchverts()[k-1].vpid()); + nchverts = k; + + lag = 0; + for (k = 0; k < nchverts; k++) { + if ((fident(UX(k), UX((k + 1) % nchverts)) != 1 && fident(UY(k), UY((k + 1) % nchverts)) == 1)) { + constants.uchverts()[lag++] = constants.uchverts()[k]; + } + if (lag != nchverts) { + System.out.println("excised coincident convex hull vertices"); + k = lag; + nchverts = lag; + } + } + + if (nchverts > 2) { + lag = 0; + for (k = 0; k < nchverts; k++) { + if (xycollinear(UX(k), UY(k), UX((k + 1) % nchverts), UY((k + 1) % nchverts), UX((k + 2) % nchverts), UY((k + 2) % nchverts)) == 0) { + constants.uchverts()[lag++] = constants.uchverts()[k]; + } + } + if (lag != nchverts) { + System.out.println ("excised dgenerate convex hull edges"); + k = lag; + nchverts = lag; + } + } + + chvertset.set(constants.uchverts()); + return k; + + } + + public float UX(int k) { + return constants.USites()[constants.uchverts()[k].vpid()].X(); + } + + public float UY(int k) { + return constants.USites()[constants.uchverts()[k].vpid()].Y(); + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/Vert.java b/src/main/java/plugins/ragini/voronoidiagram/Vert.java new file mode 100644 index 0000000..72a1807 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/Vert.java @@ -0,0 +1,19 @@ +package plugins.ragini.voronoidiagram; + +public class Vert extends Point { + + private int vpid; + + public Vert(float _x, float _y) { + x = _x; + y = _y; + } + + public Vert() { + } + + public int vpid() { + return vpid; + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/VertTheta.java b/src/main/java/plugins/ragini/voronoidiagram/VertTheta.java new file mode 100644 index 0000000..199945d --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/VertTheta.java @@ -0,0 +1,53 @@ +package plugins.ragini.voronoidiagram; + +public class VertTheta { + + private float x, y, theta; + private int e1, e2; + + public VertTheta(float _x, float _y) { + x = _x; + y = _y; + } + + public float theta() { + return theta; + } + + public void setTheta(float t) { + theta = t; + } + + public float Y() { + return y; + } + + public float X() { + return x; + } + + public int e1() { + return e1; + } + + public int e2() { + return e2; + } + + public void setE1(int e) { + e1 = e; + } + + public void setE2(int e) { + e2 = e; + } + + public void setX(float _x) { + x = _x; + } + + public void setY(float _y) { + y = _y; + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/Vertex.java b/src/main/java/plugins/ragini/voronoidiagram/Vertex.java new file mode 100644 index 0000000..2e586b2 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/Vertex.java @@ -0,0 +1,218 @@ +package plugins.ragini.voronoidiagram; +//Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. +//Jad home page: http://www.kpdus.com/jad.html +//Decompiler options: packimports(3) +//Source File Name: Vertex.java + + +import java.io.Serializable; + +//Referenced classes of package delaunay: +// DT + +public class Vertex + implements Serializable +{ + + public Vertex(double x, double y) + { + visit = false; + this.x = x; + this.y = y; + } + + public Vertex(double x, double y, int indice) + { + this(x, y); + setIndice(indice); + } + + public void setIndice(int indice) + { + this.indice = indice; + } + + public static double distance(Vertex a, Vertex b) + { + if(a == DT.vertex_infty || b == DT.vertex_infty) + return DT.MAX_VALUE; + else + return Math.sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); + } + + public static double sqrDistance(Vertex a, Vertex b) + { + if(a == DT.vertex_infty || b == DT.vertex_infty) + return DT.MAX_VALUE; + else + return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y); + } + + public static boolean colinear(Vertex a, Vertex b, Vertex c) + { + return (a.x * (b.y - c.y) - a.y * (b.x - c.x)) + (b.x * c.y - b.y * c.x) == 0.0D; + } + + public boolean test(double med, int coord) + { + if(coord == 0) + return x >= med; + return y >= med; + } + + public static boolean ccw(Vertex a, Vertex b, Vertex c) + { + return (a.x * (b.y - c.y) - a.y * (b.x - c.x)) + (b.x * c.y - b.y * c.x) > 0.0D; + } + + public boolean ccw(Vertex b, Vertex c) + { + return (x * (b.y - c.y) - y * (b.x - c.x)) + (b.x * c.y - b.y * c.x) > 0.0D; + } + + public static Vertex findCenter(Vertex A, Vertex B, Vertex C) + { + DT.counter2++; + double aux = (((-B.x * C.y + B.x * A.y + A.x * C.y) - A.x * B.y) + B.y * C.x) - A.y * C.x; + if(aux == 0.0D) + { + return DT.vertex_infty; + } else + { + double ss = ((((-B.x * A.x - B.x * C.x) + A.x * C.x) - B.y * A.y - B.y * C.y) + A.y * C.y + B.x * B.x + B.y * B.y) / aux; + return new Vertex(((A.x + C.x) - ss * (C.y - A.y)) / 2D, ((A.y + C.y) - ss * (A.x - C.x)) / 2D); + } + } + + public static Vertex findBary(Vertex A, Vertex B, Vertex C) + { + return new Vertex((A.x + C.x + B.x) / 3D, (A.y + C.y + B.y) / 3D); + } + + public static double delaunayDistance(Vertex A, Vertex B, Vertex C) + { + Vertex S = findCenter(A, B, C); + double ss = sqrDistance(S, A); + if(ccw(A, B, C)) + { + if(!ccw(A, B, S)) + ss = -ss; + } else + if(ccw(A, B, S)) + ss = -ss; + return ss; + } + + public boolean inCircle(Vertex a, Vertex b, Vertex c, Vertex d) + { + if(a == d || b == d || c == d) + return false; + DT.counter2++; + double d02 = a.x * a.x + a.y * a.y; + double d12 = b.x * b.x + b.y * b.y; + double d22 = c.x * c.x + c.y * c.y; + double d32 = d.x * d.x + d.y * d.y; + double det = a.x * det3x3(b.y, d12, 1.0D, c.y, d22, 1.0D, d.y, d32, 1.0D); + det -= a.y * det3x3(b.x, d12, 1.0D, c.x, d22, 1.0D, d.x, d32, 1.0D); + det += d02 * det3x3(b.x, b.y, 1.0D, c.x, c.y, 1.0D, d.x, d.y, 1.0D); + det -= det3x3(b.x, b.y, d12, c.x, c.y, d22, d.x, d.y, d32); + return det > 0.0D; + } + + public boolean inCircle(Vertex b, Vertex c, Vertex d) + { + if(this == d || b == d || c == d) + return false; + DT.counter2++; + double d02 = x * x + y * y; + double d12 = b.x * b.x + b.y * b.y; + double d22 = c.x * c.x + c.y * c.y; + double d32 = d.x * d.x + d.y * d.y; + double det = x * det3x3(b.y, d12, 1.0D, c.y, d22, 1.0D, d.y, d32, 1.0D); + det -= y * det3x3(b.x, d12, 1.0D, c.x, d22, 1.0D, d.x, d32, 1.0D); + det += d02 * det3x3(b.x, b.y, 1.0D, c.x, c.y, 1.0D, d.x, d.y, 1.0D); + det -= det3x3(b.x, b.y, d12, c.x, c.y, d22, d.x, d.y, d32); + return det > 0.0D; + } + + public static double det3x3(double d00, double d01, double d02, double d10, + double d11, double d12, double d20, double d21, double d22) + { + return (d00 * (d11 * d22 - d12 * d21) - d01 * (d10 * d22 - d12 * d20)) + d02 * (d10 * d21 - d11 * d20); + } + + public static void mergeSort(Vertex s[]) + { + mergeSort(s, 0, s.length); + } + + public static void mergeSort(Vertex s[], int a, int b) + { + int size = b - a; + if(size > 1) + if(size == 2) + { + if(compare(s[a], s[a + 1])) + { + Vertex tmp = s[a]; + s[a] = s[a + 1]; + s[a + 1] = tmp; + } + } else + { + int mid = size / 2; + mergeSort(s, a, a + mid); + mergeSort(s, a + mid, b); + Vertex ascend[] = new Vertex[size]; + int i = a; + int j = a + mid; + for(int k = 0; k < size; k++) + if(i >= a + mid) + ascend[k] = s[j++]; + else + if(j >= b) + ascend[k] = s[i++]; + else + if(compare(s[i], s[j])) + ascend[k] = s[j++]; + else + ascend[k] = s[i++]; + + for(int k = 0; k < size; k++) + s[a + k] = ascend[k]; + + } + } + + public void setVisit() + { + visit = true; + } + + public void setVisit(boolean visit) + { + this.visit = visit; + } + + public boolean getVisit() + { + return visit; + } + + public static boolean compare(Vertex s1, Vertex s2) + { + if(s1.x != s2.x) + return s1.x > s2.x; + return s1.y > s2.y; + } + + public String toString() + { + return (new StringBuilder(" ")).append(indice).append(" ").toString(); + } + + double x; + double y; + int indice; + boolean visit; +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/Vonoroi.java b/src/main/java/plugins/ragini/voronoidiagram/Vonoroi.java new file mode 100644 index 0000000..a825c69 --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/Vonoroi.java @@ -0,0 +1,295 @@ +package plugins.ragini.voronoidiagram; + +import java.util.Arrays; +import java.util.Comparator; + +public class Vonoroi +{ + + private int siteidx, nvertices; + + HalfEdge PQHash; + + private Constants constants; + + private EdgeList edgelist; + private VRegion vregion; + private Geometry events; + + public Vonoroi(EdgeList _edgelist, Constants _constants, VRegion _vregion, Geometry geometry) + { + siteidx = 0; + constants = _constants; + edgelist = _edgelist; + vregion = _vregion; + events = geometry; + } + + private class GLscomp implements Comparator<Vert> + { + + @Override + public int compare(Vert s1, Vert s2) + { + if (s1.Y() < s2.Y()) + return -1; + else if (s1.Y() > s2.Y()) + return 1; + else if (s1.X() < s2.X()) + return -1; + else if (s1.X() > s2.X()) + return 1; + else + return 0; + } + + } + + public void sortGLSites() + { + + float vx, vy; + int k, sid; + char a; + float dx, dy; + + GLscomp comp = new GLscomp(); + + Arrays.sort(constants.getGLSites(), comp); + + // excise(); + + } + + // private void excise() { + // + // int sid = 0; + // Vert[] GLSites = constants.getGLSites(); + // + // for(int k = 0; k < constants.nsites(); k++) { + // if (k ==0 || (GLSites[k-1].Y() != GLSites[k].Y()) || (GLSites[k-1].X() != GLSites[k].X())) { + // + // dx = GLSites[k].x * (1.0 / 4096.0); + // dy = GLSites[k].y * (1.0 / 4096.0); + // + // /* GLSites[sid].setX(GLSites[k].X()); + // GLSites[sid].setY(GLSites[k].Y()); */ + // } + // } + // + // if (sid != constants.nsites()) { + // System.out.printf("voronoi: excised %d coincident sites\n", constants.nsites()-sid); + // } + // + // } + + public void voronoi() + { + SiteProvider sp = new SiteProvider(constants); + + Neighbor newsite, temp, p, v; + Neighbor bot, top; + Point newintstar = new Point(); + int pm; + HalfEdge lbnd, rbnd, llbnd, rrbnd, bisector; + Edge e; + + if (constants.nsites() <= 1) + return; + geominit(); + events.PQinitialize(); + + constants.setBottomSite(sp.next()); + vregion.outSite(constants.bottomsite()); // print some stuff and draw a circle + // circle(...s) + edgelist.ELinitialize(); + + newsite = sp.next(); + + // System.out.println("initialized"); + + // when do values get added to the hash table? + while (true) + { + if (!events.PQempty()) + newintstar = events.PQmin(); + + // newsite is above (greater priority) than the minimum event in the queue + if (newsite != null + && (events.PQempty() || (newsite.getCoord().Y() < newintstar.Y()) || (newsite.getCoord().Y() == newintstar + .Y() && newsite.getCoord().X() < newintstar.X()))) + { + // System.out.println("newsite is smallest"); + vregion.outSite(newsite); // print some stuff and draw a circle with pre-defined + // radius + lbnd = edgelist.ELleftbnd(newsite.getCoord()); // retrieve the halfedge from the + // hash table + rbnd = edgelist.ELright(lbnd); + bot = edgelist.rightReg(lbnd); // ? + e = edgelist.bisect(bot, newsite); + + bisector = edgelist.HEcreate(e, constants.le(), 0); // create a new half edge from + // the bisector? + edgelist.ELinsert(lbnd, bisector); // insert it into the hash table? or the linear + // list? + if ((p = (Neighbor) edgelist.sintersect(lbnd, bisector)) != null) + { + events.PQdelete(lbnd); + events.PQinsert(lbnd, p, dist(p, newsite)); + } + lbnd = bisector; + bisector = edgelist.HEcreate(e, constants.re(), 0); + edgelist.ELinsert(lbnd, bisector); + if ((p = (Neighbor) edgelist.sintersect(bisector, rbnd)) != null) + { + events.PQinsert(bisector, p, dist(p, newsite)); + } + newsite = sp.next(); + } + else if (!events.PQempty()) + { + // System.out.println("newintstar is smallest"); + lbnd = events.PQextractmin(); + /* + * if (lbnd.eledge() == null) System.out.println("lbnd: null edge"); + * else System.out.println("lbnd: " + lbnd.eledge().a() + ", " + lbnd.eledge().b() + + * ", " + lbnd.eledge().c()); + */ + llbnd = edgelist.ELleft(lbnd); + // if (llbnd.eledge() == null) System.out.println("llbnd: null edge"); + // else System.out.println("llbnd: " + llbnd.eledge().a() + ", " + + // llbnd.eledge().b() + ", " + llbnd.eledge().c()); + rbnd = edgelist.ELright(lbnd); + // if (rbnd.eledge() == null) System.out.println("rbnd: null edge"); + // else System.out.println("rbnd: " + rbnd.eledge().a() + ", " + rbnd.eledge().b() + + // ", " + rbnd.eledge().c()); + rrbnd = edgelist.ELright(rbnd); + // if (rrbnd.eledge() == null) System.out.println("rrbnd: null edge"); + // else System.out.println("rrbnd: " + rrbnd.eledge().a() + ", " + + // rrbnd.eledge().b() + ", " + rrbnd.eledge().c()); + bot = edgelist.leftReg(lbnd); + top = edgelist.rightReg(rbnd); + // System.out.println("bot: " + bot.getCoord().X() + " " + bot.getCoord().Y()); + // System.out.println("top: " + top.getCoord().X() + " " + top.getCoord().Y()); + vregion.outTriple(bot, top, edgelist.rightReg(lbnd)); // this is where the + // triangulate variable is + // used, just printing some + // stuff + v = (Neighbor) lbnd.vertex(); + // if (v == null) + // System.out.println("vertex null"); + // else System.out.println("vertex: " + v.getCoord().X() + " " + v.getCoord().Y()); + makevertex(v); + // System.out.println("made vertex"); + edgelist.v_endpoint(lbnd.eledge(), 1, lbnd.elpm(), v); + edgelist.v_endpoint(rbnd.eledge(), 1, rbnd.elpm(), v); + // System.out.println("called vendpoint"); + edgelist.ELdelete(lbnd); + // + events.PQdelete(rbnd); + edgelist.ELdelete(rbnd); + /* + * System.out.println("printing list"); + * for(HalfEdge cur = edgelist.leftend(); cur != edgelist.rightend(); cur = + * edgelist.ELright(cur)) { + * e = cur.eledge(); + * if (e == null) System.out.println("null edge"); + * else System.out.println("edge: " + e.a() + " " + e.b() + " " + e.c()); + * if (cur.right() == edgelist.rightend()) { + * System.out.println("reached right end"); e = cur.right().eledge(); if (e != null) + * System.out.println("right end: " + e.a() + " " + e.b() + " " + e.c());} + * } + * System.out.println("done printing list"); + * if (rbnd.eledge() == null) System.out.println("deleted null edge"); + * else System.out.println("deleted: " + rbnd.eledge().a() + ", " + + * rbnd.eledge().b() + ", " + rbnd.eledge().c()); + */ + pm = constants.le(); + + if ((bot.getCoord().Y() > top.getCoord().Y()) + || ((bot.getCoord().Y() == top.getCoord().Y()) && (bot.getCoord().X() > top.getCoord().X()))) + { + temp = bot; + bot = top; + top = temp; + pm = constants.re(); + } + + // + + e = edgelist.bisect(bot, top); + + bisector = edgelist.HEcreate(e, pm, 1); + edgelist.ELinsert(llbnd, bisector); + /* + * System.out.println("right : " + bisector.right().eledge().a() + ", " + + * bisector.right().eledge().b() + ", " + bisector.right().eledge().c()); + * if (bisector.right().right().eledge() == null) System.out.println("rright null"); + * else System.out.println("rright: " + bisector.right().right().eledge().a() + ", " + * + bisector.right().right().eledge().b() + ", " + + * bisector.right().right().eledge().c()); + */ + edgelist.v_endpoint(e, 1, constants.re() - pm, v); + if ((p = (Neighbor) edgelist.sintersect(llbnd, bisector)) != null) + { + events.PQdelete(llbnd); + // if (lbnd.eledge() == null) System.out.println("deleted null edge"); + // else System.out.println("deleted: " + lbnd.eledge().a() + ", " + + // lbnd.eledge().b() + ", " + lbnd.eledge().c()); + events.PQinsert(llbnd, p, dist(p, bot)); + } + + if ((p = (Neighbor) edgelist.sintersect(bisector, rrbnd)) != null) + { + events.PQinsert(bisector, p, dist(p, bot)); + } + } + else + { // System.out.println("break voronoi"); + break; + } + } + + for (lbnd = edgelist.ELright(edgelist.leftend()); lbnd != edgelist.rightend(); lbnd = edgelist.ELright(lbnd)) + { + e = lbnd.eledge(); + // System.out.println("printing edge: " + e.a() + " " + e.b() + " " + e.c()); + vregion.outEP(e, lbnd.origin());// calls clipline, which draws the appropriate line + // if (lbnd.right() == edgelist.rightend()) System.out.println("reached right end"); + } + + } + + public void makevertex(Site v) + { + v.setSiteNbr(nvertices); + nvertices += 1; + vregion.outVertex(v); // /print some stuff + } + + private void geominit() + { + nvertices = 0; + constants.setnedges(0); + float sn = constants.nsites() + 4; + constants.setsqrtnsites(Math.sqrt(sn)); + // System.out.println("setting sqrt" + constants.sqrtnsites()); + constants.setvdeltay(constants.vymax() - constants.vymin()); + constants.setvdeltax(constants.vxmax() - constants.vxmin()); + } + + public float dist(Site a, Site b) + { + float ax, bx, ay, by; + + ax = a.getCoord().X(); + ay = a.getCoord().Y(); + + bx = b.getCoord().X(); + by = b.getCoord().Y(); + + return (float) Math.sqrt((bx - ax) * (bx - ax) + (by - ay) * (by - ay)); + + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/VoronoiDiagram.java b/src/main/java/plugins/ragini/voronoidiagram/VoronoiDiagram.java new file mode 100644 index 0000000..51fffad --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/VoronoiDiagram.java @@ -0,0 +1,561 @@ +package plugins.ragini.voronoidiagram; + +import icy.canvas.IcyCanvas; +import icy.image.IcyBufferedImage; +import icy.painter.AbstractPainter; +import icy.painter.Painter; +import icy.painter.PainterListener; +import icy.roi.BooleanMask2D; +import icy.roi.ROI2DEllipse; +import icy.roi.ROI2DLine; +import icy.roi.ROI2DPoint; +import icy.roi.ROI2DPolygon; +import icy.sequence.Sequence; +import icy.type.DataType; +import icy.type.collection.array.Array1DUtil; + +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.Polygon; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Point2D; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; + +import jxl.NumberCell; +import jxl.Sheet; +import jxl.Workbook; +import jxl.read.biff.BiffException; + +import plugins.adufour.blocks.lang.Block; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.ezplug.EzButton; +import plugins.adufour.ezplug.EzPlug; +import plugins.adufour.ezplug.EzVar; +import plugins.adufour.ezplug.EzVarEnum; +import plugins.adufour.ezplug.EzVarFile; +import plugins.adufour.ezplug.EzVarInteger; +import plugins.adufour.ezplug.EzVarListener; +import plugins.adufour.ezplug.EzVarSequence; +import plugins.adufour.vars.lang.VarSequence; + +public class VoronoiDiagram extends EzPlug implements Block { + + private enum MethodType + { + DELAUNAY("Calculate Delaunay Triangulation"), VORONOI("Calculate Voronoi Diagram"), RNG("Calculate Relative Neighborhood Graph"); + + private final String name; + + private MethodType(String string) + { + this.name = string; + } + + public String toString() + { + return this.name; + } + } + + private Constants constants; + private EzVarFile input = new EzVarFile("Input", "/Users"); + private EzVarSequence img = new EzVarSequence("Image"); + private EzVarInteger numPoints = new EzVarInteger("Display Closest Points", 2, 1, 7, 1); + private EzButton morphbutton = new EzButton("Calculate Morphological Operators", new buttonlist()); + + private class buttonlist implements ActionListener { + + @Override + public void actionPerformed(ActionEvent arg0) { + + a = new Alpha_Morph(constants.sites(), constants.vxmin(), constants.vymin(), constants.vxmax(), constants.vymax()); + } + + } + + float[][] points; + VarSequence out = new VarSequence("Out", null); + Point2D[] dpoints; + private EzVarEnum<MethodType> method = new EzVarEnum<MethodType>("Method:", MethodType.values()); ; + + private ArrayList<ROI2DSite> imgpoints = new ArrayList<ROI2DSite>(); + private ArrayList<ROI2DSite> allpoints = new ArrayList<ROI2DSite>(); + private ArrayList<ROI2DLine> alltris = new ArrayList<ROI2DLine>(); + private ArrayList<ROI2DLine> imgedges = new ArrayList<ROI2DLine>(); + private Sequence seqOut; + private Alpha_Morph a; + + @Override + public void clean() { + // TODO Auto-generated method stub + + } + + @Override + protected void execute() { + String data = input.getValue().getPath(); + MethodType _method = method.getValue(); + Sequence seqIn = img.getValue(); + final int numpoints = numPoints.getValue(); + IcyBufferedImage imgIn = null; + if (seqIn != null) { + imgIn = seqIn.getImage(0, 0, 0); } + System.out.println(_method.toString()); + points = new float[5000][2]; + dpoints = new Point2D[5000]; + double xmin = 0; + double xmax = 0; + double ymin = 0; + double ymax = 0; + int x = 0; + try { + Workbook wb = Workbook.getWorkbook(new File(data)); + Sheet s = wb.getSheet(0); + NumberCell c = (NumberCell) s.getCell(0,0); + while (x < s.getRows()) { + c = (NumberCell) s.getCell(0,x); + points[x][0] = (float) c.getValue(); + c = (NumberCell) s.getCell(1,x); + points[x][1] = (float) c.getValue(); + dpoints[x] = new Point2D.Double(points[x][0], points[x][1]); + //System.out.println("x: " + points[x][0] + "y: " + points[x][1]); + if (x == 0 ){ + xmin = points[x][0]; + xmax = points[x][0]; + ymin = points[x][1]; + ymax = points[x][1]; + } + else { + if (points[x][0] > xmax) + xmax = points[x][0]; + if (points[x][0] < xmin) + xmin = points[x][0]; + if (points[x][1] > ymax) + ymax = points[x][1]; + if (points[x][1] < ymin) + ymin = points[x][1]; + } + x++; + } + //System.out.println("done reading data points"); + } catch (BiffException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + constants= new Constants(); + if(_method.toString() == "Calculate Delaunay Triangulation") { + constants.setTriangulate(1); + } + else if(_method.toString() == "Calculate Relative Neighborhood Graph") { + constants.setTriangulate(1); + constants.setrng(1); + } + VRegion vregion = new VRegion(constants, this); + EdgeList EL = new EdgeList(constants, vregion); + Geometry events = new Geometry(constants); + Vonoroi voronoi = new Vonoroi(EL, constants, vregion, events); + vregion.setVoronoi(voronoi); + seqOut = new Sequence(); + if (seqIn == null) { + int width = (int) Math.ceil(xmax - xmin + 1); + int height = (int) Math.ceil(ymax - ymin + 1); + IcyBufferedImage imgOut = new IcyBufferedImage(width,height, 1, DataType.UBYTE ); + seqOut.addImage(imgOut); + double[] _out = Array1DUtil.arrayToDoubleArray(imgOut.getDataXY(0), imgOut.isSignedDataType()); + for (int p = 0; p < width; p++) { + for (int q = 0; q < height; q++) { + _out[p + q*width] = 255; + } + } + imgOut.setDataXY(0,Array1DUtil.doubleArrayToArray(_out, imgOut.getDataXY(0))); + seqOut.setImage(0, 0, imgOut);} + else {seqOut.setImage(0, 0, imgIn);seqOut.dataChanged(); } +for(int k= 0; k < x; k++) { + + Point2D dp = new Point2D.Double(points[k][0], points[k][1]); + ROI2DSite point = new ROI2DSite(dp); + allpoints.add(point); + point.setEditable(false); + point.setColor(Color.ORANGE); + point.attachTo(seqOut); + + } + vregion.loadVSites(x, points, 0, 0, 0, 0); + + + //System.out.println("done running"); + + + + int i = 0; + Point2D p1; + while((p1 = constants.lines()[i][0]) != null) { + Point2D p2 = constants.lines()[i][1]; + ROI2DLine line = new ROI2DLine(p1, p2); + line.setEditable(false); + line.setColor(Color.CYAN); + line.attachTo(seqIn); + i++; + } + + i= 0; + Vert v; + while ((v = constants.verts()[i]) != null) { + Point2D p = new Point2D.Double(v.X(), v.Y()); + ROI2DPoint point = new ROI2DPoint(p); + point.setEditable(false); + point.setColor(Color.RED); + point.attachTo(seqOut); + i++; + } + + long dist[]=new long[1000]; //VMY + + if (constants.triangulate() == 1 && constants.rng() != 1) { + alltris.clear(); + i = 0; + Tri t; + while ((t = constants.tris()[i]) != null) { + Point2D t1 = new Point2D.Double(t.v1().X(), t.v1().Y()); + Point2D t2 = new Point2D.Double(t.v2().X(), t.v2().Y()); + Point2D t3 = new Point2D.Double(t.v3().X(), t.v3().Y()); + + ROI2DLine l1 = new ROI2DLine(t1, t2); + ROI2DLine l2 = new ROI2DLine(t2, t3); + ROI2DLine l3 = new ROI2DLine(t1, t3); + + l1.setEditable(false); + l1.setColor(Color.GREEN); + l1.attachTo(seqIn); + l2.setEditable(false); + l2.setColor(Color.GREEN); + l2.attachTo(seqIn); + l3.setEditable(false); + l3.setColor(Color.GREEN); + l3.attachTo(seqIn); + + double d1 = t1.distance(t2); + int d = (int) (Math.round(Math.floor(d1))); + // System.out.println(" "+d1+" d:"+d+" t1x:"+t1.getX()+" t1y:"+t1.getY()); + // dist[d]++; + double d2 = t1.distance(t3); + d = (int) (Math.round(Math.floor(d2))); // d1 ?? + // System.out.println(" "+d2+" d:"+d +" t2x:"+t2.getX()+" t2y:"+t2.getY()); + // dist[d]++; + double d3 = t2.distance(t3); + d = (int) (Math.round(Math.floor(d3))); // d3? + // System.out.println(" "+d3+" d:"+d+" t3x:"+t3.getX()+" t3y:"+t3.getY()); + // dist[d]++; + + //MYV + Polygon polygon = new Polygon(); + polygon.addPoint( + (int) t1.getX(), + (int) t1.getY() + ); + polygon.addPoint( + (int) t2.getX(), + (int) t2.getY() + ); + polygon.addPoint( + (int) t3.getX(), + (int) t3.getY() + ); + + + ROI2DPolygon poly = new ROI2DPolygon(); + poly.setPolygon(polygon); + + BooleanMask2D roiMask = poly.getAsBooleanMask(); + + int minx = Math.max(0, roiMask.bounds.x); + int maxx = Math.min(4000, roiMask.bounds.x+roiMask.bounds.width); + int miny = Math.max(0, roiMask.bounds.y); + int maxy = Math.min(4000, roiMask.bounds.y+roiMask.bounds.height); + double intensitySpot=0.; + int areaC=0;//size Cell + for (int ix = minx; ix < maxx;ix++) + for (int y = miny; y < maxy;y++){ + if(roiMask.contains(ix, y)) { + areaC++; + } + + } + System.out.println(" "+areaC); // triangle Size + + + + + alltris.add(l1); + alltris.add(l2); + alltris.add(l3); + + /*Circ c = makeCirc(t1, t2, t3); + ROI2DEllipse circ = new ROI2DEllipse(c.rectangle()); + circ.setEditable(false); + circ.setColor(Color.ORANGE); + circ.attachTo(seqOut);*/ + + //System.out.println("tri: " + "(" + t1.getX() + "," + t1.getY() + ") (" + t2.getX() + "," + t2.getY() + ") (" + t3.getX() + "," + t3.getY() + ")"); + /*ArrayList<Point2D> plist = new ArrayList<Point2D>(); + plist.add(t1); + plist.add(t2); + plist.add(t3); + ROI2DPolygon tri = new ROI2DPolygon(); + alltris.add(tri); + tri.setPoints(plist); + tri.setColor(Color.GREEN); + tri.setEditable(false); + tri.attachTo(seqOut); */ + /*Circ c = makeCirc(t1, t2, t3); + Point2D ref; + if (t1.getX() > t2.getX()) { + ref = t1; + } + else ref = t2; + if (t3.getX() > ref.getX()) ref = t3; + Ellipse2D e = new Ellipse2D.Double(ref.getX(), ref.getY(), c.r()*2, c.r()*2); + ROI2DEllipse re = new ROI2DEllipse(e.getFrame()); + re.setColor(Color.BLUE); + re.setEditable(false); + re.attachTo(seqOut); */ + i++; + } + } + + else if (constants.rng() == 1) { + i = 0; + for (EdgeRNG e: constants.relativeneighbors()) { + ROI2DEdge edge = new ROI2DEdge(e); + edge.setEditable(false); + edge.setColor(Color.YELLOW); + edge.attachTo(seqOut); + } + + } + allpoints.clear(); + for(Neighbor site : constants.sites()) { + + Point2D dp = new Point2D.Double(site.getCoord().X(), site.getCoord().Y()); + ROI2DSite point = new ROI2DSite(dp); + point.setSite(site); + site.setPoint(point); + allpoints.add(point); + point.setEditable(false); + point.setColor(Color.ORANGE); + point.attachTo(seqOut); + } + + + + if (_method.toString() == "Calculate Delaunay Triangulation") { + Painter painter = new AbstractPainter() { + @Override + public void mousePressed(MouseEvent e, Point2D imagePoint, + IcyCanvas canvas) { + //super.mouseClick(e, imagePoint, canvas); + //System.out.println("mouse pressed"); + for(ROI2DSite p : allpoints) { + if ((p.getPoint().getX() <= imagePoint.getX() + 3 && p.getPoint().getX() >= imagePoint.getX() -3) && ((p.getPoint().getY() <= imagePoint.getY() + 3) && p.getPoint().getY() >= imagePoint.getY() -3)) { + //System.out.println("on site"); + p.setColor(Color.RED); + Neighbor sp = (Neighbor) p.getSite(); + int size = sp.neighbors().size(); + //System.out.println(size); + int count = 0; + Neighbor cur = null; + ArrayList<Neighbor> temp = new ArrayList<Neighbor>(); + //System.out.println("size: " + size); + //System.out.println("numpoints: " + numpoints); + while (count < numpoints && count < size) { + cur = sp.neighbors().remove(); + temp.add(cur); + ROI2DSite curpoint = cur.getPoint(); + curpoint.setColor(Color.YELLOW); + imgpoints.add(curpoint); + count++; + if (count == 1) { + for (Neighbor s : cur.samedistpoints()) { + if (sp.neighbors().remove(s)) { + s.getPoint().setColor(Color.YELLOW); + imgpoints.add(s.getPoint()); + temp.add(s); + count++; + } + } + } + } + for (Neighbor t : temp) { + sp.addNeighbor(t); + } + temp.clear(); + boolean incident = false; + boolean keep = false; + for(ROI2DLine edge: alltris) { + Point2D tp = edge.getLine().getP1(); + if (tp.getX() == p.getPoint().getX() && tp.getY() == p.getPoint().getY()){ + incident = true; //System.out.println("incident"); + } + + tp = edge.getLine().getP2(); + if (tp.getX() == p.getPoint().getX() && tp.getY() == p.getPoint().getY()){ + incident = true; //System.out.println("incident"); + } + + for (ROI2DSite n: imgpoints) { + tp = edge.getLine().getP1(); + + if (tp.getX() == n.getPoint().getX() && tp.getY() == n.getPoint().getY()) { + if (incident == true) {keep = true; } + } + + + tp = edge.getLine().getP2(); + + if (tp.getX() == n.getPoint().getX() && tp.getY() == n.getPoint().getY()) { + if (incident == true) {keep = true;} + } + + + + } + for (Neighbor t : temp) { + sp.addNeighbor(t); + } + temp.clear(); + //System.out.println("keep: " + keep); + if (keep == false) { + edge.detachFrom(seqOut); + imgedges.add(edge); + } + keep = false; + incident = false; + } + + imgpoints.add(p); + } + } + + + } + + @Override + public void mouseReleased(MouseEvent e, Point2D imagePoint, + IcyCanvas canvas) { + for(ROI2DSite rp : imgpoints) { + rp.setColor(Color.BLACK); + } + imgpoints.clear(); + for(ROI2DLine edge: imgedges) { + edge.attachTo(seqOut); + } + imgedges.clear(); + + + } + + }; + + + seqOut.addPainter(painter); + seqOut.painterChanged(painter); + } + + if (isHeadLess()) { + out.setValue(seqOut); + } + + else {addSequence(seqOut);} + + } + + private Circ makeCirc(Point2D p1, Point2D p2, Point2D p3) { + double x = (p3.getX()*p3.getX() * (p1.getY() - p2.getY()) + + (p1.getX()*p1.getX() + (p1.getY() - p2.getY())*(p1.getY() - p3.getY())) + * (p2.getY() - p3.getY()) + p2.getX()*p2.getX() * (-p1.getY() + p3.getY())) + / (2 * (p3.getX() * (p1.getY() - p2.getY()) + p1.getX() * (p2.getY() - p3.getY()) + p2.getX() + * (-p1.getY() + p3.getY()))); + + double y = (p2.getY() + p3.getY())/2 - (p3.getX() - p2.getX())/(p3.getY() - p2.getY()) + * (x - (p2.getX() + p3.getX())/2); + + Point2D c = new Point2D.Double(x,y); + double r = distance(c.getX(), c.getY(), p1.getX(), p1.getY()); + + return (new Circ(c, r)); + + } + + private double distance(double ax, double ay, double bx, double by) { + return (Math.sqrt((bx - ax)*(bx - ax) + (by - ay)*(by - ay))); + } + + @Override + protected void initialize() { + + super.addEzComponent(input); + super.addEzComponent(img); + super.addEzComponent(method); + super.addEzComponent(numPoints); + super.addEzComponent(morphbutton); + method.addVarChangeListener(new EzVarListener<MethodType>() + { + @Override + public void variableChanged(EzVar<MethodType> source, MethodType newValue) + { + updateDefaultParams(); + } + + }); + + + } + + @Override + public void declareInput(VarList inputMap) { + inputMap.add(input.getVariable()); + inputMap.add(method.getVariable()); + inputMap.add(img.getVariable()); + inputMap.add(numPoints.getVariable()); + } + + @Override + public void declareOutput(VarList outputMap) { + outputMap.add(out); + } + + private void updateDefaultParams() + { + if (true) + { + /*if (input.getValue(false) != null) + {*/ + MethodType _method = method.getValue(); + switch(_method) + { + case DELAUNAY: + + break; + case VORONOI: + + break; + default: + break; + } + + //} + } + } + +} diff --git a/src/main/java/plugins/ragini/voronoidiagram/dkmax.java b/src/main/java/plugins/ragini/voronoidiagram/dkmax.java new file mode 100644 index 0000000..300b59d --- /dev/null +++ b/src/main/java/plugins/ragini/voronoidiagram/dkmax.java @@ -0,0 +1,8 @@ +package plugins.ragini.voronoidiagram; + +public class dkmax { + + private int id; + private int max; + +} -- GitLab