2014-10-11 219 views
2

我有一个由网格和三角形定义的三维网格。我也有网格的法线。我想计算网格的面积,假设它总是封闭的。我发现一个有趣的实现3D体积的计算中this question,而且我申请它在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); 
} 

既不是问题也不在文章中我找到了计算网格面积的算法。有没有人可以帮助我?

+0

你是否咨询了其他人的消息?比如任何一种“图书馆”...... – alk 2014-10-11 08:36:09

+0

不,我没有。但是我想以最有效的方式解决问题,并且可能不使用外部库。 – 2014-10-11 08:43:51

+0

;-)有了“*图书馆*”,我的意思是他们收集知识的地方之一,例如在过去堆积书籍...... – alk 2014-10-11 08:50:15

回答

5

你有一个封闭的体积,其表面由三角形组成。所有的三角形都对外表面起作用。对?

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

其中

PQ = Q - P 
PR = R - P 

×表示cross productƟ是向量之间的角度:

PQR之间的三角形的表面可以通过以下方式获得。 (交叉积的向量的大小是两个原始向量之间的平行四边形的面积,其中一半是三角形的面积)。

总和所有三角形的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]]);  
    } 
} 
+0

谢谢M厄姆,我还没有投票,但这是我正在寻找! – 2014-10-11 12:27:58