0%

重心坐标插值(Barycentric Interpolation)

用来插值

线段的重心坐标插值

三角形重心坐标插值

点$P$在$\triangle ABC$组成的三角形内

求点$P$的重心坐标插值$(\alpha,\beta,\gamma)$

面积

三角形的重心坐标 $\alpha = \beta = \gamma = 1 / 3$

三维四面体的重心坐标插值

  • 四面体的重心坐标

  • 求点$P$的重心坐标插值$(\alpha,\beta,\gamma,\delta)$

    体积

  • 点P是否在四面体内部

阅读全文 »

三角形插值(重心坐标)

点$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

阅读全文 »

三角形的重心


三角形重心是三角形三条中线的交点。当几何体为匀质物体时,重心与形心重合。

1、重心到顶点的距离与重心到对边中点的距离之比为2:1。

2、重心和三角形3个顶点组成的3个三角形面积相等。

3、重心到三角形3个顶点距离平方的和最小。 (等边三角形)

4、在平面直角坐标系中,重心的坐标是顶点坐标的算术平均数.

5、三角形内到三边距离之积最大的点。

6、在△ABC中,若MA向量+MB向量+MC向量=0(向量) ,则M点为△ABC的重心,反之也成立。

7、设△ABC重心为G点,所在平面有一点O,则向量OG=1/3(向量OA+向量OB+向量OC)。

阅读全文 »