Back to index

moin  1.9.0~rc2
TriangleFigure.java
Go to the documentation of this file.
00001 /*
00002  * Hacked together by Doug lea
00003  * Tue Feb 25 17:30:58 1997  Doug Lea  (dl at gee)
00004  *
00005  */
00006 
00007 package CH.ifa.draw.contrib;
00008 
00009 import java.awt.*;
00010 import java.util.*;
00011 import java.io.IOException;
00012 import CH.ifa.draw.framework.*;
00013 import CH.ifa.draw.util.*;
00014 import CH.ifa.draw.standard.*;
00015 import CH.ifa.draw.figures.*;
00016 
00021 public  class TriangleFigure extends RectangleFigure {
00022 
00023   static double[] rotations = {
00024     -Math.PI/2, -Math.PI/4,
00025     0.0, Math.PI/4,
00026     Math.PI/2, Math.PI * 3/4,
00027     Math.PI,  -Math.PI * 3/4
00028   };
00029 
00030   protected int fRotation = 0;
00031 
00032   public TriangleFigure() {
00033     super(new Point(0,0), new Point(0,0));
00034   }
00035 
00036   public TriangleFigure(Point origin, Point corner) {
00037     super(origin, corner);
00038   }
00039 
00040   public Vector handles() {
00041     Vector h = super.handles();
00042     h.addElement(new TriangleRotationHandle(this));
00043     return h;
00044   }
00045 
00046   public void rotate(double angle) {
00047     willChange();
00048     //System.out.println("a:"+angle);
00049     double dist = Double.MAX_VALUE;
00050     int best = 0;
00051     for (int i = 0; i < rotations.length; ++i) {
00052       double d = Math.abs(angle - rotations[i]);
00053       if (d < dist) {
00054         dist = d;
00055         best = i;
00056       }
00057     }
00058     fRotation = best;
00059     changed();
00060   }
00061 
00063   public Polygon polygon() {
00064     Rectangle r = displayBox();
00065     Polygon p = new Polygon();
00066     switch (fRotation) {
00067     case 0:
00068       p.addPoint(r.x+r.width/2, r.y);
00069       p.addPoint(r.x+r.width, r.y+r.height);
00070       p.addPoint(r.x, r.y+r.height);
00071       break;
00072     case 1:
00073       p.addPoint(r.x + r.width, r.y);
00074       p.addPoint(r.x+r.width, r.y+r.height);
00075       p.addPoint(r.x, r.y);
00076       break;
00077     case 2:
00078       p.addPoint(r.x + r.width, r.y+r.height/2);
00079       p.addPoint(r.x, r.y+r.height);
00080       p.addPoint(r.x, r.y);
00081       break;
00082     case 3:
00083       p.addPoint(r.x+r.width, r.y+r.height);
00084       p.addPoint(r.x, r.y+r.height);
00085       p.addPoint(r.x + r.width, r.y);
00086       break;
00087     case 4:
00088       p.addPoint(r.x+r.width/2, r.y+r.height);
00089       p.addPoint(r.x, r.y);
00090       p.addPoint(r.x + r.width, r.y);
00091       break;
00092     case 5:
00093       p.addPoint(r.x, r.y+r.height);
00094       p.addPoint(r.x, r.y);
00095       p.addPoint(r.x+r.width, r.y+r.height);
00096       break;
00097     case 6:
00098       p.addPoint(r.x, r.y+r.height/2);
00099       p.addPoint(r.x + r.width, r.y);
00100       p.addPoint(r.x+r.width, r.y+r.height);
00101       break;
00102     case 7:
00103       p.addPoint(r.x, r.y);
00104       p.addPoint(r.x + r.width, r.y);
00105       p.addPoint(r.x, r.y+r.height);
00106       break;
00107     }
00108     return p;
00109   }
00110 
00111 
00112   public void draw(Graphics g) {
00113     Polygon p = polygon();
00114     g.setColor(getFillColor());
00115     g.fillPolygon(p);
00116     g.setColor(getFrameColor());
00117     g.drawPolygon(p);
00118   }
00119 
00120 
00121   public Insets connectionInsets() {
00122     Rectangle r = displayBox();
00123     switch(fRotation) {
00124     case 0:
00125       return new Insets(r.height, r.width/2, 0, r.width/2);
00126     case 1:
00127       return new Insets(0, r.width, r.height, 0);
00128     case 2:
00129       return new Insets(r.height/2, 0, r.height/2, r.width);
00130     case 3:
00131       return new Insets(r.height, r.width, 0, 0);
00132     case 4:
00133       return new Insets(0, r.width/2, r.height, r.width/2);
00134     case 5:
00135       return new Insets(r.height, 0, 0, r.width);
00136     case 6:
00137       return new Insets(r.height/2, r.width, r.height/2, 0);
00138     case 7:
00139       return new Insets(0, 0, r.height, r.width);
00140     default:
00141       return null;
00142     }
00143   }
00144 
00145   public boolean containsPoint(int x, int y) {
00146     return polygon().contains(x, y);
00147   }
00148 
00149   public Point center() {
00150     return PolygonFigure.center(polygon());
00151   }
00152 
00153   public Point chop(Point p) {
00154     return PolygonFigure.chop(polygon(), p);
00155   }
00156 
00157   public Object clone() {
00158     TriangleFigure figure = (TriangleFigure) super.clone();
00159     figure.fRotation = fRotation;
00160     return figure;
00161   }
00162 
00163     //-- store / load ----------------------------------------------
00164 
00165     public void write(StorableOutput dw) {
00166       super.write(dw);
00167       dw.writeInt(fRotation);
00168     }
00169 
00170     public void read(StorableInput dr) throws IOException {
00171       super.read(dr);
00172       fRotation = dr.readInt();
00173     }
00174 }