/* GoldenRectangle applet that displays a Golden Rectangle of various sizes to help students recogize the ratio in art and achitechture - version 1.0 - 19 Nov 1998 Fr. Chris Thiel */ import java.awt.*; import java.applet.Applet; import java.awt.Graphics; import java.awt.event.*; import java.lang.Math; public class GoldenRectangle extends Applet { int rx[]; int ry[]; Choice daColor = new Choice(); int fudge=7; // fudge factor for sensitivity boolean moving=false; int activeDot=0; int deltaX=0; int deltaY=40; double GR=(1 + Math.sqrt(5))/2; //The Golden Ratio int dY=(int)(GR*deltaY); int dX=(int)(GR*deltaX); Image img = null; public double distance( int x1, int y1, int x2, int y2) { double result = Math.sqrt( Math.pow((x1-x2),2) + Math.pow((y1-y2),2)); return result; } public void setImage(String imageName) { img = getImage(getCodeBase(), imageName); repaint(); } private void findNewCorners(){ rx[1]=rx[0]+deltaX; ry[1]=ry[0]+deltaY; rx[2] = rx[1] + dY; ry[2] = ry[1] - dX; rx[3] = rx[0] + dY; ry[3] = ry[0] - dX; } public void init() { rx = new int[4]; ry = new int[4]; daColor.addItem("black"); daColor.addItem("red"); daColor.addItem("magenta"); daColor.addItem("green"); daColor.addItem("white"); daColor.addItem("cyan"); daColor.addItem("coral"); add(daColor); setBackground(new Color(Integer.parseInt(getParameter("bgcolor")))); // set background image setImage(getParameter("imageName") ); rx[0]=10; ry[0]=50; findNewCorners(); repaint(); } public void paint( Graphics g ) { g.drawImage (img, 0,20,null); if (!moving){ g.setColor(Color.black); g.drawString("Click green dot to change location, Blue dot to change size", 10, size().height-10); } else { g.drawString("Click again to set size and location", 10, size().height-10); } switch (daColor.getSelectedIndex()) { case(0): g.setColor(Color.black); break; case(1): g.setColor(Color.red); break; case(2): g.setColor(Color.magenta); break; case(3): g.setColor(Color.green); break; case(4): g.setColor(Color.white); break; case(5): g.setColor(Color.cyan); break; case(6): g.setColor(new Color(0xF08080)); break; default: g.setColor(Color.black); } //switch for (int i=0; i<4; i++) g.drawLine(rx[i],ry[i],rx[(i+1)%4],ry[(i+1)%4]); g.setColor(Color.blue); g.fillOval(rx[1]-3,ry[1]-3, 7,7); g.setColor(Color.green); g.fillOval(rx[0]-3,ry[0]-3, 7,7); } //paint public boolean action(Event e, Object arg) { if (e.target instanceof Choice) { repaint(); return true; } else { return false;} } public boolean handleEvent(Event e) { return super.handleEvent(e); } /* * Mouse methods */ public boolean mouseDown(java.awt.Event evt, int x, int y) { if (!moving){ /* Find which dot to relocate */ for ( int i=0; i<2; i++){ if ( ( x > rx[i]-fudge && x < rx[i]+fudge) && ( y > ry[i]-fudge && y < ry[i]+fudge) ) { activeDot = i ; moving=true; } } } else { /* Compute distances now that a place was picked */ moving=false; //findNewCorners(); } repaint(); return true; } public boolean mouseMove(java.awt.Event evt, int x, int y) { //getAppletContext().showStatus("Location of mouse: (" + x + ", " + y + ")"); if (moving){ requestFocus(); if (activeDot==0) { rx[ 0] = x; ry[ 0] = y; } else { deltaX = x - rx[0]; deltaY = y - ry[0]; dY=(int)(GR*deltaY); dX=(int)(GR*deltaX); } findNewCorners(); repaint(); } return true; } public void mouseEnter() { repaint(); } public void mouseExit() { repaint(); } }// of class