|
11 | 11 | import java.util.logging.Logger; |
12 | 12 | import nl.tue.geometrycore.geometry.BaseGeometry; |
13 | 13 | import nl.tue.geometrycore.geometry.GeometryType; |
14 | | -import nl.tue.geometrycore.geometry.OrientedGeometry; |
15 | 14 | import nl.tue.geometrycore.geometry.Vector; |
16 | 15 | import nl.tue.geometrycore.geometry.linear.Line; |
17 | 16 | import nl.tue.geometrycore.geometry.linear.LineSegment; |
@@ -60,9 +59,8 @@ public CircularArc(Vector center, Vector start, Vector end, boolean counterclock |
60 | 59 | */ |
61 | 60 | public static CircularArc fromStartTangent(Vector start, Vector startTangent, Vector end) { |
62 | 61 |
|
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);; |
66 | 64 |
|
67 | 65 | Line bisec = Line.bisector(start, end); |
68 | 66 | Line perpen = Line.perpendicularAt(start, startTangent); |
@@ -530,12 +528,25 @@ public boolean inInfiniteSector(Vector point, double prec) { |
530 | 528 | @Override |
531 | 529 | public Vector closestPoint(Vector point) { |
532 | 530 | 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 | + } |
539 | 550 | } else { |
540 | 551 | // one of endpoints is closest |
541 | 552 | if (point.distanceTo(_start) < point.distanceTo(_end)) { |
@@ -676,7 +687,7 @@ public void intersect(BaseGeometry otherGeom, double prec, List<BaseGeometry> in |
676 | 687 | } |
677 | 688 | } |
678 | 689 | } |
679 | | - } |
| 690 | + } |
680 | 691 | //</editor-fold> |
681 | 692 |
|
682 | 693 | //<editor-fold defaultstate="collapsed" desc="METHODS"> |
|
0 commit comments