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