import acm.graphics.*; import acm.program.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class Hexes extends GraphicsProgram { public void run() { Random rand = new Random(); for(int i = 0; i < 10; i++) { double x = rand.nextDouble() * (this.getWidth() - 100); double y = rand.nextDouble() * (this.getHeight() - 100); GNgon hex = new GNgon(3 + rand.nextInt(4), x, y, 100); hex.setFilled(true); this.add(hex); } this.addMouseListeners(); while(true) { this.pause(40); for(int i = 0; i < this.getElementCount(); i++) { GNgon shape = (GNgon) this.getElement(i); shape.step(this.getWidth(), this.getHeight()); } } } public void mouseClicked(MouseEvent e) { double x = e.getX(); double y = e.getY(); GNgon shape = (GNgon) this.getElementAt(x, y); this.println(shape.getSides()); } } class GNgon extends GPolygon { private int sideCount; private double direction; public GNgon(int sides, double cx, double cy, double diam) { sideCount = sides; double theta = 2 * Math.PI / sides; double minx = 0; double miny = 0; for(int i = 0; i < sides; i++) { double angle = theta * i; double x = diam / 2 * Math.cos(angle); double y = diam / 2 * Math.sin(angle); if(x < minx) minx = x; if(y < miny) miny = y; } for(int i = 0; i < sides; i++) { double angle = theta * i; double x = -minx + diam / 2 * Math.cos(angle); double y = -miny + diam / 2 * Math.sin(angle); this.addVertex(x, y); } this.move(cx, cy); direction = 2 * Math.PI * Math.random(); } public int getSides() { return sideCount; } public void step(double winWidth, double winHeight) { this.move(5 * Math.cos(direction), 5 * Math.sin(direction)); if(this.getX() < 0 || this.getX() + this.getWidth() > winWidth) { direction = Math.PI - direction; } if(this.getY() < 0 || this.getY() + this.getHeight() > winHeight) { direction = -direction; } } }