diff --git a/main/CompGeo.pde b/main/CompGeo.pde index 96241e1..5215dff 100644 --- a/main/CompGeo.pde +++ b/main/CompGeo.pde @@ -68,6 +68,77 @@ public static class CompGeo { return sum; } + public static boolean isContained(HalfEdge inner, HalfEdge outer, Point far) { + Point inHandle = inner.getOrigin(); + return inside(outer, inHandle, far); + } + + + + + public static ArrayList findFriends(HalfEdge inner, HalfEdge outer, PointList points) { + ArrayList handles = points.getAllStructures(); + ArrayList friends = new ArrayList(); + int num = handles.size(); + HalfEdge out = null; + for (int i = 0; i < num; i++) { + if (inner.canReach(handles.get(i))) { continue; } + out = findTightOuterBoundary(handles.get(i), points); + if (out == outer) { + if (signedArea(handles.get(i)) <= 0) { friends.add(handles.get(i).gettwin()); continue; } + else { friends.add(handles.get(i)); continue; } + } + if ((out != null) && (outer != null)) { + if (out.canReach(outer)) { + if (signedArea(handles.get(i)) <= 0) { friends.add(handles.get(i).gettwin()); continue; } + else { friends.add(handles.get(i)); continue; } + } + } + } + return friends; + } + + + public static HalfEdge findTightOuterBoundary(HalfEdge inner, PointList points) { + Point far = points.getFar(); + ArrayList handles = points.getAllStructures(); + int num = handles.size(); + HalfEdge temp; + HalfEdge tightest = null; + for (int i = 0; i < num; i++) { + temp = handles.get(i); + if (inner.canReach(temp)) { continue; } // MAKE SURE DONT CHECK AGAINST ITSELF + if (isContained(inner, temp, far)) { + if (tightest == null) { + tightest = temp; + } else { + if (isContained(temp, tightest, far)) { + tightest = temp; + } + } + } + } + tightest = findSuperTightBoundary(inner, tightest, far); + tightest.reset(); + return tightest; + } + + public static HalfEdge findSuperTightBoundary(HalfEdge inner, HalfEdge outer, Point far) { + if (outer == null) { return null; } + if ((isContained(inner, outer, far)) && (signedArea(outer) < 0)) { return outer; } + if (outer.getCounted() == false) { + outer.setCounted(true); + HalfEdge temp = findSuperTightBoundary(inner, outer.getnext(), far); + if (temp != null) { return temp; } + temp = findSuperTightBoundary(inner, outer.getprevious(), far); + if (temp != null) { return temp; } + temp = findSuperTightBoundary(inner, outer.gettwin(), far); + if (temp != null) { return temp; } + } + return null; + } + + } \ No newline at end of file diff --git a/main/FaceList.pde b/main/FaceList.pde deleted file mode 100644 index fe30fc9..0000000 --- a/main/FaceList.pde +++ /dev/null @@ -1,29 +0,0 @@ -public class FaceList { - - private ArrayList faces; - private Face unboundFace; - - public FaceList() { - //faces = new ArrayList(); - //unboundFace = new Face(); - } - - public ArrayList getFaces() { - return faces; - } - public Face getUnboundFace() { - return unboundFace; - } - - public boolean contains(Face f) { - return faces.contains(f); - } - - public void addFace(Face f) { - faces.add(f); - } - - public boolean removeFace(Point p) { - return faces.remove(p); - } -} \ No newline at end of file diff --git a/main/HalfEdge.pde b/main/HalfEdge.pde index 7366b89..3ba5311 100644 --- a/main/HalfEdge.pde +++ b/main/HalfEdge.pde @@ -293,6 +293,7 @@ public class HalfEdge { return "Origin: " + origin.toString() + "\nDestination: " + twin.getOrigin().toString(); } + public ArrayList getPointsNext() { ArrayList points = new ArrayList(); points.add(this.getOrigin()); diff --git a/main/Point.pde b/main/Point.pde index 565a1be..c371c7e 100644 --- a/main/Point.pde +++ b/main/Point.pde @@ -11,10 +11,16 @@ public class Point { public float getX() { return x; } + public void setX(float f) { + x = f; + } public float getY() { return y; } + public void setY(float f) { + y = f; + } public HalfEdge getRef() { return ref; diff --git a/main/PointList.pde b/main/PointList.pde index 37d011b..2d7e9c8 100644 --- a/main/PointList.pde +++ b/main/PointList.pde @@ -1,9 +1,15 @@ public class PointList { private ArrayList points; + private Point far; public PointList() { - points = new ArrayList(); + points = new ArrayList(); + far = new Point(0, 10000); + } + + public Point getFar() { + return far; } public ArrayList getPoints() { @@ -17,7 +23,10 @@ public class PointList { public void addPoint(Point p) { - points.add(p); + points.add(p); + if (p.getY() > far.getY()) { + far.setY(p.getY() + 1); + } } public boolean removePoint(Point p) { diff --git a/main/main.pde b/main/main.pde index e4b3485..064adf0 100644 --- a/main/main.pde +++ b/main/main.pde @@ -8,9 +8,9 @@ public void setup() { PointList list = new PointList(); Point p1 = new Point(0, 0); list.addPoint(p1); - Point p2 = new Point(100, 200); + Point p2 = new Point(100, 50); list.addPoint(p2); - Point p3 = new Point(-100, -100); + Point p3 = new Point(-200, -50); list.addPoint(p3); Point p4 = new Point(0, 150); list.addPoint(p4); @@ -24,13 +24,14 @@ public void setup() { HalfEdge h2 = new HalfEdge(p1, p4); HalfEdge h3 = new HalfEdge(p3, p1); HalfEdge h4 = new HalfEdge(p1, p5); - //HalfEdge h5 = new HalfEdge(p3, p4); - float f = CompGeo.signedArea(h2.gettwin()); - float f2 = CompGeo.signedArea(h2); + HalfEdge h5 = new HalfEdge(p3, p4); + HalfEdge h6 = new HalfEdge(p2, p4); + float f = CompGeo.signedArea(h1.gettwin()); + float f2 = CompGeo.signedArea(h1); System.out.println("Signed Area: " + f); System.out.println("Signed Area: " + f2); h1.gettwin().printFace(); - h2.printFace(); + h1.printFace(); if (CompGeo.inside(h1.gettwin(), p6, p7)) { System.out.println("INSIDE"); } else { System.out.println("OUTSIDE"); }