三维几何-多面体

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

 

 

    原文作者:算法
    原文地址: https://www.twblogs.net/a/5bd3a0582b717778ac209be2
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞