Skip to content

Commit 6911fa9

Browse files
author
Meulemans
committed
bugfix in circular arc with infinite radius (i.e., modeling linesegment)
1 parent 8c106ab commit 6911fa9

File tree

1 file changed

+22
-11
lines changed

1 file changed

+22
-11
lines changed

src/nl/tue/geometrycore/geometry/curved/CircularArc.java

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import java.util.logging.Logger;
1212
import nl.tue.geometrycore.geometry.BaseGeometry;
1313
import nl.tue.geometrycore.geometry.GeometryType;
14-
import nl.tue.geometrycore.geometry.OrientedGeometry;
1514
import nl.tue.geometrycore.geometry.Vector;
1615
import nl.tue.geometrycore.geometry.linear.Line;
1716
import nl.tue.geometrycore.geometry.linear.LineSegment;
@@ -60,9 +59,8 @@ public CircularArc(Vector center, Vector start, Vector end, boolean counterclock
6059
*/
6160
public static CircularArc fromStartTangent(Vector start, Vector startTangent, Vector end) {
6261

63-
boolean ccw = 0 < Vector.crossProduct(
64-
startTangent.getX(), startTangent.getY(),
65-
end.getX() - start.getX(), end.getY() - start.getY());
62+
Vector dir = Vector.subtract(end,start);
63+
boolean ccw = 0 < Vector.crossProduct(startTangent, dir);;
6664

6765
Line bisec = Line.bisector(start, end);
6866
Line perpen = Line.perpendicularAt(start, startTangent);
@@ -530,12 +528,25 @@ public boolean inInfiniteSector(Vector point, double prec) {
530528
@Override
531529
public Vector closestPoint(Vector point) {
532530
if (inInfiniteSector(point)) {
533-
// same as for circle
534-
Vector arm = Vector.subtract(point, _center);
535-
arm.normalize();
536-
arm.scale(radius());
537-
arm.translate(_center);
538-
return arm;
531+
if (_center != null) {
532+
// same as for circle
533+
Vector arm = Vector.subtract(point, _center);
534+
arm.normalize();
535+
arm.scale(radius());
536+
arm.translate(_center);
537+
return arm;
538+
} else {
539+
// same as for line segment (except that we know its in the slab)
540+
Vector dir = Vector.subtract(point, _start);
541+
Vector chorddir = Vector.subtract(_end, _start);
542+
double len = chorddir.length();
543+
chorddir.scale(1.0 / len);
544+
545+
double dotp = Vector.dotProduct(dir, chorddir);
546+
chorddir.scale(dotp);
547+
chorddir.translate(_start);
548+
return chorddir;
549+
}
539550
} else {
540551
// one of endpoints is closest
541552
if (point.distanceTo(_start) < point.distanceTo(_end)) {
@@ -676,7 +687,7 @@ public void intersect(BaseGeometry otherGeom, double prec, List<BaseGeometry> in
676687
}
677688
}
678689
}
679-
}
690+
}
680691
//</editor-fold>
681692

682693
//<editor-fold defaultstate="collapsed" desc="METHODS">

0 commit comments

Comments
 (0)