278 lines
5.8 KiB
C#
278 lines
5.8 KiB
C#
using UnityEngine;
|
|
|
|
public class MegaNearestPointTest
|
|
{
|
|
private static Vector3 mTriangleBary = Vector3.zero;
|
|
|
|
private static Vector3 mClosestPoint1 = Vector3.zero;
|
|
|
|
public static Vector3 NearestPointOnMesh1(Vector3 pt, Vector3[] verts, int[] tri, ref int index, ref Vector3 bary)
|
|
{
|
|
float num = float.MaxValue;
|
|
Vector3 zero = Vector3.zero;
|
|
num = float.MaxValue;
|
|
for (int i = 0; i < tri.Length; i += 3)
|
|
{
|
|
Vector3 v = verts[tri[i]];
|
|
Vector3 v2 = verts[tri[i + 1]];
|
|
Vector3 v3 = verts[tri[i + 2]];
|
|
float num2 = DistPoint3Triangle3Dbl(pt, v, v2, v3);
|
|
float num3 = num2;
|
|
if (num3 < num)
|
|
{
|
|
index = i;
|
|
bary = mTriangleBary;
|
|
zero = mClosestPoint1;
|
|
num = num3;
|
|
}
|
|
}
|
|
return zero;
|
|
}
|
|
|
|
public static Vector3 NearestPointOnMesh2(Vector3 pt, Vector3[] verts, int[] tri, ref int index, ref Vector3 bary)
|
|
{
|
|
float num = float.MaxValue;
|
|
Vector3 zero = Vector3.zero;
|
|
num = float.MaxValue;
|
|
for (int i = 0; i < tri.Length; i += 3)
|
|
{
|
|
Vector3 v = verts[tri[i]];
|
|
Vector3 v2 = verts[tri[i + 1]];
|
|
Vector3 v3 = verts[tri[i + 2]];
|
|
float num2 = DistPoint3Triangle3Dbl(pt, v, v2, v3);
|
|
float num3 = num2;
|
|
if (num3 < num)
|
|
{
|
|
index = i;
|
|
bary = mTriangleBary;
|
|
zero = mClosestPoint1;
|
|
num = num3;
|
|
}
|
|
}
|
|
return zero;
|
|
}
|
|
|
|
public static float DistPoint3Triangle3Dbl(Vector3 mPoint, Vector3 v0, Vector3 v1, Vector3 v2)
|
|
{
|
|
Vector3 rhs = v0 - mPoint;
|
|
Vector3 vector = v1 - v0;
|
|
Vector3 lhs = v2 - v0;
|
|
double num = vector.sqrMagnitude;
|
|
double num2 = Vector3.Dot(lhs, vector);
|
|
double num3 = lhs.sqrMagnitude;
|
|
double num4 = Vector3.Dot(vector, rhs);
|
|
double num5 = Vector3.Dot(lhs, rhs);
|
|
double num6 = rhs.sqrMagnitude;
|
|
double num7 = Mathf.Abs((float)num * (float)num3 - (float)num2 * (float)num2);
|
|
double num8 = num2 * num5 - num3 * num4;
|
|
double num9 = num2 * num4 - num * num5;
|
|
double num10;
|
|
if (num8 + num9 <= num7)
|
|
{
|
|
if (num8 < 0.0)
|
|
{
|
|
if (num9 < 0.0)
|
|
{
|
|
if (num4 < 0.0)
|
|
{
|
|
num9 = 0.0;
|
|
if (0.0 - num4 >= num)
|
|
{
|
|
num8 = 1.0;
|
|
num10 = num + 2.0 * num4 + num6;
|
|
}
|
|
else
|
|
{
|
|
num8 = (0.0 - num4) / num;
|
|
num10 = num4 * num8 + num6;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
num8 = 0.0;
|
|
if (num5 >= 0.0)
|
|
{
|
|
num9 = 0.0;
|
|
num10 = num6;
|
|
}
|
|
else if (0.0 - num5 >= num3)
|
|
{
|
|
num9 = 1.0;
|
|
num10 = num3 + 2.0 * num5 + num6;
|
|
}
|
|
else
|
|
{
|
|
num9 = (0.0 - num5) / num3;
|
|
num10 = num5 * num9 + num6;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
num8 = 0.0;
|
|
if (num5 >= 0.0)
|
|
{
|
|
num9 = 0.0;
|
|
num10 = num6;
|
|
}
|
|
else if (0.0 - num5 >= num3)
|
|
{
|
|
num9 = 1.0;
|
|
num10 = num3 + 2.0 * num5 + num6;
|
|
}
|
|
else
|
|
{
|
|
num9 = (0.0 - num5) / num3;
|
|
num10 = num5 * num9 + num6;
|
|
}
|
|
}
|
|
}
|
|
else if (num9 < 0.0)
|
|
{
|
|
num9 = 0.0;
|
|
if (num4 >= 0.0)
|
|
{
|
|
num8 = 0.0;
|
|
num10 = num6;
|
|
}
|
|
else if (0.0 - num4 >= num)
|
|
{
|
|
num8 = 1.0;
|
|
num10 = num + 2.0 * num4 + num6;
|
|
}
|
|
else
|
|
{
|
|
num8 = (0.0 - num4) / num;
|
|
num10 = num4 * num8 + num6;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
double num11 = 1.0 / num7;
|
|
num8 *= num11;
|
|
num9 *= num11;
|
|
num10 = num8 * (num * num8 + num2 * num9 + 2.0 * num4) + num9 * (num2 * num8 + num3 * num9 + 2.0 * num5) + num6;
|
|
}
|
|
}
|
|
else if (num8 < 0.0)
|
|
{
|
|
double num12 = num2 + num4;
|
|
double num13 = num3 + num5;
|
|
if (num13 > num12)
|
|
{
|
|
double num14 = num13 - num12;
|
|
double num15 = num - 2.0 * num2 + num3;
|
|
if (num14 >= num15)
|
|
{
|
|
num8 = 1.0;
|
|
num9 = 0.0;
|
|
num10 = num + 2.0 * num4 + num6;
|
|
}
|
|
else
|
|
{
|
|
num8 = num14 / num15;
|
|
num9 = 1.0 - num8;
|
|
num10 = num8 * (num * num8 + num2 * num9 + 2.0 * num4) + num9 * (num2 * num8 + num3 * num9 + 2.0 * num5) + num6;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
num8 = 0.0;
|
|
if (num13 <= 0.0)
|
|
{
|
|
num9 = 1.0;
|
|
num10 = num3 + 2.0 * num5 + num6;
|
|
}
|
|
else if (num5 >= 0.0)
|
|
{
|
|
num9 = 0.0;
|
|
num10 = num6;
|
|
}
|
|
else
|
|
{
|
|
num9 = (0.0 - num5) / num3;
|
|
num10 = num5 * num9 + num6;
|
|
}
|
|
}
|
|
}
|
|
else if (num9 < 0.0)
|
|
{
|
|
double num12 = num2 + num5;
|
|
double num13 = num + num4;
|
|
if (num13 > num12)
|
|
{
|
|
double num14 = num13 - num12;
|
|
double num15 = num - 2.0 * num2 + num3;
|
|
if (num14 >= num15)
|
|
{
|
|
num9 = 1.0;
|
|
num8 = 0.0;
|
|
num10 = num3 + 2.0 * num5 + num6;
|
|
}
|
|
else
|
|
{
|
|
num9 = num14 / num15;
|
|
num8 = 1.0 - num9;
|
|
num10 = num8 * (num * num8 + num2 * num9 + 2.0 * num4) + num9 * (num2 * num8 + num3 * num9 + 2.0 * num5) + num6;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
num9 = 0.0;
|
|
if (num13 <= 0.0)
|
|
{
|
|
num8 = 1.0;
|
|
num10 = num + 2.0 * num4 + num6;
|
|
}
|
|
else if (num4 >= 0.0)
|
|
{
|
|
num8 = 0.0;
|
|
num10 = num6;
|
|
}
|
|
else
|
|
{
|
|
num8 = (0.0 - num4) / num;
|
|
num10 = num4 * num8 + num6;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
double num14 = num3 + num5 - num2 - num4;
|
|
if (num14 <= 0.0)
|
|
{
|
|
num8 = 0.0;
|
|
num9 = 1.0;
|
|
num10 = num3 + 2.0 * num5 + num6;
|
|
}
|
|
else
|
|
{
|
|
double num15 = num - 2.0 * num2 + num3;
|
|
if (num14 >= num15)
|
|
{
|
|
num8 = 1.0;
|
|
num9 = 0.0;
|
|
num10 = num + 2.0 * num4 + num6;
|
|
}
|
|
else
|
|
{
|
|
num8 = num14 / num15;
|
|
num9 = 1.0 - num8;
|
|
num10 = num8 * (num * num8 + num2 * num9 + 2.0 * num4) + num9 * (num2 * num8 + num3 * num9 + 2.0 * num5) + num6;
|
|
}
|
|
}
|
|
}
|
|
if (num10 < 0.0)
|
|
{
|
|
num10 = 0.0;
|
|
}
|
|
mClosestPoint1.x = v0.x + (float)(num8 * (double)vector.x + num9 * (double)lhs.x);
|
|
mClosestPoint1.y = v0.y + (float)(num8 * (double)vector.y + num9 * (double)lhs.y);
|
|
mClosestPoint1.z = v0.z + (float)(num8 * (double)vector.z + num9 * (double)lhs.z);
|
|
mTriangleBary[1] = (float)num8;
|
|
mTriangleBary[2] = (float)num9;
|
|
mTriangleBary[0] = (float)(1.0 - num8 - num9);
|
|
return (float)num10;
|
|
}
|
|
}
|