import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
+import java.awt.geom.Line2D;
import java.awt.geom.Path2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
private static final double height = 0.5;
private static final Rectangle2D NORMAL = new Rectangle2D.Double(left, top, width, height);
-
+
private transient Point2D centerPoint;
private transient Rectangle2D symbolRect;
private transient AffineTransform symbolTransform;
-
+
+ private Double arrowLength;
+
+ private static double startX;
+ private static double startY;
+ private static double endX;
+ private static double endY;
+
@Override
public void init() {
}
g2d.setStroke(bs);
g2d.draw(path);
+ // Draw arrow
+ if (arrowLength != null) {
+ g2d.setColor(Color.BLACK);
+ g2d.setStroke(new BasicStroke(bs.getLineWidth(), BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
+
+ double l = arrowLength;
+ double w = 2 * (double) bs.getLineWidth() * Math.signum(l);
+ if (Math.abs(w) > Math.abs(l)) w = l;
+ double offset = 2 * (double) bs.getLineWidth();
+
+ double centerX = (startX + endX) / 2, centerY = (startY + endY) / 2;
+ double deltaX = endX - startX, deltaY = endY - startY;
+ double length = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
+ deltaX /= length;
+ deltaY /= length;
+
+ double x0 = centerX - l/2 * deltaX + offset * deltaY;
+ double y0 = centerY - l/2 * deltaY - offset * deltaX;
+ double x1 = centerX + (l/2 - w) * deltaX + offset * deltaY;
+ double y1 = centerY + (l/2 - w) * deltaY - offset * deltaX;
+
+ g2d.draw(new Line2D.Double(x0, y0, x1, y1));
+
+ Path2D path = new Path2D.Double();
+ path.moveTo(x1 + w * deltaX, y1 + w * deltaY);
+ path.lineTo(x1 + w * deltaY, y1 - w * deltaX);
+ path.lineTo(x1 - w * deltaY, y1 + w * deltaX);
+ path.closePath();
+ g2d.fill(path);
+ }
+
// Reset
g2d.setStroke(oldStroke);
g2d.setColor(oldColor);
// }
public static Path2D calculatePath(DistrictNetworkEdge edge, Path2D result, boolean detailed) {
- // Convert to screen coordinates
- double startX = ModelledCRS.longitudeToX(edge.getStartPoint().getX());
- double startY = ModelledCRS.latitudeToY(-edge.getStartPoint().getY()); // Invert for Simantics
- double endX = ModelledCRS.longitudeToX(edge.getEndPoint().getX());
- double endY = ModelledCRS.latitudeToY(-edge.getEndPoint().getY());// Invert for Simantics
+ startX = ModelledCRS.longitudeToX(edge.getStartPoint().getX());
+ startY = ModelledCRS.latitudeToY(-edge.getStartPoint().getY());
+ endX = ModelledCRS.longitudeToX(edge.getEndPoint().getX());
+ endY = ModelledCRS.latitudeToY(-edge.getEndPoint().getY());
if (result == null) {
result = new Path2D.Double();
public void setDynamicColor(Color color) {
this.dynamicColor = color;
}
+
+ @PropertySetter(value = "arrowLength")
+ public void setArroLength(Double length) {
+ arrowLength = length;
+ }
@PropertySetter(value = "SVG")
public void setSVG(String value) {