三維幾何-多面體

多面體是指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;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章