// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.data.osm.visitor.paint;
import org.openstreetmap.josm.gui.MapViewState.MapViewPoint;
import org.openstreetmap.josm.gui.draw.MapPath2D;
import org.openstreetmap.josm.tools.Utils;
/**
* This class helps with painting arrows with fixed length along a path.
* @author Michael Zangl
* @since 10827
*/
public class ArrowPaintHelper {
private final double sin;
private final double cos;
private final double length;
/**
* Creates a new arrow helper.
* @param radians The angle of the arrow. 0 means that it lies on the current line. In radians
* @param length The length of the arrow lines.
*/
public ArrowPaintHelper(double radians, double length) {
this.sin = Math.sin(radians);
this.cos = Math.cos(radians);
this.length = length;
}
/**
* Paint the arrow
* @param path The path to append the arrow to.
* @param point The point to paint the tip at
* @param fromDirection The direction the line is comming from.
*/
public void paintArrowAt(MapPath2D path, MapViewPoint point, MapViewPoint fromDirection) {
double x = point.getInViewX();
double y = point.getInViewY();
double dx = fromDirection.getInViewX() - x;
double dy = fromDirection.getInViewY() - y;
double norm = Math.sqrt(dx * dx + dy * dy);
if (norm > 1e-10) {
dx *= length / norm;
dy *= length / norm;
path.moveTo(x + dx * cos + dy * sin, y + dx * -sin + dy * cos);
if (!Utils.equalsEpsilon(cos, 0)) {
path.lineTo(point);
}
path.lineTo(x + dx * cos + dy * -sin, y + dx * sin + dy * cos);
}
}
}