diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..3d47f986c41db29ec6dc0d5036bf760b3a1cf366
--- /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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/AFL.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$10.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$11.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$12.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$13.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$14.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$15.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$16.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$17.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$18.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$19.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener1.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener2.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener3.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListenerBin.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListenerTb.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$2.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$20.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$21.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$22.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$23.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$3.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$4.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$5.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$6.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$7.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$8.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$9.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Alpha_Morph.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/Arcs.class b/bin/plugins/ragini/voronoidiagram/Arcs.class
new file mode 100644
index 0000000000000000000000000000000000000000..307641af20c256758b072c14c519e1d60080f8ad
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Arcs.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/ArraySetter.class b/bin/plugins/ragini/voronoidiagram/ArraySetter.class
new file mode 100644
index 0000000000000000000000000000000000000000..6b677eba32f1f4193cb353bc73564d3f7360f9de
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/ArraySetter.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/Circ.class b/bin/plugins/ragini/voronoidiagram/Circ.class
new file mode 100644
index 0000000000000000000000000000000000000000..c2312a1e68a0c6354b93e0fb61c80cacc54d925e
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Circ.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/Constants.class b/bin/plugins/ragini/voronoidiagram/Constants.class
new file mode 100644
index 0000000000000000000000000000000000000000..1279d5f25e0fd2766cfd48ed7b195f3bbb58a327
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Constants.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/DT.class b/bin/plugins/ragini/voronoidiagram/DT.class
new file mode 100644
index 0000000000000000000000000000000000000000..277611b217a50d0d03f09547511c7ad1040d8b6e
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/DT.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/Delaunay.class b/bin/plugins/ragini/voronoidiagram/Delaunay.class
new file mode 100644
index 0000000000000000000000000000000000000000..d9af3f1ec9d354cd6c824b7c6b49c94568ec7022
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Delaunay.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/DelaunayTriangulator.class b/bin/plugins/ragini/voronoidiagram/DelaunayTriangulator.class
new file mode 100644
index 0000000000000000000000000000000000000000..4163004f3d2b97e4d7bc5b8790a19e87f83335ed
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/DelaunayTriangulator.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/Display.class b/bin/plugins/ragini/voronoidiagram/Display.class
new file mode 100644
index 0000000000000000000000000000000000000000..9ebec8d416b5ae82e22b387d1cb36ffd8b5d33f5
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Display.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/Edge.class b/bin/plugins/ragini/voronoidiagram/Edge.class
new file mode 100644
index 0000000000000000000000000000000000000000..4a59f403158bc8f8e2f2da5783f27e6a0409d6bd
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Edge.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/EdgeL.class b/bin/plugins/ragini/voronoidiagram/EdgeL.class
new file mode 100644
index 0000000000000000000000000000000000000000..a73b08741d43a8f827f3740ec528b640a9986879
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/EdgeL.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/EdgeList.class b/bin/plugins/ragini/voronoidiagram/EdgeList.class
new file mode 100644
index 0000000000000000000000000000000000000000..5cef6dd365bca202f99739808b30de9968ca7e78
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/EdgeList.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/EdgeRNG.class b/bin/plugins/ragini/voronoidiagram/EdgeRNG.class
new file mode 100644
index 0000000000000000000000000000000000000000..a5dca4306febbe78f6b39a7d921615af0a6282ba
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/EdgeRNG.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/EdgeS.class b/bin/plugins/ragini/voronoidiagram/EdgeS.class
new file mode 100644
index 0000000000000000000000000000000000000000..4f67acd43dc15be7d5a0b2903a8aee3fd750190b
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/EdgeS.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/Face.class b/bin/plugins/ragini/voronoidiagram/Face.class
new file mode 100644
index 0000000000000000000000000000000000000000..b11f338f5949d6f467470a8410b66f54da49414e
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Face.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/FreeList.class b/bin/plugins/ragini/voronoidiagram/FreeList.class
new file mode 100644
index 0000000000000000000000000000000000000000..57e4486d12b9fa742118955e4452c84de26ff06b
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/FreeList.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/FreeNode.class b/bin/plugins/ragini/voronoidiagram/FreeNode.class
new file mode 100644
index 0000000000000000000000000000000000000000..2e9b019fa7e762589f2dacd88cd96f8e618e2e8b
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/FreeNode.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/Geometry.class b/bin/plugins/ragini/voronoidiagram/Geometry.class
new file mode 100644
index 0000000000000000000000000000000000000000..bf54e943d1a038d7c077b03570586a7b074926ab
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Geometry.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/GraphD.class b/bin/plugins/ragini/voronoidiagram/GraphD.class
new file mode 100644
index 0000000000000000000000000000000000000000..40609a768209a875bf9c90847d3f80c59b1d7a85
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/GraphD.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/HalfEdge.class b/bin/plugins/ragini/voronoidiagram/HalfEdge.class
new file mode 100644
index 0000000000000000000000000000000000000000..dcad064887896b4e1d163713defd9cdb13247cd9
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/HalfEdge.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Image_Extract.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/IntArraySetter.class b/bin/plugins/ragini/voronoidiagram/IntArraySetter.class
new file mode 100644
index 0000000000000000000000000000000000000000..b7b0a5369a2c0635c24f818bb61eb15280578d24
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/IntArraySetter.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/IntSetter.class b/bin/plugins/ragini/voronoidiagram/IntSetter.class
new file mode 100644
index 0000000000000000000000000000000000000000..94b5db001690fac428a99fc3463a6b1067df8fe8
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/IntSetter.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/MorphologicalOperators.class b/bin/plugins/ragini/voronoidiagram/MorphologicalOperators.class
new file mode 100644
index 0000000000000000000000000000000000000000..78c6ed8dadd0e4f0c1038707ebdd81af54290031
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/MorphologicalOperators.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/NVert.class b/bin/plugins/ragini/voronoidiagram/NVert.class
new file mode 100644
index 0000000000000000000000000000000000000000..026e888a8cbeb852596fd6a7b8f5f0bc70c734d6
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/NVert.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/Neighbor.class b/bin/plugins/ragini/voronoidiagram/Neighbor.class
new file mode 100644
index 0000000000000000000000000000000000000000..0cab07e90c9f969c3a44d7163863d30a10fc96a2
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Neighbor.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/Point.class b/bin/plugins/ragini/voronoidiagram/Point.class
new file mode 100644
index 0000000000000000000000000000000000000000..fe7b8ccd15beee014cd5d18d6f54480c405af9f7
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Point.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/PointType.class b/bin/plugins/ragini/voronoidiagram/PointType.class
new file mode 100644
index 0000000000000000000000000000000000000000..fc562490485b940b8a39bc9df1db14682312b293
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/PointType.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/PointVor.class b/bin/plugins/ragini/voronoidiagram/PointVor.class
new file mode 100644
index 0000000000000000000000000000000000000000..d56bc8bc8c8353cd16a035149098cb9c48772176
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/PointVor.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/Provider.class b/bin/plugins/ragini/voronoidiagram/Provider.class
new file mode 100644
index 0000000000000000000000000000000000000000..b44a874c497848ca81ea1305441b199da20b9cbd
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Provider.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/QuadEdge.class b/bin/plugins/ragini/voronoidiagram/QuadEdge.class
new file mode 100644
index 0000000000000000000000000000000000000000..3da8cd2047513ea55b203db1c009cea0c9263d1f
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/QuadEdge.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/ROI2DEdge.class b/bin/plugins/ragini/voronoidiagram/ROI2DEdge.class
new file mode 100644
index 0000000000000000000000000000000000000000..27fc0b9fa0d49c12f601bf6f5a5bb66d6e379b9e
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/ROI2DEdge.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/ROI2DSite.class b/bin/plugins/ragini/voronoidiagram/ROI2DSite.class
new file mode 100644
index 0000000000000000000000000000000000000000..3b0f032c71f4256707caefc61244f767fa6b0d31
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/ROI2DSite.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/Setter.class b/bin/plugins/ragini/voronoidiagram/Setter.class
new file mode 100644
index 0000000000000000000000000000000000000000..700b5f57869d1d71d0e25bd53d394dc983de106f
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Setter.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Site$NeighborComp.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/Site.class b/bin/plugins/ragini/voronoidiagram/Site.class
new file mode 100644
index 0000000000000000000000000000000000000000..c157bc907b1479c17ec3d6c2e52cf5db3eac36b8
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Site.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/SiteProvider.class b/bin/plugins/ragini/voronoidiagram/SiteProvider.class
new file mode 100644
index 0000000000000000000000000000000000000000..10613b343cd2c134090f8fa285d7c67a49b927e3
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/SiteProvider.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/Tri.class b/bin/plugins/ragini/voronoidiagram/Tri.class
new file mode 100644
index 0000000000000000000000000000000000000000..6056b515081fa06ee17b50d9efe112f17d7c9478
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Tri.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/UniformGrid$GridCell.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/UniformGrid$GridInterval.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/UniformGrid$GridPosition.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/UniformGrid$PointItem.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/UniformGrid$PointIterator.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/UniformGrid.class b/bin/plugins/ragini/voronoidiagram/UniformGrid.class
new file mode 100644
index 0000000000000000000000000000000000000000..7788a035447a78a7f92a2b2e9cf8c85556fe553f
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/UniformGrid.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/VRegion$scomp.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/VRegion$vtcomp.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/VRegion.class b/bin/plugins/ragini/voronoidiagram/VRegion.class
new file mode 100644
index 0000000000000000000000000000000000000000..1471d6510037b85c21b50270484a41e4fc600eae
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/VRegion.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/Vert.class b/bin/plugins/ragini/voronoidiagram/Vert.class
new file mode 100644
index 0000000000000000000000000000000000000000..a7f2842be723e3e3eab46053af7e9d87e0479fe0
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Vert.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/VertTheta.class b/bin/plugins/ragini/voronoidiagram/VertTheta.class
new file mode 100644
index 0000000000000000000000000000000000000000..8c6215f50d340169bcd5217814409fafe38380f1
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/VertTheta.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/Vertex.class b/bin/plugins/ragini/voronoidiagram/Vertex.class
new file mode 100644
index 0000000000000000000000000000000000000000..83c1f0f44486d7afe0fa146caaa2a756c864e498
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Vertex.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Vonoroi$GLscomp.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/Vonoroi.class b/bin/plugins/ragini/voronoidiagram/Vonoroi.class
new file mode 100644
index 0000000000000000000000000000000000000000..f73fed301a91ddbc16667025e9c358180f22dcbe
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/Vonoroi.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/VoronoiDiagram$1.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/VoronoiDiagram$2.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/VoronoiDiagram$MethodType.class differ
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
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/VoronoiDiagram$buttonlist.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/VoronoiDiagram.class b/bin/plugins/ragini/voronoidiagram/VoronoiDiagram.class
new file mode 100644
index 0000000000000000000000000000000000000000..32ea41cc352f2d4d6fddbfcbfb188c9348566b99
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/VoronoiDiagram.class differ
diff --git a/bin/plugins/ragini/voronoidiagram/dkmax.class b/bin/plugins/ragini/voronoidiagram/dkmax.class
new file mode 100644
index 0000000000000000000000000000000000000000..837754a7213db5c06f2aa413d6d777525679c0e7
Binary files /dev/null and b/bin/plugins/ragini/voronoidiagram/dkmax.class differ
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..16157b01b43f90fcdacdca1e65d31a01f5f1f0d3
--- /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 0000000000000000000000000000000000000000..454d347292b415c517645c995bc82727388b461f
--- /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 0000000000000000000000000000000000000000..4ecf47b6dd96db0f4c81789e6bdbf7f434b7cd63
--- /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 0000000000000000000000000000000000000000..6ed041fd2c09e8d697603eda05ca5c5f126f0dbe
--- /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 0000000000000000000000000000000000000000..9c8ae5366085dab827e3af6ef68e156f142f18c9
--- /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 0000000000000000000000000000000000000000..77a21c1f147c1c38fd7f01fd4d0c32bb30441cf3
--- /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 0000000000000000000000000000000000000000..8c296c9e235438de2ff385cf383846ed7ea6003a
--- /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 0000000000000000000000000000000000000000..1ccd14fd6a6c49af00d2c09492fc9a013d874ffd
--- /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 0000000000000000000000000000000000000000..81c931c9ba91a042417511788ef325a9c35cf9ea
--- /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 0000000000000000000000000000000000000000..b35b7da00e4cc592c3504a45aaa3934040313984
--- /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 0000000000000000000000000000000000000000..497769d2526a6e765526dbabd0d1b97fd3197c90
--- /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 0000000000000000000000000000000000000000..8e522e4718bde96d6535737ff89a6b1d2bdfffaf
--- /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 0000000000000000000000000000000000000000..1ff58ba7f649bf7728601232197a35cfa8d68cc1
--- /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 0000000000000000000000000000000000000000..987e6c400d54e8b01f125ea0e2407b648ac0fefd
--- /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 0000000000000000000000000000000000000000..9740600facb4f589e0a497fc4d8b331dbf9c1cd7
--- /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 0000000000000000000000000000000000000000..08c1749be5b05821c0ec277fb6ba56232498a482
--- /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 0000000000000000000000000000000000000000..64b1e1a76a74e7cdd870a14f4851777cb7b53f8d
--- /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 0000000000000000000000000000000000000000..2b292a185c18ed51ae7f93c5caf52398176ca26d
--- /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 0000000000000000000000000000000000000000..ccb74e3b025bb3515fb08192c891de8645d4596e
--- /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 0000000000000000000000000000000000000000..3c310080c799cdcda410134e04fe118a9201afd2
--- /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 0000000000000000000000000000000000000000..ebd2872b135ba81ff9a5b6d77094dcab47762d44
--- /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 0000000000000000000000000000000000000000..212fc6844df112dc4ab94ad050b9dcf258b7cd2e
--- /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 0000000000000000000000000000000000000000..8410708729509d02b8ebb2410b651e8f23b13499
--- /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 0000000000000000000000000000000000000000..a4ad0bc88855434096ba7dd85f41cf9943e4f04a
--- /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 0000000000000000000000000000000000000000..144fba85dbc8dc2bbb374b81efcc42ca22d23b0c
--- /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 0000000000000000000000000000000000000000..926ba5d8187f42207568d9244b85d296c5d3b7c3
--- /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 0000000000000000000000000000000000000000..051af8541bd2024986b164d252c8063aaed7d87b
--- /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 0000000000000000000000000000000000000000..3d132606e4a812330cd17f7935ec0a5d77ae4719
--- /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 0000000000000000000000000000000000000000..7895654ff288568b105e709c1c431a4b7d6b82ff
--- /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 0000000000000000000000000000000000000000..614a81cad356aff879340aa57d435715ed8904c0
--- /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 0000000000000000000000000000000000000000..cce2fe3096f5725ea087d59ddd0cdc3351138f76
--- /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 0000000000000000000000000000000000000000..dc34fc22e74e74239653353cfba12724bb697a7a
--- /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 0000000000000000000000000000000000000000..177d36226baadf44f6cf52d624a60a922969a02a
--- /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 0000000000000000000000000000000000000000..5e4b0bc9840a1a61988f1ef7161881aa2987773b
--- /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 0000000000000000000000000000000000000000..f0493675e86f30f08fdceb00a792eb50794d8f13
--- /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 0000000000000000000000000000000000000000..b2aa0579290c498ed9fd53920903c56484d7b47c
--- /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 0000000000000000000000000000000000000000..63d5eb56b23e45cee772f8f49bc06eb87f11e874
--- /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 0000000000000000000000000000000000000000..c86a081b5c06e95296f22ba5e6512d013dabdf91
--- /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 0000000000000000000000000000000000000000..f05a0789641496b4313e6804a68acc74711b98a2
--- /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 0000000000000000000000000000000000000000..18959cab7522c14aecc67674342de2fe734f1ec1
--- /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 0000000000000000000000000000000000000000..e95a35d6eb4544db8b2b51377506930d63912099
--- /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 0000000000000000000000000000000000000000..72a1807bd7bbfd39b0e197b6bba984620ad5bd57
--- /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 0000000000000000000000000000000000000000..199945d414d48d6f166e7183e1d316da578c2532
--- /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 0000000000000000000000000000000000000000..2e586b2023a72bde7204208ec854b0091b62455e
--- /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 0000000000000000000000000000000000000000..a825c69e5407074819e75eee1863424618c7c0a6
--- /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 0000000000000000000000000000000000000000..51fffad3a07d198202a1992162d0035fc5572b77
--- /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 0000000000000000000000000000000000000000..300b59d07347af12e8e42d335d073b042c1058fc
--- /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; 
+	
+}