5

I have a 3D mesh defined by verteces and triangles. 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:

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?

Community
  • 1
  • 1
Nicola Dinapoli
  • 207
  • 2
  • 7
  • Did you consult any others source? Like for example any kind a "library" ... – alk Oct 11 '14 at 08:36
  • No, I didn't it yet. But I would to solve the problem in the most efficient (and short) way possibly without using external libraries. – Nicola Dinapoli Oct 11 '14 at 08:43
  • ;-) With "*library*" I meant one of those places where they collect knowlegde, for example by piling up books in the old days ... – alk Oct 11 '14 at 08:50
  • 1
    :-D I'm a medical doctor so... "libraries" that I'm used to attend talk about medicine, anatomy, physiology etc... – Nicola Dinapoli Oct 11 '14 at 08:52
  • Try googling your question's title literally and you'll find quiet some references, then come back with your approach, and tell us the problems you are facing, if any ... – alk Oct 11 '14 at 08:56

1 Answers1

11

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:

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. 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]]);       
    }
}
M Oehm
  • 28,726
  • 3
  • 31
  • 42