Jelajahi Sumber

Merge pull request #1327 from romulox-x/polygonPathFinderClosestPoint

changed PolygonPathFinder::get_closest_point to return the closest posit...
Juan Linietsky 10 tahun lalu
induk
melakukan
b4e1c1d717
1 mengubah file dengan 17 tambahan dan 9 penghapusan
  1. 17 9
      scene/resources/polygon_path_finder.cpp

+ 17 - 9
scene/resources/polygon_path_finder.cpp

@@ -525,24 +525,32 @@ bool PolygonPathFinder::is_point_inside(const Vector2& p_point) const {
 
 Vector2 PolygonPathFinder::get_closest_point(const Vector2& p_point) const {
 
-	int closest_idx=-1;
 	float closest_dist=1e20;
-	for(int i=0;i<points.size()-2;i++) {
+	Vector2 closest_point;
+
+	for (Set<Edge>::Element *E=edges.front();E;E=E->next()) {
+
+		const Edge& e=E->get();
+		Vector2 seg[2]={
+			points[e.points[0]].pos,
+			points[e.points[1]].pos
+		};
+
+
+		Vector2 closest = Geometry::get_closest_point_to_segment_2d(p_point,seg);
+		float d = p_point.distance_squared_to(closest);
 
-		float d = p_point.distance_squared_to(points[i].pos);
 		if (d<closest_dist) {
 			closest_dist=d;
-			closest_idx=i;
+			closest_point=closest;
 		}
-
 	}
+	
+	ERR_FAIL_COND_V(closest_dist==1e20,Vector2());
 
-	ERR_FAIL_COND_V(closest_idx==-1,Vector2());
-
-	return points[closest_idx].pos;
+	return closest_point;
 }
 
-
 Vector<Vector2> PolygonPathFinder::get_intersections(const Vector2& p_from, const Vector2& p_to) const {
 
 	Vector<Vector2> inters;