source: GTP/trunk/Lib/Geom/shared/GTGeometry/src/libs/vmi/src/area.cpp @ 983

Revision 983, 2.1 KB checked in by gumbau, 18 years ago (diff)
Line 
1#include <stdio.h>
2#include <math.h>
3
4#include "../include/area.h"
5
6using namespace VMI;
7
8/*
9   m00 m01 m02
10   m10 m11 m12
11   m20 m21 m22
12   
13   |a1 a2 a3|
14   |b1 b2 b3| = a1b2c3 - a1b3c2 - a2b1c3 + a2b3c1 + a3b1c2 - a3b2c1
15   |c1 c2 c3|
16*/
17// Compute the determinant of a 3x3 matrix
18double VMI::computeMatDet(double m[3][3]) {
19    return ((m[0][0] * m[1][1] * m[2][2]) - (m[0][0] * m[1][2] * m[2][1]) - (m[0][1] * m[1][0] * m[2][2]) +
20            (m[0][1] * m[1][2] * m[2][0]) + (m[0][2] * m[1][0] * m[2][1]) - (m[0][2] * m[1][1] * m[2][0]));
21}
22/*
23   v00 x1
24   v01 y1
25   v02 z1
26
27   v10 x2
28   v11 y2
29   v12 z2
30
31   v20 x3
32   v21 y3
33   v22 z3
34                  |y1 z1 1|       |z1 x1 1|       |x1 y1 1|
35   A = 1/2 sqrt( (|y2 z2 1|)^2 + (|z2 x2 1|)^2 + (|x2 y2 1|)^2 )
36                  |y3 z3 1|       |z3 x3 1|       |x3 y3 1|
37*/
38// Compute the area of a 3D triangle
39double VMI::triangleArea(double v0[3], double v1[3], double v2[3]) {
40    double m0[3][3], m1[3][3], m2[3][3],
41           area, part0, part1, part2,
42           d0, d1, d2;
43    int i;
44   
45    for (i=0; i<3; i++) {
46       
47        m0[i][2] = 1.0;
48        m1[i][2] = 1.0;
49        m2[i][2] = 1.0;
50    }
51    // m0
52    m0[0][0] = v0[1];
53    m0[1][0] = v1[1];
54    m0[2][0] = v2[1];
55
56    m0[0][1] = v0[2];
57    m0[1][1] = v1[2];
58    m0[2][1] = v2[2];
59
60    // m1
61    m1[0][0] = v0[2];
62    m1[1][0] = v1[2];
63    m1[2][0] = v2[2];
64
65    m1[0][1] = v0[0];
66    m1[1][1] = v1[0];
67    m1[2][1] = v2[0];
68
69    // m2
70    m2[0][0] = v0[0];
71    m2[1][0] = v1[0];
72    m2[2][0] = v2[0];
73
74    m2[0][1] = v0[1];
75    m2[1][1] = v1[1];
76    m2[2][1] = v2[1];
77
78    d0 = computeMatDet(m0);
79    d1 = computeMatDet(m1);
80    d2 = computeMatDet(m2);
81   
82    part0 = d0 * d0;
83    part1 = d1 * d1;
84    part2 = d2 * d2;
85   
86    area = sqrt(part0 + part1 + part2) / 2.0;
87   
88    return area;
89}
90/*
91int main (int argc, char **argv) {
92    double v0[] = {0.0, 0.0, 0.0},
93           v1[] = {4.0, 4.0, 0.0},
94           v2[] = {4.0, 0.0, 0.0},
95           m[3][3] = {1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0};
96   
97    printf("Det: %f\n", computeMatDet(m));
98   
99    printf("Area: %f\n", triangleArea(v0, v1, v2));
100   
101    getchar();
102    return 0;
103}
104*/
Note: See TracBrowser for help on using the repository browser.