Skip to content

Commit 39ce767

Browse files
committed
convex dt hype!
1 parent fba8f5a commit 39ce767

File tree

9 files changed

+453
-346
lines changed

9 files changed

+453
-346
lines changed

.idea/workspace.xml

Lines changed: 200 additions & 226 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/java/convex_dt/ConvexDT.java

Lines changed: 70 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
package convex_dt;
22

3+
import ProGAL.dataStructures.SortToolPoint2dAroundOrigo;
34
import ProGAL.geom2d.viewer.J2DScene;
45
import convex_dt.shapes.ConvexShape;
56
import dcel.DCEL;
67
import dcel.HalfEdge;
78
import kds.KDSPoint;
9+
import utils.Helpers;
10+
811
import static utils.Helpers.*; // not very nice, but it's to avoid having to write Helpers.<func> everywhere
912
import static convex_dt.shapes.ConvexShape.*;
1013
import static java.lang.Thread.sleep;
1114
import static java.util.Collections.sort;
1215

1316
import java.awt.*;
1417
import java.util.ArrayList;
18+
import java.util.Collections;
1519

1620
/**
1721
* Created by cvium on 29-11-2016.
@@ -55,32 +59,74 @@ public HalfEdge computeSmallDelaunay(ArrayList<KDSPoint> points) throws Exceptio
5559
return e1;
5660
return e1.getTwin();
5761
} else if (points.size() == 3) {
58-
// sort them, is it really needed though?
59-
sort(points);
60-
KDSPoint a = points.get(0);
61-
KDSPoint b = points.get(1);
62-
KDSPoint c = points.get(2);
62+
// sort them in ccw order
63+
ArrayList<KDSPoint> sorted = Helpers.sortCCW(points);
64+
KDSPoint a = sorted.get(0);
65+
KDSPoint b = sorted.get(1);
66+
KDSPoint c = sorted.get(2);
6367

64-
HalfEdge e1 = dcel.createEdge(a, b);
65-
HalfEdge e2 = dcel.createEdge(b, c);
66-
// connect a -> b with b -> c and a <- b with b <- c
67-
e1.setNext(e2);
68-
e1.setFace(dcel.createFace(e1));
69-
e1.getTwin().setPrev(e2.getTwin());
70-
e1.getTwin().setFace(dcel.createFace(e1.getTwin()));
68+
HalfEdge last = null;
69+
70+
if (shape.inInfCircle(c, a, b) != infCircleEnum.INSIDE || shape.inInfCircle(c, a, b) != infCircleEnum.INSIDE) {
71+
last = dcel.createEdge(a, b);
72+
last.setFace(dcel.createFace(last));
73+
}
7174

72-
e2.setPrev(e1);
73-
e2.setFace(e1.getFace());
74-
e2.getTwin().setNext(e1.getTwin());
75-
e2.getTwin().setFace(e1.getTwin().getFace());
75+
// EVER HEARD OF DRY CODE????? ME NEITHER
76+
if (shape.inInfCircle(a, b, c) != infCircleEnum.INSIDE || shape.inInfCircle(a, c, b) != infCircleEnum.INSIDE) {
77+
HalfEdge current = dcel.createEdge(b, c);
78+
if (last != null) {
79+
last.setNext(current);
80+
last.getTwin().setPrev(current.getTwin());
81+
last.getTwin().setFace(dcel.createFace(last.getTwin()));
82+
83+
current.setPrev(last);
84+
current.setFace(last.getFace());
85+
current.getTwin().setNext(last.getTwin());
86+
current.getTwin().setFace(last.getTwin().getFace());
87+
}
88+
last = current;
89+
}
90+
91+
if (shape.inInfCircle(b, c, a) != infCircleEnum.INSIDE || shape.inInfCircle(b, a, c) != infCircleEnum.INSIDE) {
92+
// last should NEVER be null but intellij is a bitch and I hate warnings
93+
HalfEdge current = dcel.createEdge(c, a);
94+
if (last != null && last.getPrev() != null) {
95+
connect(last, last.getPrev());
96+
}
97+
else if (last != null) {
7698

99+
last.setNext(current);
100+
last.getTwin().setPrev(current.getTwin());
101+
last.getTwin().setFace(dcel.createFace(last.getTwin()));
77102

78-
// don't create a triangle if they are collinear
79-
if (leftOf(a, b, c) || rightOf(a, b, c)) {
80-
// connect and create a triangle
81-
System.out.println("Creating triangle!");
82-
connect(e2, e1);
103+
current.setPrev(last);
104+
current.setFace(last.getFace());
105+
current.getTwin().setNext(last.getTwin());
106+
current.getTwin().setFace(last.getTwin().getFace());
107+
}
83108
}
109+
110+
// HalfEdge e1 = dcel.createEdge(a, b);
111+
// HalfEdge e2 = dcel.createEdge(b, c);
112+
// // connect a -> b with b -> c and a <- b with b <- c
113+
// e1.setNext(e2);
114+
// e1.setFace(dcel.createFace(e1));
115+
// e1.getTwin().setPrev(e2.getTwin());
116+
// e1.getTwin().setFace(dcel.createFace(e1.getTwin()));
117+
//
118+
// e2.setPrev(e1);
119+
// e2.setFace(e1.getFace());
120+
// e2.getTwin().setNext(e1.getTwin());
121+
// e2.getTwin().setFace(e1.getTwin().getFace());
122+
123+
124+
// // don't create a triangle if they are collinear
125+
// if (leftOf(a, b, c) || rightOf(a, b, c)) {
126+
// // connect and create a triangle
127+
// System.out.println("Creating triangle!");
128+
// connect(e2, e1);
129+
// }
84130
// find the lowest point (y-coordinate only)
85131
KDSPoint lowestPoint;
86132
if (a.getY() < b.getY()) lowestPoint = a;
@@ -89,7 +135,7 @@ public HalfEdge computeSmallDelaunay(ArrayList<KDSPoint> points) throws Exceptio
89135

90136
// find the ccw edge incident to lowest point
91137
HalfEdge candidateEdge = lowestPoint.getIncidentEdge();
92-
if (!isCCW(candidateEdge.getPrev().getOrigin(), candidateEdge.getOrigin(), candidateEdge.getDestination()))
138+
if (candidateEdge.getPrev() != null && !isCCW(candidateEdge.getPrev().getOrigin(), candidateEdge.getOrigin(), candidateEdge.getDestination()))
93139
candidateEdge = candidateEdge.getTwin().getNext();
94140
return candidateEdge;
95141
} else {
@@ -456,7 +502,8 @@ public HalfEdge delaunay(ArrayList<KDSPoint> points) throws Exception {
456502
if (lleft.getOrigin() == base.getDestination()) lower = base.getTwin();
457503
else lower = lleft;
458504
} else {
459-
lower = rNext(lright);
505+
if (rNext(lright) == null) lower = lright;
506+
else lower = rNext(lright);
460507
}
461508

462509
// merge step

src/main/java/convex_dt/run.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
public class run {
2222
public static void main(String[] args) throws Exception {
2323
ArrayList<KDSPoint> points = new ArrayList<>();
24-
ConvexShape circle = new ZeroTri();
2524

2625
if (false) {
2726
points.add(new KDSPoint(new double[]{0}, new double[]{0}));
@@ -108,14 +107,29 @@ public static void main(String[] args) throws Exception {
108107
points.add(new KDSPoint(new double[]{-0.015880417438958627},new double[]{-1.3245869993391128}));
109108
points.add(new KDSPoint(new double[]{0.6931028872548239},new double[]{0.5246477008872006}));
110109
points.add(new KDSPoint(new double[]{1.8201338309094202},new double[]{-1.3872748859983375}));
110+
} else if (false) {
111+
points.add(new KDSPoint(new double[]{-0.9551393549029075},new double[]{-1.364082498677389}));
112+
points.add(new KDSPoint(new double[]{-0.7963689174734117},new double[]{1.187417269677896}));
113+
points.add(new KDSPoint(new double[]{-0.13105032287961338},new double[]{-0.008975683003056734}));
114+
points.add(new KDSPoint(new double[]{0.7912464403296111},new double[]{-1.9949561630768602}));
115+
} else if (false) {
116+
points.add(new KDSPoint(new double[]{-0.13105032287961338},new double[]{-0.008975683003056734}));
117+
points.add(new KDSPoint(new double[]{0.7205190050776924},new double[]{-0.5488161074338551}));
118+
points.add(new KDSPoint(new double[]{0.7912464403296111},new double[]{-1.9949561630768602}));
111119
} else if (true) {
112120
points.add(new KDSPoint(new double[]{-1.8365272560101267},new double[]{-0.32908740830003547}));
113121
points.add(new KDSPoint(new double[]{-0.9551393549029075},new double[]{-1.364082498677389}));
114122
points.add(new KDSPoint(new double[]{-0.7963689174734117},new double[]{1.187417269677896}));
115123
points.add(new KDSPoint(new double[]{-0.13105032287961338},new double[]{-0.008975683003056734}));
116124
points.add(new KDSPoint(new double[]{0.7205190050776924},new double[]{-0.5488161074338551}));
117125
points.add(new KDSPoint(new double[]{0.7912464403296111},new double[]{-1.9949561630768602}));
118-
126+
} else if (true) {
127+
points.add(new KDSPoint(new double[]{-1.8365272560101267},new double[]{-0.32908740830003547}));
128+
points.add(new KDSPoint(new double[]{-0.9551393549029075},new double[]{-1.364082498677389}));
129+
points.add(new KDSPoint(new double[]{-0.7963689174734117},new double[]{1.187417269677896}));
130+
points.add(new KDSPoint(new double[]{-0.13105032287961338},new double[]{-0.008975683003056734}));
131+
points.add(new KDSPoint(new double[]{0.7205190050776924},new double[]{-0.7488161074338551}));
132+
points.add(new KDSPoint(new double[]{0.7912464403296111},new double[]{-1.264082498677389}));
119133
}
120134

121135
else{
@@ -144,6 +158,8 @@ public static void main(String[] args) throws Exception {
144158
scene.autoZoom();
145159
scene.repaint();
146160

161+
ConvexShape circle = new ZeroTri(scene);
162+
147163
ConvexDT dt = new ConvexDT(points, circle, scene);
148164

149165
HalfEdge lower = dt.delaunay();

src/main/java/convex_dt/shapes/Circle.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package convex_dt.shapes;
22

3+
import ProGAL.geom2d.viewer.J2DScene;
34
import kds.KDSPoint;
45

56
import static utils.Helpers.leftOf;
@@ -10,6 +11,24 @@
1011
* Created by cvium on 11-12-2016.
1112
*/
1213
public class Circle implements ConvexShape {
14+
private J2DScene scene;
15+
16+
@Override
17+
public J2DScene getScene() {
18+
return scene;
19+
}
20+
21+
@Override
22+
public void setScene(J2DScene scene) {
23+
this.scene = scene;
24+
}
25+
26+
public Circle() {}
27+
28+
public Circle(J2DScene scene) {
29+
this.scene = scene;
30+
}
31+
1332
@Override
1433
public circleEnum inCircle(KDSPoint a, KDSPoint b, KDSPoint c, KDSPoint d) {
1534
double ad_x = a.getX(0) - d.getX(0);

src/main/java/convex_dt/shapes/ConvexShape.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package convex_dt.shapes;
22

3+
import ProGAL.geom2d.viewer.J2DScene;
34
import kds.KDSPoint;
45

56
/**
67
* Created by cvium on 03-12-2016.
78
*/
89
public interface ConvexShape {
10+
void setScene(J2DScene scene);
11+
J2DScene getScene();
912
/**
1013
* Predicate to test whether point d lies in the smallest circle containing a, b and c on its boundary.
1114
*

src/main/java/convex_dt/shapes/Pie.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,31 @@
11
package convex_dt.shapes;
22

3+
import ProGAL.geom2d.viewer.J2DScene;
34
import kds.KDSPoint;
45

56
/**
67
* Created by cvium on 03-12-2016.
78
*/
89
public class Pie implements ConvexShape {
10+
private J2DScene scene;
11+
12+
@Override
13+
public J2DScene getScene() {
14+
return scene;
15+
}
16+
17+
@Override
18+
public void setScene(J2DScene scene) {
19+
this.scene = scene;
20+
}
21+
922
public Pie() {
1023
}
1124

25+
public Pie(J2DScene scene) {
26+
this.scene = scene;
27+
}
28+
1229
@Override
1330
public circleEnum inCircle(KDSPoint a, KDSPoint b, KDSPoint c, KDSPoint d) {
1431
return null;

0 commit comments

Comments
 (0)