public static Vector3 FindClosest(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, Vector3 point, out float distance, int subdivisions = 50) { float num = float.MaxValue; Vector3 result = point; Iterator4 iterator = new Iterator4(p0, p1, p2, p3, subdivisions); for (int i = 0; i < subdivisions; i++) { Vector3 current = iterator.Current; Vector3 vector = iterator.Next(); Vector3 vector2 = vector - current; Vector3 lhs = point - current; float value = Vector3.Dot(lhs, vector2) / (Vector3.Dot(vector2, vector2) + float.Epsilon); Vector3 vector3 = current + Mathf.Clamp(value, 0f, 1f) * vector2; float num2 = Vector3.SqrMagnitude(point - vector3); if (num2 < num) { num = num2; result = vector3; } } distance = Mathf.Sqrt(num); return(result); }
public static Vector3 FindClosest(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, Vector3 point, out float distance, int subdivisions = 50) { float num = 3.40282347E+38f; Vector3 result = point; Iterator4 iterator = new Iterator4(p0, p1, p2, p3, subdivisions); for (int i = 0; i < subdivisions; i++) { Vector3 current = iterator.Current; Vector3 a = iterator.Next(); Vector3 vector = a - current; Vector3 lhs = point - current; float value = Vector3.Dot(lhs, vector) / (Vector3.Dot(vector, vector) + 1.401298E-45f); Vector3 vector2 = current + Mathf.Clamp(value, 0f, 1f) * vector; float num2 = Vector3.SqrMagnitude(point - vector2); if (num2 < num) { num = num2; result = vector2; } } distance = Mathf.Sqrt(num); return(result); }