001package algs91; // section 9.8 002import stdlib.*; 003import algs12.Point2D; 004import algs13.Bag; 005/* *********************************************************************** 006 * Compilation: javac InteractiveConvexHull.java 007 * Execution: java InteractiveConvexHull 008 * Dependencies: GrahamScan.java Point2D.java StdDraw.java Bag.java 009 * 010 *************************************************************************/ 011 012public class XInteractiveConvexHull { 013 014 public static void main(String[] args) { 015 StdDraw.setCanvasSize(800, 800); 016 StdDraw.setXscale(0, 10000); 017 StdDraw.setYscale(0, 10000); 018 StdDraw.show(0); 019 Bag<Point2D> bag = new Bag<>(); 020 021 while (true) { 022 if (StdDraw.mousePressed()) { 023 // mouse pressed so add point to list of points 024 int x = (int) (Math.round(StdDraw.mouseX())); 025 int y = (int) (Math.round(StdDraw.mouseY())); 026 bag.add(new Point2D(x, y)); 027 028 // extract array of points 029 int N = bag.size(); 030 Point2D[] points = new Point2D[N]; 031 int n = 0; 032 for (Point2D p : bag) { 033 points[n++] = p; 034 } 035 036 // compute convex hull 037 GrahamScan graham = new GrahamScan(points); 038 039 040 StdDraw.clear(); 041 042 // draw the points in black 043 StdDraw.setPenRadius(.01); 044 StdDraw.setPenColor(StdDraw.BLACK); 045 for (int i = 0; i < N; i++) 046 points[i].draw(); 047 048 // draw the hull points in red 049 StdDraw.setPenColor(StdDraw.RED); 050 for (Point2D p : graham.hull()) 051 p.draw(); 052 053 // draw the hull line segments in blue 054 StdDraw.setPenRadius(); 055 StdDraw.setPenColor(StdDraw.BLUE); 056 Point2D prev = null; 057 for (Point2D p : graham.hull()) { 058 if (prev != null) prev.drawTo(p); 059 prev = p; 060 } 061 // hack to connect first and last points 062 for (Point2D p : graham.hull()) { 063 prev.drawTo(p); 064 break; 065 } 066 } 067 StdDraw.show(20); 068 } 069 070 } 071 072} 073