1 | #include <stdio.h> |
---|
2 | #include <math.h> |
---|
3 | |
---|
4 | #include "../include/area.h" |
---|
5 | |
---|
6 | using 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 |
---|
18 | double 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 |
---|
39 | double 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 | /* |
---|
91 | int 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 | */ |
---|