/** assumes v is an halfplane! - returns another (none halfplane) triangle */ private static Triangle findnext2(Point p, Triangle v) { if (v.getAbTriangle() != null && !v.getAbTriangle().isHalfplane()) return v.getAbTriangle(); if (v.getBcTriangle() != null && !v.getBcTriangle().isHalfplane()) return v.getBcTriangle(); if (v.getCaTriangle() != null && !v.getCaTriangle().isHalfplane()) return v.getCaTriangle(); return null; }
private void allTriangles(Triangle curr, Vector<Triangle> front, int mc) { if (curr != null && curr.getMc() == mc && !front.contains(curr)) { front.add(curr); allTriangles(curr.getAbTriangle(), front, mc); allTriangles(curr.getBcTriangle(), front, mc); allTriangles(curr.getCaTriangle(), front, mc); } }
private void initTriangles() { if (modCount == modCount2) return; if (this.size() > 2) { modCount2 = modCount; Vector<Triangle> front = new Vector<Triangle>(); triangles = new Vector<Triangle>(); front.add(this.startTriangle); while (front.size() > 0) { Triangle t = front.remove(0); if (t.isMark() == false) { t.setMark(true); triangles.add(t); if (t.getAbTriangle() != null && !t.getAbTriangle().isMark()) { front.add(t.getAbTriangle()); } if (t.getBcTriangle() != null && !t.getBcTriangle().isMark()) { front.add(t.getBcTriangle()); } if (t.getCaTriangle() != null && !t.getCaTriangle().isMark()) { front.add(t.getCaTriangle()); } } } for (int i = 0; i < triangles.size(); i++) { triangles.elementAt(i).setMark(false); } } }
/** * returns an iterator to the set of all the points on the XY-convex hull * * @return iterator to the set of all the points on the XY-convex hull. */ public Iterator<Point> getConvexHullVerticesIterator() { Vector<Point> ans = new Vector<Point>(); Triangle curr = this.startTriangleHull; boolean cont = true; double x0 = bbMin.getX(), x1 = bbMax.getX(); double y0 = bbMin.getY(), y1 = bbMax.getY(); boolean sx, sy; while (cont) { sx = curr.getA().getX() == x0 || curr.getA().getX() == x1; sy = curr.getA().getY() == y0 || curr.getA().getY() == y1; if ((sx && sy) || (!sx && !sy)) { ans.add(curr.getA()); } if (curr.getBcTriangle() != null && curr.getBcTriangle().isHalfplane()) curr = curr.getBcTriangle(); if (curr == this.startTriangleHull) cont = false; } return ans.iterator(); }
private Triangle treatDegeneracyInside(Triangle t, Point p) { if (t.getAbTriangle().isHalfplane() && p.pointLineTest(t.getB(), t.getA()) == Point.ONSEGMENT) return extendOutside(t.getAbTriangle(), p); if (t.getBcTriangle().isHalfplane() && p.pointLineTest(t.getC(), t.getB()) == Point.ONSEGMENT) return extendOutside(t.getBcTriangle(), p); if (t.getCaTriangle().isHalfplane() && p.pointLineTest(t.getA(), t.getC()) == Point.ONSEGMENT) return extendOutside(t.getCaTriangle(), p); return null; }
private static Triangle findnext1(Point p, Triangle v) { if (p.pointLineTest(v.getA(), v.getB()) == Point.RIGHT && !v.getAbTriangle().isHalfplane()) return v.getAbTriangle(); if (p.pointLineTest(v.getB(), v.getC()) == Point.RIGHT && !v.getBcTriangle().isHalfplane()) return v.getBcTriangle(); if (p.pointLineTest(v.getC(), v.getA()) == Point.RIGHT && !v.getCaTriangle().isHalfplane()) return v.getCaTriangle(); if (p.pointLineTest(v.getA(), v.getB()) == Point.RIGHT) return v.getAbTriangle(); if (p.pointLineTest(v.getB(), v.getC()) == Point.RIGHT) return v.getBcTriangle(); if (p.pointLineTest(v.getC(), v.getA()) == Point.RIGHT) return v.getCaTriangle(); return null; }
private Triangle extendclock(Triangle t, Point p) { t.setHalfplane(false); t.setC(p); t.circumcircle(); Triangle tbc = t.getBcTriangle(); if (p.pointLineTest(tbc.getA(), tbc.getB()) >= Point.RIGHT) { Triangle nT = new Triangle(p, t.getB()); nT.setAbTriangle(t); t.setBcTriangle(nT); nT.setBcTriangle(tbc); tbc.setCanext(nT); return nT; } return extendclock(tbc, p); }
v.setAbTriangle(u.getBcTriangle()); t.setAbTriangle(u.getAbTriangle()); } else if (t.getA() == u.getB()) { v = new Triangle(u.getC(), t.getB(), t.getC()); v.setAbTriangle(u.getCaTriangle()); t.setAbTriangle(u.getBcTriangle()); } else if (t.getA() == u.getC()) { v = new Triangle(u.getA(), t.getB(), t.getC()); v.setBcTriangle(t.getBcTriangle()); v.getAbTriangle().switchneighbors(u, v); v.getBcTriangle().switchneighbors(t, v); t.setBcTriangle(v); v.setCanext(t);
private Triangle extendOutside(Triangle t, Point p) { if (p.pointLineTest(t.getA(), t.getB()) == Point.ONSEGMENT) { Triangle dg = new Triangle(t.getA(), t.getB(), p); Triangle hp = new Triangle(p, t.getB()); t.setB(p); dg.setAbTriangle(t.getAbTriangle()); dg.getAbTriangle().switchneighbors(t, dg); dg.setBcTriangle(hp); hp.setAbTriangle(dg); dg.setCanext(t); t.setAbTriangle(dg); hp.setBcTriangle(t.getBcTriangle()); hp.getBcTriangle().setCanext(hp); hp.setCanext(t); t.setBcTriangle(hp); return dg; } Triangle ccT = extendcounterclock(t, p); Triangle cT = extendclock(t, p); ccT.setBcTriangle(cT); cT.setCanext(ccT); startTriangleHull = cT; return cT.getAbTriangle(); }
} else if (!halfplane.getBcTriangle().isHalfplane()) { neighbor = halfplane.getBcTriangle(); } else if (!halfplane.getBcTriangle().isHalfplane()) { neighbor = halfplane.getCaTriangle();
deletedTriangle.getBcTriangle().switchneighbors(deletedTriangle, addedTriangle); addedTriangle.setAbTriangle(deletedTriangle.getBcTriangle()); addedTriangle.setCanext(deletedTriangle.getBcTriangle()); addedTriangle.setBcTriangle(deletedTriangle.getBcTriangle());
private Triangle extendInside(Triangle t, Point p) { Triangle h1, h2; h1 = treatDegeneracyInside(t, p); if (h1 != null) return h1; h1 = new Triangle(t.getC(), t.getA(), p); h2 = new Triangle(t.getB(), t.getC(), p); t.setC(p); t.circumcircle(); h1.setAbTriangle(t.getCaTriangle()); h1.setBcTriangle(t); h1.setCanext(h2); h2.setAbTriangle(t.getBcTriangle()); h2.setBcTriangle(h1); h2.setCanext(t); h1.getAbTriangle().switchneighbors(t, h1); h2.getAbTriangle().switchneighbors(t, h2); t.setBcTriangle(h2); t.setCanext(h1); return t; }
t.setAbTriangle(tp); tp.setAbTriangle(t); t.setBcTriangle(u.getBcTriangle()); u.getBcTriangle().setCanext(t); t.setCanext(u); u.setBcTriangle(t);