Browse Source

rayIntersection() -> add ray oriented condition

bstouls 2 years ago
parent
commit
49d1130b5a
1 changed files with 8 additions and 5 deletions
  1. 8 5
      h2d/col/Polygon.hx

+ 8 - 5
h2d/col/Polygon.hx

@@ -306,7 +306,7 @@ abstract Polygon(Array<Point>) from Array<Point> to Array<Point> {
 		return minDistSq == 1e10 ? 0. : minDistSq;
 		return minDistSq == 1e10 ? 0. : minDistSq;
 	}
 	}
 
 
-	public function rayIntersection( r : h2d.col.Ray, bestMatch : Bool ) : Float {
+	public function rayIntersection( r : h2d.col.Ray, bestMatch : Bool, ?oriented = false ) : Float {
 		var dmin = -1.;
 		var dmin = -1.;
 		var p0 = points[points.length - 1];
 		var p0 = points[points.length - 1];
 
 
@@ -319,11 +319,14 @@ abstract Polygon(Array<Point>) from Array<Point> to Array<Point> {
 			var u = ( r.lx * (p0.y - r.py) - r.ly * (p0.x - r.px) ) / ( r.ly * (p.x - p0.x) - r.lx * (p.y - p0.y) );
 			var u = ( r.lx * (p0.y - r.py) - r.ly * (p0.x - r.px) ) / ( r.ly * (p.x - p0.x) - r.lx * (p.y - p0.y) );
 			var x = p0.x + u * (p.x - p0.x);
 			var x = p0.x + u * (p.x - p0.x);
 			var y = p0.y + u * (p.y - p0.y);
 			var y = p0.y + u * (p.y - p0.y);
-			var d = Math.distanceSq(x - r.px, y - r.py);
+			var v = new h2d.col.Point(x - r.px, y - r.py);
 
 
-			if(d < dmin || dmin < 0) {
-				if( !bestMatch ) return Math.sqrt(d);
-				dmin = d;
+			if(!oriented || r.getDir().dot(v) > 0) {
+				var d = Math.distanceSq(v.x, v.y);
+				if(d < dmin || dmin < 0) {
+					if( !bestMatch ) return Math.sqrt(d);
+						dmin = d;
+				}
 			}
 			}
 			p0 = p;
 			p0 = p;
 		}
 		}