01: import java.awt.Color; 02: import java.awt.Graphics2D; 03: import java.awt.geom.GeneralPath; 04: import java.awt.geom.Point2D; 05: 06: /** 07: This class defines arrowheads of various shapes. 08: */ 09: public class ArrowHead extends SerializableEnumeration 10: { 11: private ArrowHead() {} 12: /** 13: Draws the arrowhead. 14: @param g2 the graphics context 15: @param p a point on the axis of the arrow head 16: @param q the end point of the arrow head 17: */ 18: public void draw(Graphics2D g2, Point2D p, Point2D q) 19: { 20: if (this == NONE) return; 21: final double ARROW_ANGLE = Math.PI / 6; 22: final double ARROW_LENGTH = 8; 23: 24: double dx = q.getX() - p.getX(); 25: double dy = q.getY() - p.getY(); 26: double angle = Math.atan2(dy, dx); 27: double x1 = q.getX() 28: - ARROW_LENGTH * Math.cos(angle - ARROW_ANGLE); 29: double y1 = q.getY() 30: - ARROW_LENGTH * Math.sin(angle - ARROW_ANGLE); 31: double x2 = q.getX() 32: - ARROW_LENGTH * Math.cos(angle + ARROW_ANGLE); 33: double y2 = q.getY() 34: - ARROW_LENGTH * Math.sin(angle + ARROW_ANGLE); 35: 36: GeneralPath path = new GeneralPath(); 37: path.moveTo((float) q.getX(), (float) q.getY()); 38: path.lineTo((float) x1, (float) y1); 39: if (this == V) 40: { 41: path.moveTo((float) x2, (float) y2); 42: path.lineTo((float) q.getX(), (float) q.getY()); 43: } 44: else if (this == TRIANGLE) 45: { 46: path.lineTo((float) x2, (float) y2); 47: path.closePath(); 48: } 49: else if (this == DIAMOND || this == BLACK_DIAMOND) 50: { 51: double x3 = x1 - ARROW_LENGTH * Math.cos(angle + ARROW_ANGLE); 52: double y3 = y1 - ARROW_LENGTH * Math.sin(angle + ARROW_ANGLE); 53: path.lineTo((float) x3, (float) y3); 54: path.lineTo((float) x2, (float) y2); 55: path.closePath(); 56: } 57: Color oldColor = g2.getColor(); 58: if (this == BLACK_DIAMOND) 59: g2.setColor(Color.BLACK); 60: else 61: g2.setColor(Color.WHITE); 62: g2.fill(path); 63: g2.setColor(oldColor); 64: g2.draw(path); 65: } 66: 67: public static final ArrowHead NONE = new ArrowHead(); 68: public static final ArrowHead TRIANGLE = new ArrowHead(); 69: public static final ArrowHead V = new ArrowHead(); 70: public static final ArrowHead DIAMOND = new ArrowHead(); 71: public static final ArrowHead BLACK_DIAMOND = new ArrowHead(); 72: }