多面體是指4個或者是4個以上多邊形所圍城的立體。在傳統意義上,它是一個三維的多胞形,而在更新的意義上它是任何維度的多胞形的有界或無界推廣。
四面體的體積。已知四邊形的4個頂點A,B,C,D。根據叉積和點積的定義不難得出四面體的帶符號體積爲
V=1/3 *S*h = 1/6(AB * AC) *h = 1/6 ((AB*AC) *AD)
其中AB,AC,AD呈右手系時爲正。括號內的部分也稱爲混合積。
右手系:把右手放在原點的位置,使大拇指,食指和中指互成直角,把大拇指指向x軸的正方向,食指指向y軸的正方向時,中指所指的方向就是z軸的正方向。
返回AB,AC,AD的混合積,它等於四面體ABCD的有向體積的6倍。
double Volume6(const Point3 &A, const Point3 &B, const Point3 &C, const Point3 &D)
{
return Dot(D-A, Cross(B-A, C-A));
}
多面體的體積。平面多邊形的面積等於三角形的有向面積之和。空間多面體也類似。不過首先需要規定好多面體的存儲方式。一種簡答你的表示法是點-面,即一個頂點數組V和麪數組F。其中V裏保存着各個頂點的空間座標,而F數組保存這各個面的3個頂點在V數組中的索引。
簡單起見,假設各個面都是三角形,且3個點由右手定則確定的方向指向多邊形的外部(即從外部看,3個頂點呈逆時針排列),所以這些面上3個點的排列順序並不是任意的。
四面體頂點到底面ABC的距離:
Volume6 / Area2(A,B,C)
求多面體的重心:
隨便找一個位於內部的點,連接該點和各個面,得到若干個三棱錐,把每個三棱錐等價成一個質點,再求這些質點的重心,質點的重心是質點座標按照質量加權的平均數。而質量均勻的三棱錐的重心的座標爲4個頂點座標的平均數。
質量均勻的三棱錐的重心的座標:
Point3 Centroid(const Point3 &A, const Point3 &B, const Point3 &C, const Point3 &D)
{
return (A + B + C + D) / 4.0;
}
求多面體的重心:
注意一點,取體積的時候用了負值,爲什麼? 因爲取的D點是在多面體內部,所以得到的體積爲負值,所以加上負號取得正值。
Point3 centroid(Point3 *P, int n, vector<Face> faces)
{
Point3 tot, A, B, C, D;
double totv, v;
int i;
D = P[0];
totv = 0;
for(i = 0; i < faces.size(); i++)
{
A = P[faces[i].v[0]];
B = P[faces[i].v[1]];
C = P[faces[i].v[2]];
v = -Volume6(A, B, C, D);
totv += v;
tot = tot + Centroid(A, B, C, D)*v;
}
return tot / totv;
}