[英]Calculate surface area of a 3D mesh
I have a 3D mesh defined by verteces and triangles. 我有一个由椎骨和三角形定义的3D网格。 I have also normals of the mesh. 我也有网格的法线。 I'd like to calculate the area of the mesh, assuming it's always closed. 我想计算网格的面积,假设它总是关闭的。 I found an interesting implementation of calculation of the 3D volume in this question , and I applied it in a C code to build a function called by R. This is the code: 我在这个问题中发现了一个有趣的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);
}
Neither in the question nor in the article linked I found the algorithm for calculating the Area of the mesh. 无论是在问题还是链接的文章中,我都找不到用于计算网格面积的算法。 Is there anybody can help me please? 有人可以帮我吗?
You have a closed volume whose surface is made up by triangles. 你有一个封闭的体积,其表面由三角形组成。 And all triangles contribute to the outer surface. 并且所有三角形都有助于外表面。 right? 对?
The surface of a triangle between points P
, Q
and R
can be obtained by: 点P
, Q
和R
之间的三角形表面可以通过以下方式获得:
A = 0.5 * |PQ × PR|
= 0.5 * |PQ| * |PR| * sin(Ɵ)
where 哪里
PQ = Q - P
PR = R - P
and ×
denotes the cross product and Ɵ
is the angle between the vectors. ×
表示叉积 , Ɵ
是矢量之间的角度。 (The magnitude of the resulting vector of a cross product is the area of a parallelogramme between the two original vectors. Half of that is the area of a triangle.) (交叉乘积的结果矢量的大小是两个原始矢量之间的平行四边形的面积。其中一半是三角形的面积。)
Sum the aeras of all triangles. 求和所有三角形的aeras。 There's no need to take the absolute value, because the area can only be zero or positive. 没有必要采用绝对值,因为该区域只能为零或正。 So: 所以:
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]]);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.