Repository: commons-math Updated Branches: refs/heads/master 428a48533 -> 10b1c517c
Connect closest node instead of first node below threshold in polygons. Project: http://git-wip-us.apache.org/repos/asf/commons-math/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-math/commit/b4fb13bc Tree: http://git-wip-us.apache.org/repos/asf/commons-math/tree/b4fb13bc Diff: http://git-wip-us.apache.org/repos/asf/commons-math/diff/b4fb13bc Branch: refs/heads/master Commit: b4fb13bca9c41e3e59a5ea8e3f8ec4bc0110ba17 Parents: 428a485 Author: Luc Maisonobe <l...@apache.org> Authored: Wed Dec 3 10:25:44 2014 +0100 Committer: Luc Maisonobe <l...@apache.org> Committed: Wed Dec 3 10:25:44 2014 +0100 ---------------------------------------------------------------------- .../geometry/euclidean/twod/PolygonsSet.java | 23 +++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-math/blob/b4fb13bc/src/main/java/org/apache/commons/math3/geometry/euclidean/twod/PolygonsSet.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math3/geometry/euclidean/twod/PolygonsSet.java b/src/main/java/org/apache/commons/math3/geometry/euclidean/twod/PolygonsSet.java index 8361831..dc3ef33 100644 --- a/src/main/java/org/apache/commons/math3/geometry/euclidean/twod/PolygonsSet.java +++ b/src/main/java/org/apache/commons/math3/geometry/euclidean/twod/PolygonsSet.java @@ -840,18 +840,25 @@ public class PolygonsSet extends AbstractRegion<Euclidean2D, Euclidean1D> { private int closeVerticesConnections(final List<ConnectableSegment> segments) { int connected = 0; for (final ConnectableSegment segment : segments) { - if (segment.getNext() == null) { + if (segment.getNext() == null && segment.getEnd() != null) { final Vector2D end = segment.getEnd(); + ConnectableSegment selectedNext = null; + double min = Double.POSITIVE_INFINITY; for (final ConnectableSegment candidateNext : segments) { - if (candidateNext.getPrevious() == null && - Vector2D.distance(end, candidateNext.getStart()) <= getTolerance()) { - // connect the two segments - segment.setNext(candidateNext); - candidateNext.setPrevious(segment); - ++connected; - break; + if (candidateNext.getPrevious() == null && candidateNext.getStart() != null) { + final double distance = Vector2D.distance(end, candidateNext.getStart()); + if (distance < min) { + selectedNext = candidateNext; + min = distance; + } } } + if (min <= getTolerance()) { + // connect the two segments + segment.setNext(selectedNext); + selectedNext.setPrevious(segment); + ++connected; + } } } return connected;