/// <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);
}