Ptidej-v5.2-master/PADL Serialiser DB4O Tests/rsc/JHotDraw v5.1/src/CH/ifa/draw/figures/ArrowTip.java
/*
 * @(#)ArrowTip.java 5.1
 *
 */

package CH.ifa.draw.figures;

import java.awt.Graphics;
import java.awt.Polygon;
import java.io.IOException;

import CH.ifa.draw.util.StorableInput;
import CH.ifa.draw.util.StorableOutput;

/**
 * An arrow tip line decoration.
 * @see PolyLineFigure
 */
public  class ArrowTip implements LineDecoration {

	private double  fAngle;         // pointiness of arrow
	private double  fOuterRadius;
	private double  fInnerRadius;

	/*
	 * Serialization support.
	 */
	private static final long serialVersionUID = -3459171428373823638L;
	private int arrowTipSerializedDataVersion = 1;

	public ArrowTip() {
	    fAngle = 0.40;//0.35;
	    fOuterRadius = 8;//15;
	    fInnerRadius = 8;//12;
	}

   /**
	* Constructs an arrow tip with the given angle and radius.
	*/
	public ArrowTip(double angle, double outerRadius, double innerRadius) {
	    fAngle = angle;
	    fOuterRadius = outerRadius;
	    fInnerRadius = innerRadius;
	}

   /**
	* Draws the arrow tip in the direction specified by the given two
	* points..
	*/
	public void draw(Graphics g, int x1, int y1, int x2, int y2) {
		// TBD: reuse the Polygon object
		Polygon p = outline(x1, y1, x2, y2);
		g.fillPolygon(p.xpoints, p.ypoints, p.npoints);
	}

   /**
	* Calculates the outline of an arrow tip.
	*/
	public Polygon outline(int x1, int y1, int x2, int y2) {
		double dir = Math.PI/2 - Math.atan2(x2-x1, y1-y2);
		return outline(x1, y1, dir);
	}

	private Polygon outline(int x, int y, double direction) {
		Polygon shape = new Polygon();

		shape.addPoint(x, y);
		addPointRelative(shape, x, y, fOuterRadius, direction - fAngle);
		addPointRelative(shape, x, y, fInnerRadius, direction);
		addPointRelative(shape, x, y, fOuterRadius, direction + fAngle);
		shape.addPoint(x,y); // Closing the polygon (TEG 97-04-23)
		return shape;
	}

	private void addPointRelative(Polygon shape, int x, int y, double radius, double angle) {
		shape.addPoint(
			x + (int) (radius * Math.cos(angle)),
			y - (int) (radius * Math.sin(angle)));
	}

	/**
	 * Stores the arrow tip to a StorableOutput.
	 */
	public void write(StorableOutput dw) {
	}

	/**
	 * Reads the arrow tip from a StorableInput.
	 */
	public void read(StorableInput dr) throws IOException {
	}

}
