private Point findDiagonal(Triangle triangle, Point point) { Point p1 = triangle.getA(); Point p2 = triangle.getB(); Point p3 = triangle.getC(); if ((p1.pointLineTest(point, p3) == Point.LEFT) && (p2.pointLineTest(point, p3) == Point.RIGHT)) return p3; if ((p3.pointLineTest(point, p2) == Point.LEFT) && (p1.pointLineTest(point, p2) == Point.RIGHT)) return p2; if ((p2.pointLineTest(point, p1) == Point.LEFT) && (p3.pointLineTest(point, p1) == Point.RIGHT)) return p1; return null; }
/** * determinates if this triangle contains the point p. * * @param p * the query point * @return true iff p is not null and is inside this triangle (Note: on * boundary is considered inside!!). */ public boolean contains(Point p) { boolean ans = false; if (this.halfplane || p == null) return false; if (isCorner(p)) { return true; } int a12 = p.pointLineTest(a, b); int a23 = p.pointLineTest(b, c); int a31 = p.pointLineTest(c, a); if ((a12 == Point.LEFT && a23 == Point.LEFT && a31 == Point.LEFT) || (a12 == Point.RIGHT && a23 == Point.RIGHT && a31 == Point.RIGHT) || (a12 == Point.ONSEGMENT || a23 == Point.ONSEGMENT || a31 == Point.ONSEGMENT)) ans = true; return ans; }
/** * determinates if this triangle contains the point p. * * @param p * the query point * @return true iff p is not null and is inside this triangle (Note: on * boundary is considered outside!!). */ public boolean containsBoundaryIsOutside(Point p) { boolean ans = false; if (this.halfplane || p == null) return false; if (isCorner(p)) { return true; } int a12 = p.pointLineTest(a, b); int a23 = p.pointLineTest(b, c); int a31 = p.pointLineTest(c, a); if ((a12 == Point.LEFT && a23 == Point.LEFT && a31 == Point.LEFT) || (a12 == Point.RIGHT && a23 == Point.RIGHT && a31 == Point.RIGHT)) ans = true; return ans; }
/** * constructs a triangle form 3 point - store it in counterclockwised order. */ public Triangle(Point A, Point B, Point C) { a = A; int res = C.pointLineTest(A, B); if ((res <= Point.LEFT) || (res == Point.INFRONTOFA) || (res == Point.BEHINDB)) { b = B; c = C; } else { // RIGHT System.out.println("Warning, ajTriangle(A,B,C) " + "expects points in counterclockwise order."); System.out.println("" + A + B + C); b = C; c = B; } circumcircle(); }
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 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; }
switch (p.pointLineTest(firstP, lastP)) { case Point.LEFT: startTriangle = extendOutside(firstT.getAbTriangle(), p);
private Triangle extendcounterclock(Triangle t, Point p) { t.setHalfplane(false); t.setC(p); t.circumcircle(); Triangle tca = t.getCaTriangle(); if (p.pointLineTest(tca.getA(), tca.getB()) >= Point.RIGHT) { Triangle nT = new Triangle(t.getA(), p); nT.setAbTriangle(t); t.setCanext(nT); nT.setCanext(tca); tca.setBcTriangle(nT); return nT; } return extendcounterclock(tca, p); }
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); }
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(); }