Pārlūkot izejas kodu

add ray intersect feature on 2d Polygon

bstouls 9 gadi atpakaļ
vecāks
revīzija
e8501c79f5
3 mainītis faili ar 66 papildinājumiem un 0 dzēšanām
  1. 16 0
      h2d/col/Polygon.hx
  2. 34 0
      h2d/col/Ray.hx
  3. 16 0
      h2d/col/Segment.hx

+ 16 - 0
h2d/col/Polygon.hx

@@ -147,6 +147,22 @@ abstract Polygon(Array<Point>) from Array<Point> to Array<Point> {
 		}
 	}
 
+	public function rayIntersection( r : h2d.col.Ray ) {
+		var segs = toSegments();
+		var dmin = 1E9;
+		var pt = null;
+		for(s in segs) {
+			var p = s.rayIntersection(r);
+			if( p == null) continue;
+			var d = Math.distanceSq(p.x - r.x, p.y - r.y);
+			if(d < dmin) {
+				pt = p;
+				dmin = d;
+			}
+		}
+		return pt;
+	}
+
 	/**
 		Creates a new optimized polygon by eliminating almost colinear edges according to epsilon distance.
 	**/

+ 34 - 0
h2d/col/Ray.hx

@@ -0,0 +1,34 @@
+package h2d.col;
+import hxd.Math;
+
+class Ray {
+
+	public var x : Float;
+	public var y : Float;
+	public var dx : Float;
+	public var dy : Float;
+
+	public inline function new( p1 : Point, p2 : Point ) {
+		setPoints(p1, p2);
+	}
+
+	public inline function setPoints( p1 : Point, p2 : Point ) {
+		x = p1.x;
+		y = p1.y;
+		dx = p2.x - x;
+		dy = p2.y - y;
+	}
+
+	public inline function side( p : Point ) {
+		return dx * (p.y - y) - dy * (p.x - x);
+	}
+
+
+	public inline function getPos() {
+		return new Point(x, y);
+	}
+
+	public inline function getDir() {
+		return new Point(dx, dy);
+	}
+}

+ 16 - 0
h2d/col/Segment.hx

@@ -63,4 +63,20 @@ class Segment {
 		}
 	}
 
+	public function rayIntersection( r : h2d.col.Ray ) {
+		if(r.side(new Point(x, y)) * r.side(new Point(x + dx, y + dy)) > 0)
+			return null;
+
+		var x1 = x, y1 = y;
+		var x2 = x + dx, y2 = y + dy;
+		var x3 = r.x, y3 = r.y;
+		var x4 = r.x + r.dx, y4 = r.y + r.dy;
+
+		var u = ( (x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3) ) / ( (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1) );
+		var px = x1 + u * (x2 - x1);
+		var py = y1 + u * (y2 - y1);
+
+		return new Point(px, py);
+	}
+
 }