Branch data Line data Source code
1 : : #include "std.h"
2 : : #include <stdlib.h>
3 : : #include <limits>
4 : :
5 : : #include "3D.h"
6 : : ////////////////////////////////////////////////////////////////////////.
7 : : //
8 : : // class: Bounds
9 : : //
10 : :
11 : 0 : void Bounds::reset()
12 : : {
13 : 0 : min[X] = min[Y] = min[Z] = std::numeric_limits<double>::max();
14 : 0 : max[X] = max[Y] = max[Z] = std::numeric_limits<double>::min();
15 : :
16 : 0 : center[X] = center[Y] = center[Z] = 0.0;
17 : 0 : radius = 0.0;
18 : :
19 : 0 : points = 0;
20 : 0 : }
21 : :
22 : 0 : void Bounds::addPoint(const Vec3& v)
23 : : {
24 [ # # ]: 0 : if( v[X] < min[X] ) min[X] = v[X];
25 [ # # ]: 0 : if( v[Y] < min[Y] ) min[Y] = v[Y];
26 [ # # ]: 0 : if( v[Z] < min[Z] ) min[Z] = v[Z];
27 : :
28 [ # # ]: 0 : if( v[X] > max[X] ) max[X] = v[X];
29 [ # # ]: 0 : if( v[Y] > max[Y] ) max[Y] = v[Y];
30 [ # # ]: 0 : if( v[Z] > max[Z] ) max[Z] = v[Z];
31 : :
32 : :
33 : 0 : center += v;
34 : :
35 : 0 : points++;
36 : 0 : }
37 : :
38 : 0 : void Bounds::complete()
39 : : {
40 [ # # ]: 0 : center /= (double)points;
41 : :
42 [ # # ]: 0 : Vec3 R1 = max-center;
43 [ # # ]: 0 : Vec3 R2 = min-center;
44 [ # # ]: 0 : double r1=length(R1);
45 [ # # ]: 0 : double r2=length(R2);
46 [ # # ]: 0 : radius = (r1>r2)?r1:r2; // max (r1, r2)
47 : 0 : }
48 : :
49 : :
50 : :
51 : : ////////////////////////////////////////////////////////////////////////
52 : : //
53 : : // class: Plane
54 : : //
55 : :
56 : 60000 : void Plane::calcFrom(const Vec3& p1, const Vec3& p2, const Vec3& p3)
57 : : {
58 [ + - ]: 60000 : Vec3 v1 = p2-p1;
59 [ + - ]: 60000 : Vec3 v2 = p3-p1;
60 : :
61 [ + - ][ + - ]: 60000 : n = v1 ^ v2;
62 [ + - ]: 60000 : unitize(n);
63 : :
64 [ + - ][ + - ]: 60000 : d = -n*p1;
65 : 60000 : }
66 : :
67 : 0 : void Plane::calcFrom(const array<Vec3>& verts)
68 : : {
69 : 0 : n[X] = n[Y] = n[Z] = 0.0;
70 : :
71 : : int i;
72 [ # # ]: 0 : for(i=0; i<verts.length()-1; i++)
73 : : {
74 : 0 : const Vec3& cur = verts[i];
75 : 0 : const Vec3& next = verts[i+1];
76 : :
77 : 0 : n[X] += (cur[Y] - next[Y]) * (cur[Z] + next[Z]);
78 : 0 : n[Y] += (cur[Z] - next[Z]) * (cur[X] + next[X]);
79 : 0 : n[Z] += (cur[X] - next[X]) * (cur[Y] + next[Y]);
80 : : }
81 : :
82 : 0 : const Vec3& cur = verts[verts.length()-1];
83 : 0 : const Vec3& next = verts[0];
84 : 0 : n[X] += (cur[Y] - next[Y]) * (cur[Z] + next[Z]);
85 : 0 : n[Y] += (cur[Z] - next[Z]) * (cur[X] + next[X]);
86 : 0 : n[Z] += (cur[X] - next[X]) * (cur[Y] + next[Y]);
87 : :
88 : 0 : unitize(n);
89 : :
90 [ # # ]: 0 : d = -n*verts[0];
91 [ + - ][ + - ]: 1872 : }
92 : :
93 : :
|