using UnityEditor;
using UnityEngine;
namespace XRLib
{
public static class Wathf
{
///
/// 1.618 : 1 = x : y
/// ex) standard = 3
/// result[0] = f(x==standard)
/// result[1] = f(y==standard)
///
///
///
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));
}
}
}