2
0
Эх сурвалжийг харах

added Poly2d and Seg2d.project

ncannasse 12 жил өмнө
parent
commit
a6caceb612
2 өөрчлөгдсөн 80 нэмэгдсэн , 0 устгасан
  1. 66 0
      h3d/col/Poly2d.hx
  2. 14 0
      h3d/col/Seg2d.hx

+ 66 - 0
h3d/col/Poly2d.hx

@@ -0,0 +1,66 @@
+package h3d.col;
+
+class Poly2d {
+
+	public var points : Array<Point2d>;
+	var segments : Array<Seg2d>;
+	
+	public function new( points ) {
+		this.points = points;
+	}
+		
+	public function isConvex() {
+		for( i in 0...points.length ) {
+			var p1 = points[i];
+			var p2 = points[(i + 1) % points.length];
+			var p3 = points[(i + 2) % points.length];
+			if( (p2.x - p1.x) * (p3.y - p1.y) - (p2.y - p1.y) * (p3.x - p1.x) < 0 )
+				return false;
+		}
+		return true;
+	}
+
+	public function getSegments() {
+		if( segments != null )
+			return segments;
+		segments = [];
+		for( i in 0...points.length ) {
+			var s = new Seg2d(points[i], points[(i + 1) % points.length]);
+			segments.push(s);
+		}
+		return segments;
+	}
+	
+	public function hasPoint( p : Point2d ) {
+		for( s in getSegments() )
+			if( s.side(p) < 0 )
+				return false;
+		return true;
+	}
+	
+	public function project( p : Point2d ) : Point2d {
+		var dmin = 1e20, smin = null;
+		for( s in getSegments() ) {
+			var d = s.distanceSq(p);
+			if( d < dmin ) {
+				dmin = d;
+				smin = s;
+			}
+		}
+		return smin.project(p);
+	}
+	
+	public function distanceSq( p : Point2d ) {
+		var dmin = 1e20;
+		for( s in getSegments() ) {
+			var d = s.distanceSq(p);
+			if( d < dmin ) dmin = d;
+		}
+		return dmin;
+	}
+	
+	public inline function distance( p : Point2d ) {
+		return FMath.sqrt(distanceSq(p));
+	}
+	
+}

+ 14 - 0
h3d/col/Seg2d.hx

@@ -43,5 +43,19 @@ class Seg2d {
 	public inline function distance( p : Point2d ) {
 		return FMath.sqrt(distanceSq(p));
 	}
+	
+	public inline function project( p : Point2d ) : Point2d {
+		var px = p.x - x;
+		var py = p.y - y;
+		var t = px * dx + py * dy;
+		return if( t < 0 )
+			new Point2d(x, y);
+		else if( t > lenSq )
+			new Point2d(x + dx, y + dy);
+		else {
+			var tl2 = t * invLenSq;
+			new Point2d(x + tl2 * dx, y + tl2 * dy);
+		}
+	}
 
 }