Tanoda
Math.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using UnityEngine;
4
5namespace Es.InkPainter
6{
7 public static class Math
8 {
9 private const float TOLERANCE = 1E-2f;
10
20 public static bool ExistPointInPlane(Vector3 p, Vector3 t1, Vector3 t2, Vector3 t3)
21 {
22 var v1 = t2 - t1;
23 var v2 = t3 - t1;
24 var vp = p - t1;
25
26 var nv = Vector3.Cross(v1, v2);
27 var val = Vector3.Dot(nv.normalized, vp.normalized);
28 if (-TOLERANCE < val && val < TOLERANCE)
29 return true;
30 return false;
31 }
32
40 public static bool ExistPointOnEdge(Vector3 p, Vector3 v1, Vector3 v2)
41 {
42 return 1 - TOLERANCE < Vector3.Dot((v2 - p).normalized, (v2 - v1).normalized);
43 }
44
53 public static bool ExistPointOnTriangleEdge(Vector3 p, Vector3 t1, Vector3 t2, Vector3 t3)
54 {
55 if (ExistPointOnEdge(p, t1, t2) || ExistPointOnEdge(p, t2, t3) || ExistPointOnEdge(p, t3, t1))
56 return true;
57 return false;
58 }
59
69 public static bool ExistPointInTriangle(Vector3 p, Vector3 t1, Vector3 t2, Vector3 t3)
70 {
71 var a = Vector3.Cross(t1 - t3, p - t1).normalized;
72 var b = Vector3.Cross(t2 - t1, p - t2).normalized;
73 var c = Vector3.Cross(t3 - t2, p - t3).normalized;
74
75 var d_ab = Vector3.Dot(a, b);
76 var d_bc = Vector3.Dot(b, c);
77
78 if (1 - TOLERANCE < d_ab && 1 - TOLERANCE < d_bc)
79 return true;
80 return false;
81 }
82
96 public static Vector2 TextureCoordinateCalculation(Vector3 p, Vector3 t1, Vector2 t1UV, Vector3 t2,
97 Vector2 t2UV, Vector3 t3, Vector2 t3UV, Matrix4x4 transformMatrix)
98 {
99 var p1_p = transformMatrix * new Vector4(t1.x, t1.y, t1.z, 1);
100 var p2_p = transformMatrix * new Vector4(t2.x, t2.y, t2.z, 1);
101 var p3_p = transformMatrix * new Vector4(t3.x, t3.y, t3.z, 1);
102 var p_p = transformMatrix * new Vector4(p.x, p.y, p.z, 1);
103 var p1_n = new Vector2(p1_p.x, p1_p.y) / p1_p.w;
104 var p2_n = new Vector2(p2_p.x, p2_p.y) / p2_p.w;
105 var p3_n = new Vector2(p3_p.x, p3_p.y) / p3_p.w;
106 var p_n = new Vector2(p_p.x, p_p.y) / p_p.w;
107 var s = 0.5f * ((p2_n.x - p1_n.x) * (p3_n.y - p1_n.y) - (p2_n.y - p1_n.y) * (p3_n.x - p1_n.x));
108 var s1 = 0.5f * ((p3_n.x - p_n.x) * (p1_n.y - p_n.y) - (p3_n.y - p_n.y) * (p1_n.x - p_n.x));
109 var s2 = 0.5f * ((p1_n.x - p_n.x) * (p2_n.y - p_n.y) - (p1_n.y - p_n.y) * (p2_n.x - p_n.x));
110 var u = s1 / s;
111 var v = s2 / s;
112 var w = 1 / ((1 - u - v) * 1 / p1_p.w + u * 1 / p2_p.w + v * 1 / p3_p.w);
113 return w * ((1 - u - v) * t1UV / p1_p.w + u * t2UV / p2_p.w + v * t3UV / p3_p.w);
114 }
115
124 public static Vector3[] GetNearestVerticesTriangle(Vector3 p, Vector3[] vertices, int[] triangles)
125 {
126 var ret = new List<Vector3>();
127
128 var nearestIndex = triangles[0];
129 var nearestDistance = Vector3.Distance(vertices[nearestIndex], p);
130
131 for (var i = 0; i < vertices.Length; ++i)
132 {
133 var distance = Vector3.Distance(vertices[i], p);
134 if (distance < nearestDistance)
135 {
136 nearestDistance = distance;
137 nearestIndex = i;
138 }
139 }
140
141 for (var i = 0; i < triangles.Length; ++i)
142 if (triangles[i] == nearestIndex)
143 {
144 var m = i % 3;
145 int i0 = i, i1 = 0, i2 = 0;
146 switch (m)
147 {
148 case 0:
149 i1 = i + 1;
150 i2 = i + 2;
151 break;
152
153 case 1:
154 i1 = i - 1;
155 i2 = i + 1;
156 break;
157
158 case 2:
159 i1 = i - 1;
160 i2 = i - 2;
161 break;
162
163 default:
164 break;
165 }
166
167 ret.Add(vertices[triangles[i0]]);
168 ret.Add(vertices[triangles[i1]]);
169 ret.Add(vertices[triangles[i2]]);
170 }
171
172 return ret.ToArray();
173 }
174
183 public static Vector3 TriangleSpaceProjection(Vector3 p, Vector3 t1, Vector3 t2, Vector3 t3)
184 {
185 var g = (t1 + t2 + t3) / 3;
186 var pa = t1 - p;
187 var pb = t2 - p;
188 var pc = t3 - p;
189 var ga = t1 - g;
190 var gb = t2 - g;
191 var gc = t3 - g;
192
193 var _pa_ = pa.magnitude;
194 var _pb_ = pb.magnitude;
195 var _pc_ = pc.magnitude;
196
197 var lmin = Mathf.Min(Mathf.Min(_pa_, _pb_), _pc_);
198
199 Func<float, float, float> k = (t, u) => (t - lmin + u - lmin) / 2;
200
201 var A = k(_pb_, _pc_);
202 var B = k(_pc_, _pa_);
203 var C = k(_pa_, _pb_);
204 var pd = g + (ga * A + gb * B + gc * C);
205 return pd;
206 }
207 }
208}
Es.InkPainter.Math Math
Definition: PaintTest.cs:7