三角形插值(重心坐标)
点$P$在$\triangle ABC$组成的三角形内
求点$P$的插值$\alpha,\beta,\gamma$
先求出$\vec{AP}$与$\vec{BC}$的交点$A^,$
然后计算$\alpha,\beta,\gamma$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| float* lt::InterpolationTriangle(Vector2<float> p, Vector2<float> a, Vector2<float> b, Vector2<float> c) { Vector2<float> a1b1 = p - a; Vector2<float> a2b2 = c - b; Vector2<float> a2a1 = a - b; Vector2<float> a1a2 = b - a; float u = (a2b2.x * a2a1.y - a2a1.x * a2b2.y) / (a1b1.x * a2b2.y - a2b2.x * a1b1.y); Vector2<float> aintersected = a + a1b1 * u;
float arr[3]; arr[0] = (p - a).magnitude() / (aintersected - a).magnitude(); arr[1] = (aintersected - p).magnitude() / (aintersected - a).magnitude() * (aintersected - b).magnitude() / (c-b).magnitude(); arr[2] = (aintersected - p).magnitude() / (aintersected - a).magnitude() * (c - aintersected).magnitude() / (c - b).magnitude(); return arr; }
|
重心法(质心)
显然,无论是线性插值还是双线性插值的都无法解决这个问题。而使用重心坐标则可以很好的解决这个问题。简单的来说,重心坐标就是子三角形与大三角形的面积比,具体的解释参看维基百科,计算过程如下:
已知三角形的三个顶点坐标P1, P2, P3, 在三角形内的任意点P, 都存在u和v(由于三角形是一个2D图形,只有两个自由度,所以只要u和v即可),使得
P = (1 - u - v) P1 + u P2 + v * P3