public static void plotDirectedHalfPlane(FPoint2 p0, FPoint2 p1, int markType) { double SEP = .4 * V.getScale(); double ang = MyMath.polarAngle(p0, p1); FPoint2 d0 = MyMath.ptOnCircle(p0, ang + Math.PI / 2, SEP); FPoint2 d1 = MyMath.ptOnCircle(p1, ang + Math.PI / 2, SEP); EdSegment.plotDirectedLine(p0, p1); V.pushStroke(STRK_RUBBERBAND); V.drawLine(d0, d1); V.popStroke(); if (markType >= 0) { V.mark(d0, markType); V.mark(d1, markType); } }
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); }
private static String tr(FPoint2 rayStart, double theta) { return tl(rayStart, MyMath.ptOnCircle(rayStart, theta, 20)); }