X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.diagram.connection%2Fsrc%2Forg%2Fsimantics%2Fdiagram%2Fconnection%2FRouteGraph.java;h=249399d0a8b5b7b6c875c68d8464fda198961160;hp=62d3de68fae5f110a6b08eb80dcc7558ca34df80;hb=46cdf23c4ea4733a3acbfd5c9895ec9e65965c7d;hpb=615860c40d342c6df580c83189fe15de2a3b965a diff --git a/bundles/org.simantics.diagram.connection/src/org/simantics/diagram/connection/RouteGraph.java b/bundles/org.simantics.diagram.connection/src/org/simantics/diagram/connection/RouteGraph.java index 62d3de68f..249399d0a 100644 --- a/bundles/org.simantics.diagram.connection/src/org/simantics/diagram/connection/RouteGraph.java +++ b/bundles/org.simantics.diagram.connection/src/org/simantics/diagram/connection/RouteGraph.java @@ -11,13 +11,9 @@ *******************************************************************************/ package org.simantics.diagram.connection; -import gnu.trove.list.array.TDoubleArrayList; -import gnu.trove.map.hash.THashMap; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; - import java.awt.geom.Line2D; import java.awt.geom.Path2D; +import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.io.PrintStream; import java.io.Serializable; @@ -34,6 +30,11 @@ import org.simantics.diagram.connection.rendering.arrows.PlainLineEndStyle; import org.simantics.diagram.connection.segments.Segment; import org.simantics.diagram.connection.splitting.SplittedRouteGraph; +import gnu.trove.list.array.TDoubleArrayList; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; + public class RouteGraph implements Serializable { private static final long serialVersionUID = 2004022454972623908L; @@ -1474,6 +1475,46 @@ public class RouteGraph implements Serializable { routeLine.collectSegments(segments); return segments; } + + public Segment findNearestSegment(double x, double y) { + Segment nearest = null; + double minDistanceSq = Double.MAX_VALUE; + + for (Segment segment : getSegments()) { + RoutePoint p1 = segment.p1; + RoutePoint p2 = segment.p2; + + double distanceSq = Line2D.ptSegDistSq(p1.x, p1.y, p2.x, p2.y, x, y); + if (distanceSq < minDistanceSq) { + minDistanceSq = distanceSq; + nearest = segment; + } + } + return nearest; + } + + public Point2D findNearestPoint(double x, double y) { + Segment nearest = findNearestSegment(x, y); + if (nearest == null) return null; + + RoutePoint p1 = nearest.p1; + RoutePoint p2 = nearest.p2; + + double d = Math.pow(p2.x - p1.x, 2.0) + Math.pow(p2.y - p1.y, 2.0); + + if (d == 0) { + return new Point2D.Double(p1.x, p1.y); + } else { + double u = ((x - p1.x) * (p2.x - p1.x) + (y - p1.y) * (p2.y - p1.y)) / d; + if (u > 1.0) { + return new Point2D.Double(p2.x, p2.y); + } else if (u <= 0.0) { + return new Point2D.Double(p1.x, p1.y); + } else { + return new Point2D.Double(p2.x * u + p1.x * (1.0-u), (p2.y * u + p1.y * (1.0- u))); + } + } + } public Path2D getPath2D() { Path2D result = new Path2D.Double();