EdgeGraph.Edge.GetClosestPointOnEdge C# (CSharp) Method

GetClosestPointOnEdge() public static method

Returns closest point to an edge (v1,v2) in X-Z space.
public static GetClosestPointOnEdge ( Vector3 point, Vector3 _v1, Vector3 _v2 ) : Vector2
point Vector3
_v1 Vector3
_v2 Vector3
return Vector2
        public static Vector2 GetClosestPointOnEdge(Vector3 point, Vector3 _v1, Vector3 _v2)
        {
            Vector2 p = new Vector2(point.x, point.z);
            Vector2 a = new Vector2(_v1.x, _v1.z);
            Vector2 b = new Vector2(_v2.x, _v2.z);

            Vector2 ap = p - a;
            Vector2 ab = b - a;

            float ab2 = ab.x * ab.x + ab.y * ab.y;
            float ap_ab = ap.x * ab.x + ap.y * ab.y;
            float t = ap_ab / ab2;

            if (t < 0.0f) t = 0.0f;
            else if (t > 1.0f) t = 1.0f;

            return (a + ab * t);
        }
        #endregion

Usage Example

コード例 #1
0
        /// <summary>
        /// Returns closest point on all the given edges. Edge positions are changed to world coordinates in reference to refTransform.
        /// </summary>
        public static Vector3 GetClosestPointOnEdge(Vector3 point, List <Node> nodes, List <Edge> edges, Transform refTransform, out Edge closestEdge)
        {
            Vector3 pointOnEdge = Vector3.zero;

            closestEdge = edges[0];
            float closestDist = Mathf.Infinity;

            for (int i = 0; i < edges.Count; i++)
            {
                Vector2 splitPointXZ;

                Node node1 = EdgeGraphUtility.GetNode(edges[i].Node1, ref nodes);
                if (node1 == null)
                {
                    continue;
                }

                Vector3 n1Pos = node1.Position;
                n1Pos = refTransform.TransformPoint(n1Pos);

                Node node2 = EdgeGraphUtility.GetNode(edges[i].Node2, ref nodes);
                if (node2 == null)
                {
                    continue;
                }

                Vector3 n2Pos = node2.Position;
                n2Pos = refTransform.TransformPoint(n2Pos);

                splitPointXZ = Edge.GetClosestPointOnEdge(point, n1Pos, n2Pos);

                Vector3 splitPoint = new Vector3(splitPointXZ.x, n1Pos.y, splitPointXZ.y);

                if (Vector3.Distance(point, splitPoint) < closestDist)
                {
                    closestEdge = edges[i];
                    pointOnEdge = splitPoint;
                    closestDist = Vector3.Distance(point, splitPoint);
                }
            }

            return(pointOnEdge);
        }
All Usage Examples Of EdgeGraph.Edge::GetClosestPointOnEdge