我有一个由椎骨和三角形定义的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); }
无论是在问题还是链接的文章中,我都找不到用于计算网格面积的算法。 有人可以帮我吗?
你有一个封闭的体积,其表面由三角形组成。 并且所有三角形都有助于外表面。 对?
点P
, Q
和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]]); } }
以上就是c/c++开发分享计算3D网格的表面积相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/559696.html