diff options
author | romulox_x <romulox_x@yahoo.com> | 2015-02-01 09:23:31 -0800 |
---|---|---|
committer | romulox_x <romulox_x@yahoo.com> | 2015-02-01 09:23:31 -0800 |
commit | 8db3c0a4dbf32d498bd9dfd84eab7f4a18757fea (patch) | |
tree | bfe4bd464b33ecd0fdb44a25b0a542bef5ea889c /scene/resources | |
parent | 67d357191ff74b2cfc80015941363a97e7ee19fd (diff) |
changed PolygonPathFinder::get_closest_point to return the closest position inside, rather then the closest vertex
Diffstat (limited to 'scene/resources')
-rw-r--r-- | scene/resources/polygon_path_finder.cpp | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/scene/resources/polygon_path_finder.cpp b/scene/resources/polygon_path_finder.cpp index 9f691d6ad3..e8cdec66df 100644 --- a/scene/resources/polygon_path_finder.cpp +++ b/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; |