import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.applet.Applet; import java.awt.geom.*; import java.awt.image.BufferedImage; abstract public class Geometry { //int fill_color; //int line_thickness; Color fill_color; Color line_color; BasicStroke line_thickness; Graphics2D graphics; public abstract boolean transform_by( TransfMatr m ); public abstract boolean transform_inherit( TransfMatr m ); public abstract boolean refresh( Point2D centeredAt ); public abstract void print(); public abstract Point2D findCenter(); } class Polygon extends Geometry { Point2D [] points; public Polygon( Graphics2D g, double [] xPoints, double yPoints[] ) { int i; graphics = g; fill_color = Color.black; line_color = null; line_thickness = new BasicStroke(1.0f); if( xPoints.length != yPoints.length ) return; points = new Point2D[ xPoints.length ]; for( i = 0; i < xPoints.length; i++ ) { points[i] = new Point2D.Double( xPoints[i], yPoints[i] ); } } public Polygon( Graphics2D g, double [] xPoints, double yPoints[], Color col ) { int i; graphics = g; fill_color = col; line_color = null; line_thickness = new BasicStroke(1.0f); if( xPoints.length != yPoints.length ) return; points = new Point2D[ xPoints.length ]; for( i = 0; i < xPoints.length; i++ ) { points[i] = new Point2D.Double( xPoints[i], yPoints[i] ); } } public Polygon( Graphics2D g, double [] xPoints, double yPoints[], Color fcol, Color lcol ) { int i; graphics = g; fill_color = fcol; line_color = lcol; line_thickness = new BasicStroke(1.0f); if( xPoints.length != yPoints.length ) return; points = new Point2D[ xPoints.length ]; for( i = 0; i < xPoints.length; i++ ) { points[i] = new Point2D.Double( xPoints[i], yPoints[i] ); } } public Polygon( Graphics2D g, double [] xPoints, double yPoints[], Color fcol, Color lcol, BasicStroke bs ) { int i; graphics = g; fill_color = fcol; line_color = lcol; line_thickness = bs; if( xPoints.length != yPoints.length ) return; points = new Point2D[ xPoints.length ]; for( i = 0; i < xPoints.length; i++ ) { points[i] = new Point2D.Double( xPoints[i], yPoints[i] ); } } public boolean refresh( Point2D centeredAt ) { graphics.setColor( fill_color ); int i; GeneralPath polygon = new GeneralPath( GeneralPath.WIND_EVEN_ODD, points.length ); polygon.moveTo( (float) ( points[0].getX() + centeredAt.getX() ), (float) ( points[0].getY() + centeredAt.getY() ) ); for( i = 1; i < points.length; i++ ) { polygon.lineTo( (float) ( points[i].getX() + centeredAt.getX() ), (float) ( points[i].getY() + centeredAt.getY() ) ); } polygon.closePath(); //System.out.println("Polygon::refresh()"); graphics.fill( polygon ); if ( line_color != null ){ graphics.setColor( line_color ); graphics.setStroke( line_thickness ); graphics.draw( polygon ); } return true; } public boolean transform_by( TransfMatr m ) { int i; double x_avg = 0.; double y_avg = 0.; Point2D temp = new Point2D.Double(); //System.out.print("\nPolygon Transforming By: "); //m.print(); //System.out.print("\n"); //System.out.print("BEFORE: "); print(); for( i = 0; i < points.length; i++ ) { x_avg += points[i].getX(); y_avg += points[i].getY(); } x_avg /= points.length; y_avg /= points.length; for( i = 0; i < points.length; i++ ) { temp.setLocation( points[i].getX() - x_avg, points[i].getY() - y_avg ); m.transform( temp ); points[i].setLocation( temp.getX() + x_avg, temp.getY() + y_avg ); } //System.out.print("AFTER: "); print(); //System.out.print("\n"); return true; } public boolean transform_inherit( TransfMatr m ) { int i; //System.out.print("\nPolygon Transforming By: "); //m.print(); //System.out.print("\n"); //System.out.print("BEFORE: "); print(); for( i = 0; i < points.length; i++ ) { m.transform( points[i] ); } //System.out.print("AFTER: "); print(); //System.out.print("\n"); return true; } public void print() { int i; System.out.print("Polygon:"); for( i = 0; i < points.length; i++ ) { System.out.print(" [" + points[i].getX() + "," + points[i].getY() + "]"); } System.out.print("\n"); } public Point2D findCenter() { int i; double x_avg = 0.; double y_avg = 0.; Point2D temp = new Point2D.Double(); for( i = 0; i < points.length; i++ ) { x_avg += points[i].getX(); y_avg += points[i].getY(); } x_avg /= points.length; y_avg /= points.length; temp.setLocation( x_avg, y_avg ); return temp; } } class Ellipse extends Geometry { Point2D center; Point2D height; Point2D width; public Ellipse( Graphics2D g, Point2D cen, Point2D hei, Point2D wid ){ fill_color = Color.black; line_color = null; line_thickness = new BasicStroke(1.0f); graphics = g; center = cen; height = hei; width = wid; } public Ellipse( Graphics2D g, Point2D cen, Point2D hei, Point2D wid, Color col ){ fill_color = col; line_color = null; line_thickness = new BasicStroke(1.0f); graphics = g; center = cen; height = hei; width = wid; } public Ellipse( Graphics2D g, Point2D cen, Point2D hei, Point2D wid, Color fcol, Color lcol ){ fill_color = fcol; line_color = lcol; line_thickness = new BasicStroke(1.0f); graphics = g; center = cen; height = hei; width = wid; } public Ellipse( Graphics2D g, Point2D cen, Point2D hei, Point2D wid, Color fcol, Color lcol, BasicStroke bs ){ fill_color = fcol; line_color = lcol; line_thickness = bs; graphics = g; center = cen; height = hei; width = wid; } public boolean refresh( Point2D centeredAt ) { graphics.setColor( fill_color ); graphics.setStroke( line_thickness ); GeneralPath elle = new GeneralPath( GeneralPath.WIND_EVEN_ODD ); double cenatX; double cenatY; double destX; double destY; double adjustdownX; double adjustdownY; destX = height.getX() + centeredAt.getX(); destY = height.getY() + centeredAt.getY(); elle.moveTo( (float) destX, (float) destY ); destX = width.getX() + centeredAt.getX(); destY = width.getY() + centeredAt.getY(); cenatX = width.getX() + height.getX() - center.getX() + centeredAt.getX(); cenatY = height.getY() + width.getY() - center.getY() + centeredAt.getY(); adjustdownX = cenatX - center.getX() - centeredAt.getX(); adjustdownX *= .95; adjustdownY = cenatY - center.getY() - centeredAt.getY(); adjustdownY *= .95; cenatX = adjustdownX + center.getX() + centeredAt.getX(); cenatY = adjustdownY + center.getY() + centeredAt.getY(); elle.quadTo( (float) cenatX, (float) cenatY, (float) destX, (float) destY ); destX = 2 * center.getX() - height.getX() + centeredAt.getX(); destY = 2 * center.getY() - height.getY() + centeredAt.getY(); cenatX = width.getX() + center.getX() - height.getX() + centeredAt.getX(); cenatY = center.getY() - height.getY() + width.getY() + centeredAt.getY(); adjustdownX = cenatX - center.getX() - centeredAt.getX(); adjustdownX *= .9; adjustdownY = cenatY - center.getY() - centeredAt.getY(); adjustdownY *= .9; cenatX = adjustdownX + center.getX() + centeredAt.getX(); cenatY = adjustdownY + center.getY() + centeredAt.getY(); elle.quadTo( (float) cenatX, (float) cenatY, (float) destX, (float) destY ); destX = 2 * center.getX() - width.getX() + centeredAt.getX(); destY = 2 * center.getY() - width.getY() + centeredAt.getY(); cenatX = 3 * center.getX() - width.getX() - height.getX() + centeredAt.getX(); cenatY = 3 * center.getY() - height.getY() - width.getY() + centeredAt.getY(); adjustdownX = cenatX - center.getX() - centeredAt.getX(); adjustdownX *= .9; adjustdownY = cenatY - center.getY() - centeredAt.getY(); adjustdownY *= .9; cenatX = adjustdownX + center.getX() + centeredAt.getX(); cenatY = adjustdownY + center.getY() + centeredAt.getY(); elle.quadTo( (float) cenatX, (float) cenatY, (float) destX, (float) destY ); destX = height.getX() + centeredAt.getX(); destY = height.getY() + centeredAt.getY(); cenatX = center.getX() - width.getX() + height.getX() + centeredAt.getX(); cenatY = height.getY() + center.getY() - width.getY() + centeredAt.getY(); adjustdownX = cenatX - center.getX() - centeredAt.getX(); adjustdownX *= .9; adjustdownY = cenatY - center.getY() - centeredAt.getY(); adjustdownY *= .9; cenatX = adjustdownX + center.getX() + centeredAt.getX(); cenatY = adjustdownY + center.getY() + centeredAt.getY(); elle.quadTo( (float) cenatX, (float) cenatY, (float) destX, (float) destY ); elle.closePath(); //System.out.println("Ellipse::refresh()"); graphics.fill( elle ); if ( line_color != null ){ graphics.setColor( line_color ); graphics.setStroke( line_thickness ); graphics.draw( elle ); } return true; } public boolean transform_by( TransfMatr m ) { Point2D temp = new Point2D.Double(); //System.out.print("\nEllipse Transforming By: "); //m.print(); //System.out.print("\n"); //System.out.print("BEFORE: "); print(); if ( m.type == 1 ){ m.transform( center ); m.transform( height ); m.transform( width ); } else { temp.setLocation( height.getX() - center.getX(), height.getY() - center.getY() ); m.transform( temp ); height.setLocation( temp.getX() + center.getX(), temp.getY() + center.getY() ); temp.setLocation( width.getX() - center.getX(), width.getY() - center.getY() ); m.transform( temp ); width.setLocation( temp.getX() + center.getX(), temp.getY() + center.getY() ); } //System.out.print("AFTER: "); print(); return true; } public boolean transform_inherit( TransfMatr m ) { m.transform( height ); m.transform( width ); m.transform( center ); return true; } public void print() { System.out.print("Ellipse:"); System.out.print("(Center ="); System.out.print(" [" + center.getX() + "," + center.getY() + "]"); System.out.print("(Height ="); System.out.print(" [" + height.getX() + "," + height.getY() + "]"); System.out.print("(Width ="); System.out.print(" [" + width.getX() + "," + width.getY() + "]"); System.out.print("\n"); } public Point2D findCenter() { Point2D temp = new Point2D.Double(); temp.setLocation( center.getX(), center.getY() ); return temp; } }