104 lines
3.1 KiB
C#
104 lines
3.1 KiB
C#
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace XRLib
|
|
{
|
|
public static class Wathf
|
|
{
|
|
/// <summary>
|
|
/// 1.618 : 1 = x : y
|
|
/// ex) standard = 3
|
|
/// result[0] = f(x==standard)
|
|
/// result[1] = f(y==standard)
|
|
/// </summary>
|
|
/// <param name="standard"></param>
|
|
/// <param name="result"></param>
|
|
public static void GoldenRatio(float standard, out float[] result)
|
|
{
|
|
result = new float[2];
|
|
result[0] = standard * 1.618f;
|
|
result[1] = standard * 0.618f;
|
|
}
|
|
|
|
|
|
public static bool GetCrossVector(Vector3[] a, Vector3[] b, ref Vector3 cp)
|
|
{
|
|
if (CrossCheck2D(a, b))
|
|
{
|
|
cp = CrossCheck2DVector(a, b);
|
|
return true;
|
|
}
|
|
cp = Vector3.one * float.MaxValue;
|
|
return false;
|
|
}
|
|
|
|
static Vector3 CrossCheck2DVector(Vector3[] p1, Vector3[] p2)
|
|
{
|
|
Vector3 a = p1[0];
|
|
Vector3 b = p1[1];
|
|
Vector3 c = p2[0];
|
|
Vector3 d = p2[1];
|
|
|
|
float Y = a.y;
|
|
float x1, x2, x3, x4, z1, z2, z3, z4, X, Z;
|
|
|
|
x1 = a.x; z1 = a.z;
|
|
x2 = b.x; z2 = b.z;
|
|
x3 = c.x; z3 = c.z;
|
|
x4 = d.x; z4 = d.z;
|
|
|
|
float cross = ((x1 - x2) * (z3 - z4) - (z1 - z2) * (x3 - x4));
|
|
if (cross == 0 /* parallel */) return new Vector3(10000, 10000, 10000);
|
|
|
|
X = ((x1 * z2 - z1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * z4 - z3 * x4)) / cross;
|
|
Z = ((x1 * z2 - z1 * x2) * (z3 - z4) - (z1 - z2) * (x3 * z4 - z3 * x4)) / cross;
|
|
|
|
return new Vector3(X, Y, Z);
|
|
}
|
|
|
|
static bool CrossCheck2D(Vector3[] p1, Vector3[] p2)
|
|
{
|
|
Vector3 a = p1[0];
|
|
Vector3 b = p1[1];
|
|
Vector3 c = p2[0];
|
|
Vector3 d = p2[1];
|
|
|
|
// (x, Y , z)
|
|
float Y = a.y;
|
|
float x1, x2, x3, x4, z1, z2, z3, z4, X, Z;
|
|
|
|
x1 = a.x; z1 = a.z;
|
|
x2 = b.x; z2 = b.z;
|
|
x3 = c.x; z3 = c.z;
|
|
x4 = d.x; z4 = d.z;
|
|
|
|
float cross = ((x1 - x2) * (z3 - z4) - (z1 - z2) * (x3 - x4));
|
|
if (Mathf.Abs(cross) <0.05f /* parallel */)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
X = ((x1 * z2 - z1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * z4 - z3 * x4)) / cross;
|
|
Z = ((x1 * z2 - z1 * x2) * (z3 - z4) - (z1 - z2) * (x3 * z4 - z3 * x4)) / cross;
|
|
var distance = b - a;
|
|
var legth = d - c;
|
|
|
|
if (distance.normalized == legth.normalized)
|
|
return false;
|
|
|
|
return
|
|
CheckDotInLine(a, b, new Vector3(X, Y, Z))
|
|
&& CheckDotInLine(c, d, new Vector3(X, Y, Z));
|
|
}
|
|
static bool CheckDotInLine(Vector3 a, Vector3 b, Vector3 dot)
|
|
{
|
|
float epsilon = 0.00001f;
|
|
float dAB = Vector3.Distance(a, b);
|
|
float dADot = Vector3.Distance(a, dot);
|
|
float dBDot = Vector3.Distance(b, dot);
|
|
|
|
return ((dAB + epsilon) >= (dADot + dBDot));
|
|
}
|
|
}
|
|
} |