C语言 计算 3D 网格的表面积



我有一个由顶点和三角形定义的3D网格。我也有网格的法线。我想计算网格的面积,假设它总是闭合的。我在这个问题中发现了一个有趣的 3D 体积计算实现,我将其应用于 C 代码中以构建一个由 R 调用的函数。这是代码:

double SignedVolumeOfTriangle(double p1X, double p1Y, double p1Z, 
        double p2X, double p2Y, double p2Z, double p3X, double p3Y, double p3Z) {
    double v321 = p3X*p2Y*p1Z;
    double v231 = p2X*p3Y*p1Z;
    double v312 = p3X*p1Y*p2Z;
    double v132 = p1X*p3Y*p2Z;
    double v213 = p2X*p1Y*p3Z;
    double v123 = p1X*p2Y*p3Z;
    return (double)(1.0/6.0)*(-v321 + v231 + v312 - v132 - v213 + v123);
}
void MeshVolume(double *X, double *Y, double *Z, int *numT, int *V1, int *V2, int *V3, double *Volume) {
    int n;          
    *Volume=0;      
    for (n=0; n<*numT; n++) {
        *Volume = *Volume + SignedVolumeOfTriangle(X[V1[n]], Y[V1[n]], Z[V1[n]], X[V2[n]], Y[V2[n]], Z[V2[n]], X[V3[n]], Y[V3[n]], Z[V3[n]]);       
    }
    *Volume = fabs(*Volume);
}

无论是在问题中还是在链接的文章中,我都没有找到计算网格面积的算法。有人可以帮助我吗?

您有一个闭合体积,其表面由三角形组成。所有三角形都有助于外表面。右?

PQ点和点R之间的三角形曲面可以通过下式获得:

A = 0.5 * |PQ × PR|
  = 0.5 * |PQ| * |PR| * sin(Ɵ)

哪里

PQ = Q - P
PR = R - P

×表示叉积,Ɵ表示向量之间的角度。(交叉积的结果向量的大小是两个原始向量之间的平行四边形的面积。其中一半是三角形的面积。

对所有三角形的 aeras 求和。无需取绝对值,因为面积只能为零或正数。所以:

double AreaOfTriangle(double p1X, double p1Y, double p1Z, 
        double p2X, double p2Y, double p2Z,
        double p3X, double p3Y, double p3Z)
{
    double ax = p2x - p1x;
    double ay = p2y - p1y;
    double az = p2z - p1z;
    double bx = p3x - p1x;
    double by = p3y - p1y;
    double bz = p3z - p1z;
    double cx = ay*bz - az*by;
    double cy = az*bx - ax*bz;
    double cz = ax*by - ay*bx;
    return 0.5 * sqrt(cx*cx + cy*cy + cz*cz);
}    
void MeshSurface(double *X, double *Y, double *Z,
    int *numT, int *V1, int *V2, int *V3, double *Area)
{
    int n;
    *Area = 0.0;
    for (n=0; n<*numT; n++) {
        *Area += AreaOfTriangle(X[V1[n]], Y[V1[n]], Z[V1[n]],
            X[V2[n]], Y[V2[n]], Z[V2[n]],
            X[V3[n]], Y[V3[n]], Z[V3[n]]);       
    }
}

最新更新