+ static boolean isDefined(Point2D p) {
+ return p != null && !(Double.isNaN(p.getX()) || Double.isNaN(p.getY()));
+ }
+
+ boolean renderDetailed(int zoomLevel) {
+ return zoomLevel > 13;
+ }
+
+ public float getStrokeWidth(AffineTransform tr, boolean selection) {
+ double scale = DistrictNetworkNodeUtils.getScale(tr);
+ float width = STROKE.getLineWidth() * getStrokeWidth(scale);
+ if (selection) width = width + (float) (2 * STROKE.getLineWidth() / scale);
+ return width;
+ }
+
+ private float getStrokeWidth(double scale) {
+ if (scaleStroke) {
+ double str = stroke != null ? Math.abs(stroke) : 1.0;
+ float strokeWidth = (float) (str / scale);
+ return strokeWidth;
+ }
+ else {
+ return 1.f;
+ }
+ }
+
+ public Path2D getPath() {
+ return renderDetailed(zoomLevel) ? detailedPath : path;
+ }
+
+ public Point2D getCenterPoint(int zoomLevel) {
+ return renderDetailed(zoomLevel) ? detailedCenterPoint : centerPoint;
+ }
+
+ public Point2D getDirection(int zoomLevel) {
+ return renderDetailed(zoomLevel) ? detailedDirection : direction;
+ }
+
+ public static Path2D calculatePath(DistrictNetworkEdge edge, Path2D result, boolean detailed) {
+ 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();
+ } else {
+ result.reset();
+ }
+ result.moveTo(startX, startY);
+ if (detailed) {
+ double[] detailedGeometry = edge.getGeometry();
+ if (detailedGeometry != null && !DistrictNetworkEdgeElementFactory.EMPTY.equals(detailedGeometry)) {
+ // ok, lets do this
+ for (int i = 0; i < detailedGeometry.length; i += 2) {
+ double x = ModelledCRS.longitudeToX(detailedGeometry[i]);
+ double y = ModelledCRS.latitudeToY(-detailedGeometry[i+1]);// Invert for Simantics
+ result.lineTo(x, y);
+ }
+ }
+ }
+ result.lineTo(endX, endY);
+ return result;
+ }
+