private static void renderHull(PtEntry pt) { Inf inf = Inf.create(); int count = 30; PtEntry ptStart = pt; do { inf.update(); if (pt.prev(true) != null) { boolean valley = false; valley = (pt.prev(true).source() == pt.source() && pt.prev(true).orig().next(true) != pt.orig()); V.pushColor(MyColor.cBLUE); V.pushStroke(valley ? STRK_RUBBERBAND : STRK_THICK); V.drawLine(pt.prev(true), pt); V.pop(2); } V.pushColor(MyColor.cDARKGREEN); V.mark(pt, MARK_DISC, .6); V.pop(); if (Editor.withLabels(true)) { StringBuilder sb = new StringBuilder(); sb.append(" #" + pt.id()); if (pt.source() != null) sb.append(" <" + pt.source() + ">"); V.pushScale(.6); V.draw(sb.toString(), MyMath.ptOnCircle(pt, MyMath.radians(30), 3), TX_FRAME | TX_BGND); V.pop(); } pt = pt.next(true); if (count-- == 0) V.draw("too many points rendering!", 50, 50, TX_CLAMP); } while (pt != ptStart && count > 0); }
/** * Calculate possible hull of a pair of polygons * * @param a * @param b * @return possible hull */ private static EdPolygon calcPHull(EdPolygon aPoly, EdPolygon bPoly) { final boolean db = true; if (db && T.update()) T.msg( "calc possible hull of two polygons" + T.show(aPoly, MyColor.cBLUE, STRK_THICK, -1) + T.show(bPoly, MyColor.cDARKGREEN, STRK_THICK, -1)); PtEntry a = PtEntry.buildFrom(aPoly); PtEntry b = PtEntry.buildFrom(bPoly); PtEntry aHull = PtEntry.convexHull(a); PtEntry bHull = PtEntry.convexHull(b); inf = Inf.create(); if (db && T.update()) { T.msg( "convex hulls" + T.show(aHull.toPolygon(), MyColor.cBLUE, STRK_THICK, -1) + T.show(bHull.toPolygon(), MyColor.cDARKGREEN, STRK_THICK, -1)); } PtEntry ph = hullOfPolygons(a, b, aHull, bHull); traceHullPt = ph; insertValleys(ph, a.source(), b.source()); expandHull(ph, aHull, bHull, true); expandHull(ph, aHull, bHull, false); return ph.toPolygon(); }