Commit d06d3dbd9dcc66207034c717ea2965dd3e295c53
1 parent
035d798f
stable, pre-major changes
Showing
3 changed files
with
339 additions
and
255 deletions
Show diff stats
stim/gl/gl_spider.h
... | ... | @@ -81,8 +81,8 @@ class gl_spider : public virtual gl_texture<T> |
81 | 81 | int numSamplesPos; |
82 | 82 | int numSamplesMag; |
83 | 83 | |
84 | -// float stepsize = 4.0; //Step size. | |
85 | - float stepsize = 3.0; //Step size. | |
84 | + float stepsize = 5.0; //Step size. | |
85 | +// float stepsize = 3.0; //Step size. | |
86 | 86 | int current_cost; //variable to store the cost of the current step. |
87 | 87 | |
88 | 88 | |
... | ... | @@ -140,11 +140,12 @@ class gl_spider : public virtual gl_texture<T> |
140 | 140 | setMatrix(); //create the transformation matrix. |
141 | 141 | glCallList(dList+1); //move the templates to p, d, m. |
142 | 142 | int best = getCost(ptexbufferID, numSamplesPos); //find min cost. |
143 | + std::cerr << best << std::endl; | |
143 | 144 | stim::vec<float> next( //find next position. |
144 | - pV[best][0], | |
145 | - pV[best][1], | |
146 | - pV[best][2], | |
147 | - 1); | |
145 | + pV[best][0], | |
146 | + pV[best][1], | |
147 | + pV[best][2], | |
148 | + 1); | |
148 | 149 | next = cT*next; //find next position. |
149 | 150 | setPosition( |
150 | 151 | next[0]*S[0]*R[0], |
... | ... | @@ -727,7 +728,7 @@ class gl_spider : public virtual gl_texture<T> |
727 | 728 | ///Best results if samples is can create a perfect root. |
728 | 729 | ///Default Constructor |
729 | 730 | gl_spider |
730 | - (int samples = 1089, int samplespos = 400,int samplesmag = 144) | |
731 | + (int samples = 1089, int samplespos = 441,int samplesmag = 144) | |
731 | 732 | { |
732 | 733 | p = vec<float>(0.0, 0.0, 0.0); |
733 | 734 | d = vec<float>(0.0, 0.0, 1.0); |
... | ... | @@ -750,7 +751,7 @@ class gl_spider : public virtual gl_texture<T> |
750 | 751 | ///@param int samples, number of templates this spider is going to use. |
751 | 752 | gl_spider |
752 | 753 | (float pos_x, float pos_y, float pos_z, float dir_x, float dir_y, float dir_z, |
753 | - float mag_x, int numsamples = 1089, int numsamplespos = 400, int numsamplesmag =144) | |
754 | + float mag_x, int numsamples = 1089, int numsamplespos = 441, int numsamplesmag =144) | |
754 | 755 | { |
755 | 756 | p = vec<float>(pos_x, pos_y, pos_z); |
756 | 757 | d = vec<float>(dir_x, dir_y, dir_z); |
... | ... | @@ -768,7 +769,7 @@ class gl_spider : public virtual gl_texture<T> |
768 | 769 | ///@param float mag, size of the vector. |
769 | 770 | ///@param int samples, number of templates this spider is going to use. |
770 | 771 | gl_spider |
771 | - (stim::vec<float> pos, stim::vec<float> dir, float mag, int samples = 1089, int samplesPos = 400, int samplesMag = 144) | |
772 | + (stim::vec<float> pos, stim::vec<float> dir, float mag, int samples = 1089, int samplesPos = 441, int samplesMag = 144) | |
772 | 773 | { |
773 | 774 | p = pos; |
774 | 775 | d = dir; |
... | ... | @@ -815,13 +816,13 @@ class gl_spider : public virtual gl_texture<T> |
815 | 816 | glListBase(dList); |
816 | 817 | Bind(texbufferID, fboID, numSamples); |
817 | 818 | genDirectionVectors(5*M_PI/4); |
818 | -// Unbind(); | |
819 | - Bind(ptexbufferID, bfboID, numSamplesPos); | |
819 | + Unbind(); | |
820 | + Bind(ptexbufferID, pfboID, numSamplesPos); | |
820 | 821 | genPositionVectors(); |
821 | -// Unbind(); | |
822 | + Unbind(); | |
822 | 823 | Bind(mtexbufferID, mfboID, numSamplesMag); |
823 | 824 | genMagnitudeVectors(); |
824 | -// Unbind(); | |
825 | + Unbind(); | |
825 | 826 | Bind(btexbufferID, bfboID, 27); |
826 | 827 | DrawCylinder(); |
827 | 828 | Unbind(); |
... | ... | @@ -1150,13 +1151,13 @@ class gl_spider : public virtual gl_texture<T> |
1150 | 1151 | start = std::clock(); |
1151 | 1152 | #endif |
1152 | 1153 | findOptimalDirection(); |
1153 | - //Unbind(); | |
1154 | + Unbind(); | |
1154 | 1155 | Bind(ptexbufferID, pfboID, numSamplesPos); |
1155 | 1156 | findOptimalPosition(); |
1156 | - //Unbind(); | |
1157 | + Unbind(); | |
1157 | 1158 | Bind(mtexbufferID, mfboID, numSamplesMag); |
1158 | 1159 | findOptimalScale(); |
1159 | - //Unbind(); | |
1160 | + Unbind(); | |
1160 | 1161 | CHECK_OPENGL_ERROR |
1161 | 1162 | |
1162 | 1163 | #ifdef TESTING |
... | ... | @@ -1566,7 +1567,9 @@ class gl_spider : public virtual gl_texture<T> |
1566 | 1567 | } |
1567 | 1568 | else { |
1568 | 1569 | cL.push_back(stim::vec<float>(p[0], p[1],p[2])); |
1569 | - cM.push_back(m[0]); | |
1570 | + cM.push_back(stim::vec<float>(m[0], m[0])); | |
1571 | +// cM.push_back(m[0]); | |
1572 | + | |
1570 | 1573 | sk.TexCoord(m[0]); |
1571 | 1574 | sk.Vertex(p[0], p[1], p[2]); |
1572 | 1575 | Bind(btexbufferID, bfboID, 27); | ... | ... |
stim/math/plane.h
1 | -#ifndef RTS_PLANE_H | |
2 | -#define RTS_PLANE_H | |
1 | +#ifndef STIM_PLANE_H | |
2 | +#define STIM_PLANE_H | |
3 | 3 | |
4 | 4 | #include <iostream> |
5 | 5 | #include <stim/math/vector.h> |
6 | -#include "rts/cuda/callable.h" | |
6 | +#include <stim/cuda/cudatools/callable.h> | |
7 | +#include <stim/math/quaternion.h> | |
7 | 8 | |
8 | 9 | |
9 | -namespace stim{ | |
10 | -template <typename T, int D> class plane; | |
10 | +namespace stim | |
11 | +{ | |
12 | +template<typename T> class plane; | |
11 | 13 | } |
12 | 14 | |
13 | -template <typename T, int D> | |
14 | -CUDA_CALLABLE stim::plane<T, D> operator-(stim::plane<T, D> v); | |
15 | - | |
16 | -namespace stim{ | |
17 | - | |
18 | -template <class T, int D = 3> | |
19 | -class plane{ | |
20 | - | |
21 | - //a plane is defined by a point and a normal | |
22 | - | |
23 | -private: | |
24 | - | |
25 | - vec<T, D> P; //point on the plane | |
26 | - vec<T, D> N; //plane normal | |
27 | - | |
28 | - CUDA_CALLABLE void init(){ | |
29 | - P = vec<T, D>(0, 0, 0); | |
30 | - N = vec<T, D>(0, 0, 1); | |
31 | - } | |
32 | - | |
33 | - | |
34 | -public: | |
35 | - | |
36 | - //default constructor | |
37 | - CUDA_CALLABLE plane(){ | |
38 | - init(); | |
39 | - } | |
15 | +template<typename T> | |
16 | +CUDA_CALLABLE stim::plane<T> operator-(stim::plane<T> v); | |
17 | + | |
18 | +namespace stim | |
19 | +{ | |
20 | + | |
21 | +template <typename T> | |
22 | +class plane | |
23 | +{ | |
24 | + protected: | |
25 | + stim::vec<T> P; | |
26 | + stim::vec<T> N; | |
27 | + stim::vec<T> U; | |
28 | + | |
29 | + ///Initializes the plane with standard coordinates. | |
30 | + /// | |
31 | + CUDA_CALLABLE void init() | |
32 | + { | |
33 | + P = stim::vec<T>(0, 0, 0); | |
34 | + N = stim::vec<T>(0, 0, 1); | |
35 | + U = stim::vec<T>(1, 0, 0); | |
36 | + } | |
37 | + | |
38 | + public: | |
40 | 39 | |
41 | - CUDA_CALLABLE plane(vec<T, D> n, vec<T, D> p = vec<T, D>(0, 0, 0)){ | |
42 | - P = p; | |
43 | - N = n.norm(); | |
44 | - } | |
45 | - | |
46 | - CUDA_CALLABLE plane(T z_pos){ | |
47 | - init(); | |
48 | - P[2] = z_pos; | |
49 | - } | |
50 | - | |
51 | - //create a plane from three points (a triangle) | |
52 | - CUDA_CALLABLE plane(vec<T, D> a, vec<T, D> b, vec<T, D> c){ | |
53 | - P = c; | |
54 | - N = (c - a).cross(b - a); | |
55 | - if(N.len() == 0) //handle the degenerate case when two vectors are the same, N = 0 | |
56 | - N = 0; | |
57 | - else | |
58 | - N = N.norm(); | |
59 | - } | |
60 | - | |
61 | - template< typename U > | |
62 | - CUDA_CALLABLE operator plane<U, D>(){ | |
63 | - | |
64 | - plane<U, D> result(N, P); | |
65 | - return result; | |
66 | - } | |
67 | - | |
68 | - CUDA_CALLABLE vec<T, D> norm(){ | |
69 | - return N; | |
70 | - } | |
71 | - | |
72 | - CUDA_CALLABLE vec<T, D> p(){ | |
73 | - return P; | |
74 | - } | |
75 | - | |
76 | - //flip the plane front-to-back | |
77 | - CUDA_CALLABLE plane<T, D> flip(){ | |
78 | - plane<T, D> result = *this; | |
79 | - result.N = -result.N; | |
80 | - return result; | |
81 | - } | |
82 | - | |
83 | - //determines how a vector v intersects the plane (1 = intersects front, 0 = within plane, -1 = intersects back) | |
84 | - CUDA_CALLABLE int face(vec<T, D> v){ | |
85 | - | |
86 | - T dprod = v.dot(N); //get the dot product between v and N | |
87 | - | |
88 | - //conditional returns the appropriate value | |
89 | - if(dprod < 0) | |
90 | - return 1; | |
91 | - else if(dprod > 0) | |
92 | - return -1; | |
93 | - else | |
94 | - return 0; | |
95 | - } | |
96 | - | |
97 | - //determine on which side of the plane a point lies (1 = front, 0 = on the plane, -1 = back) | |
98 | - CUDA_CALLABLE int side(vec<T, D> p){ | |
99 | - | |
100 | - vec<T, D> v = p - P; //get the vector from P to the query point p | |
101 | - | |
102 | - return face(v); | |
103 | - } | |
104 | - | |
105 | - //compute the component of v that is perpendicular to the plane | |
106 | - CUDA_CALLABLE vec<T, D> perpendicular(vec<T, D> v){ | |
107 | - return N * v.dot(N); | |
108 | - } | |
109 | - | |
110 | - //compute the projection of v in the plane | |
111 | - CUDA_CALLABLE vec<T, D> parallel(vec<T, D> v){ | |
112 | - return v - perpendicular(v); | |
113 | - } | |
114 | - | |
115 | - CUDA_CALLABLE void decompose(vec<T, D> v, vec<T, D>& para, vec<T, D>& perp){ | |
116 | - perp = N * v.dot(N); | |
117 | - para = v - perp; | |
118 | - } | |
119 | - | |
120 | - //get both the parallel and perpendicular components of a vector v w.r.t. the plane | |
121 | - CUDA_CALLABLE void project(vec<T, D> v, vec<T, D> &v_par, vec<T, D> &v_perp){ | |
122 | - | |
123 | - v_perp = v.dot(N); | |
124 | - v_par = v - v_perp; | |
125 | - } | |
126 | - | |
127 | - //compute the reflection of v off of the plane | |
128 | - CUDA_CALLABLE vec<T, D> reflect(vec<T, D> v){ | |
129 | - | |
130 | - //compute the reflection using N_prime as the plane normal | |
131 | - vec<T, D> par = parallel(v); | |
132 | - vec<T, D> r = (-v) + par * 2; | |
133 | - | |
134 | - /*std::cout<<"----------------REFLECT-----------------------------"<<std::endl; | |
135 | - std::cout<<str()<<std::endl; | |
136 | - std::cout<<"v: "<<v<<std::endl; | |
137 | - std::cout<<"r: "<<r<<std::endl; | |
138 | - std::cout<<"Perpendicular: "<<perpendicular(v)<<std::endl; | |
139 | - std::cout<<"Parallel: "<<par<<std::endl;*/ | |
140 | - return r; | |
141 | - | |
142 | - } | |
143 | - | |
144 | - CUDA_CALLABLE rts::plane<T, D> operator-() | |
145 | - { | |
146 | - rts::plane<T, D> p = *this; | |
147 | - | |
148 | - //negate the normal vector | |
149 | - p.N = -p.N; | |
150 | - | |
151 | - return p; | |
152 | - } | |
153 | - | |
154 | - //output a string | |
155 | - std::string str(){ | |
156 | - std::stringstream ss; | |
157 | - ss<<"P: "<<P<<std::endl; | |
158 | - ss<<"N: "<<N; | |
159 | - return ss.str(); | |
160 | - } | |
161 | - | |
162 | - ///////Friendship | |
163 | - //friend CUDA_CALLABLE rts::plane<T, D> operator- <> (rts::plane<T, D> v); | |
164 | - | |
165 | - | |
40 | + CUDA_CALLABLE plane() | |
41 | + { | |
42 | + init(); | |
43 | + } | |
44 | + | |
45 | + CUDA_CALLABLE plane(vec<T> n, vec<T> p = vec<T>(0, 0, 0)) | |
46 | + { | |
47 | + init(); | |
48 | + P = p; | |
49 | + rotate(n.norm()); | |
50 | + } | |
51 | + | |
52 | + CUDA_CALLABLE plane(T z_pos) | |
53 | + { | |
54 | + init(); | |
55 | + P[2] = z_pos; | |
56 | + } | |
57 | + | |
58 | + //create a plane from three points (a triangle) | |
59 | + CUDA_CALLABLE plane(vec<T> a, vec<T> b, vec<T> c) | |
60 | + { | |
61 | + init(); | |
62 | + P = c; | |
63 | + stim::vec<T> n = (c - a).cross(b - a); | |
64 | + try | |
65 | + { | |
66 | + if(n.len() != 0) | |
67 | + { | |
68 | + rotate(n.norm()); | |
69 | + } else { | |
70 | + throw 42; | |
71 | + } | |
72 | + } | |
73 | + catch(int i) | |
74 | + { | |
75 | + std::cerr << "No plane can be creates as all points a,b,c lie on a straight line" << std::endl; | |
76 | + } | |
77 | + } | |
78 | + | |
79 | + template< typename U > | |
80 | + CUDA_CALLABLE operator plane<U>() | |
81 | + { | |
82 | + plane<U> result(N, P); | |
83 | + return result; | |
84 | + | |
85 | + } | |
86 | + | |
87 | + CUDA_CALLABLE vec<T> n() | |
88 | + { | |
89 | + return N; | |
90 | + } | |
91 | + | |
92 | + CUDA_CALLABLE vec<T> p() | |
93 | + { | |
94 | + return P; | |
95 | + } | |
96 | + | |
97 | + CUDA_CALLABLE vec<T> u() | |
98 | + { | |
99 | + return U; | |
100 | + } | |
101 | + | |
102 | + ///flip the plane front-to-back | |
103 | + CUDA_CALLABLE plane<T> flip(){ | |
104 | + plane<T> result = *this; | |
105 | + result.N = -result.N; | |
106 | + return result; | |
107 | + } | |
108 | + | |
109 | + //determines how a vector v intersects the plane (1 = intersects front, 0 = within plane, -1 = intersects back) | |
110 | + CUDA_CALLABLE int face(vec<T> v){ | |
111 | + | |
112 | + T dprod = v.dot(N); //get the dot product between v and N | |
113 | + | |
114 | + //conditional returns the appropriate value | |
115 | + if(dprod < 0) | |
116 | + return 1; | |
117 | + else if(dprod > 0) | |
118 | + return -1; | |
119 | + else | |
120 | + return 0; | |
121 | + } | |
122 | + | |
123 | + //determine on which side of the plane a point lies (1 = front, 0 = on the plane, -1 = bac k) | |
124 | + CUDA_CALLABLE int side(vec<T> p){ | |
125 | + | |
126 | + vec<T> v = p - P; //get the vector from P to the query point p | |
127 | + | |
128 | + return face(v); | |
129 | + } | |
130 | + | |
131 | + //compute the component of v that is perpendicular to the plane | |
132 | + CUDA_CALLABLE vec<T> perpendicular(vec<T> v){ | |
133 | + return N * v.dot(N); | |
134 | + } | |
135 | + | |
136 | + //compute the projection of v in the plane | |
137 | + CUDA_CALLABLE vec<T> parallel(vec<T> v){ | |
138 | + return v - perpendicular(v); | |
139 | + } | |
140 | + | |
141 | + CUDA_CALLABLE void setU(vec<T> v) | |
142 | + { | |
143 | + U = (parallel(v.norm())).norm(); | |
144 | + } | |
145 | + | |
146 | + CUDA_CALLABLE void decompose(vec<T> v, vec<T>& para, vec<T>& perp){ | |
147 | + perp = N * v.dot(N); | |
148 | + para = v - perp; | |
149 | + } | |
150 | + | |
151 | + //get both the parallel and perpendicular components of a vector v w.r.t. the plane | |
152 | + CUDA_CALLABLE void project(vec<T> v, vec<T> &v_par, vec<T> &v_perp){ | |
153 | + | |
154 | + v_perp = v.dot(N); | |
155 | + v_par = v - v_perp; | |
156 | + } | |
157 | + | |
158 | + //compute the reflection of v off of the plane | |
159 | + CUDA_CALLABLE vec<T> reflect(vec<T> v){ | |
160 | + | |
161 | + //compute the reflection using N_prime as the plane normal | |
162 | + vec<T> par = parallel(v); | |
163 | + vec<T> r = (-v) + par * 2; | |
164 | + return r; | |
165 | + | |
166 | + } | |
167 | + | |
168 | + CUDA_CALLABLE stim::plane<T> operator-() | |
169 | + { | |
170 | + stim::plane<T> p = *this; | |
171 | + | |
172 | + //negate the normal vector | |
173 | + p.N = -p.N; | |
174 | + return p; | |
175 | + } | |
176 | + | |
177 | + //output a string | |
178 | + std::string str(){ | |
179 | + std::stringstream ss; | |
180 | + ss<<"P: "<<P<<std::endl; | |
181 | + ss<<"N: "<<N<<std::endl; | |
182 | + ss<<"U: "<<U; | |
183 | + return ss.str(); | |
184 | + } | |
185 | + | |
186 | + | |
187 | + CUDA_CALLABLE void rotate(vec<T> n) | |
188 | + { | |
189 | + quaternion<T> q; | |
190 | + q.CreateRotation(N, n); | |
191 | + | |
192 | + N = q.toMatrix3() * N; | |
193 | + U = q.toMatrix3() * U; | |
194 | + | |
195 | + } | |
196 | + | |
197 | + CUDA_CALLABLE void rotate(vec<T> n, vec<T> &X, vec<T> &Y) | |
198 | + { | |
199 | + quaternion<T> q; | |
200 | + q.CreateRotation(N, n); | |
201 | + | |
202 | + N = q.toMatrix3() * N; | |
203 | + U = q.toMatrix3() * U; | |
204 | + X = q.toMatrix3() * X; | |
205 | + Y = q.toMatrix3() * Y; | |
206 | + | |
207 | + } | |
166 | 208 | |
167 | 209 | }; |
168 | - | |
210 | + | |
211 | + | |
169 | 212 | } |
170 | - | |
171 | -//arithmetic operators | |
172 | - | |
173 | -//negative operator flips the plane (front to back) | |
174 | -//template <typename T, int D> | |
175 | - | |
176 | - | |
177 | - | |
178 | - | |
179 | 213 | #endif | ... | ... |
stim/math/rect.h
1 | -#ifndef RTS_RECT_H | |
2 | -#define RTS_RECT_H | |
1 | +#ifndef STIM_RECT_H | |
2 | +#define STIM_RECT_H | |
3 | + | |
3 | 4 | |
4 | 5 | //enable CUDA_CALLABLE macro |
5 | 6 | #include <stim/cuda/cudatools/callable.h> |
7 | +#include <stim/math/plane.h> | |
6 | 8 | #include <stim/math/vector.h> |
7 | 9 | #include <stim/math/triangle.h> |
8 | -#include <stim/math/quaternion.h> | |
9 | 10 | #include <iostream> |
10 | 11 | #include <iomanip> |
11 | 12 | #include <algorithm> |
13 | +#include <assert.h> | |
12 | 14 | |
13 | 15 | namespace stim{ |
14 | 16 | |
15 | 17 | //template for a rectangle class in ND space |
16 | -template <class T> | |
17 | -struct rect | |
18 | +template <typename T> | |
19 | +class rect : plane <T> | |
18 | 20 | { |
19 | 21 | /* |
20 | 22 | ^ O |
21 | 23 | | |
22 | 24 | | |
23 | - Y C | |
25 | + Y P | |
24 | 26 | | |
25 | 27 | | |
26 | 28 | O---------X---------> |
... | ... | @@ -28,106 +30,143 @@ struct rect |
28 | 30 | |
29 | 31 | private: |
30 | 32 | |
31 | - stim::vec<T> C; | |
32 | 33 | stim::vec<T> X; |
33 | 34 | stim::vec<T> Y; |
34 | 35 | |
35 | - CUDA_CALLABLE void scale(T factor){ | |
36 | - X *= factor; | |
37 | - Y *= factor; | |
38 | - } | |
39 | 36 | |
40 | 37 | |
41 | - CUDA_CALLABLE void normal(vec<T> n){ //orient the rectangle along the specified normal | |
42 | - | |
43 | - n = n.norm(); //normalize, just in case | |
44 | - vec<T> n_current = X.cross(Y).norm(); //compute the current normal | |
45 | - quaternion<T> q; //create a quaternion | |
46 | - q.CreateRotation(n_current, n); //initialize a rotation from n_current to n | |
47 | - | |
48 | - //apply the quaternion to the vectors and position | |
49 | - X = q.toMatrix3() * X; | |
50 | - Y = q.toMatrix3() * Y; | |
51 | - } | |
52 | - | |
53 | - CUDA_CALLABLE void init(){ | |
54 | - C = vec<T>(0, 0, 0); | |
55 | - X = vec<T>(1, 0, 0); | |
56 | - Y = vec<T>(0, 1, 0); | |
57 | - } | |
58 | 38 | |
59 | 39 | public: |
60 | 40 | |
61 | - CUDA_CALLABLE rect(){ | |
41 | + using stim::plane<T>::n; | |
42 | + using stim::plane<T>::P; | |
43 | + using stim::plane<T>::N; | |
44 | + using stim::plane<T>::U; | |
45 | + using stim::plane<T>::rotate; | |
46 | + | |
47 | + ///base constructor. | |
48 | + CUDA_CALLABLE rect() | |
49 | + : plane<T>() | |
50 | + { | |
62 | 51 | init(); |
63 | 52 | } |
64 | 53 | |
65 | - //create a rectangle given a size and position | |
66 | - CUDA_CALLABLE rect(T size, T z_pos = (T)0){ | |
54 | + ///create a rectangle given a size and position in Z space. | |
55 | + ///@param size: size of the rectangle in ND space. | |
56 | + ///@param z_pos z coordinate of the rectangle. | |
57 | + CUDA_CALLABLE rect(T size, T z_pos = (T)0) | |
58 | + : plane<T>(z_pos) | |
59 | + { | |
67 | 60 | init(); //use the default setup |
68 | 61 | scale(size); //scale the rectangle |
69 | - C[2] = z_pos; | |
70 | 62 | } |
71 | 63 | |
72 | 64 | |
73 | - //create a rectangle from a center point, normal, and size | |
74 | - CUDA_CALLABLE rect(vec<T> c, vec<T> n = vec<T>(0, 0, 1)){ | |
65 | + ///create a rectangle from a center point, normal | |
66 | + ///@param c: x,y,z location of the center. | |
67 | + ///@param n: x,y,z direction of the normal. | |
68 | + CUDA_CALLABLE rect(vec<T> c, vec<T> n = vec<T>(0, 0, 1)) | |
69 | + : plane<T>() | |
70 | + { | |
75 | 71 | init(); //start with the default setting |
76 | - C = c; | |
77 | 72 | normal(n); //orient |
78 | 73 | } |
79 | 74 | |
75 | + ///create a rectangle from a center point, normal, and size | |
76 | + ///@param c: x,y,z location of the center. | |
77 | + ///@param s: size of the rectangle. | |
78 | + ///@param n: x,y,z direction of the normal. | |
79 | + CUDA_CALLABLE rect(vec<T> c, T s, vec<T> n = vec<T>(0, 0, 1)) | |
80 | + : plane<T>() | |
81 | + { | |
82 | + init(); //start with the default setting | |
83 | + scale(s); | |
84 | + center(c); | |
85 | + rotate(n, X, Y); | |
86 | + } | |
87 | + | |
88 | + ///creates a rectangle from a centerpoint and an X and Y direction vectors. | |
89 | + ///@param center: x,y,z location of the center. | |
90 | + ///@param directionX: u,v,w direction of the X vector. | |
91 | + ///@param directionY: u,v,w direction of the Y vector. | |
80 | 92 | CUDA_CALLABLE rect(vec<T> center, vec<T> directionX, vec<T> directionY ) |
93 | + : plane<T>((directionX.cross(directionY)).norm(),center) | |
81 | 94 | { |
82 | - C = center; | |
83 | 95 | X = directionX; |
84 | 96 | Y = directionY; |
85 | 97 | } |
86 | 98 | |
99 | + ///creates a rectangle from a size, centerpoint, X, and Y direction vectors. | |
100 | + ///@param size of the rectangle in ND space. | |
101 | + ///@param center: x,y,z location of the center. | |
102 | + ///@param directionX: u,v,w direction of the X vector. | |
103 | + ///@param directionY: u,v,w direction of the Y vector. | |
87 | 104 | CUDA_CALLABLE rect(T size, vec<T> center, vec<T> directionX, vec<T> directionY ) |
105 | + : plane<T>((directionX.cross(directionY)).norm(),center) | |
88 | 106 | { |
89 | - C = center; | |
90 | 107 | X = directionX; |
91 | 108 | Y = directionY; |
92 | 109 | scale(size); |
93 | 110 | } |
94 | - | |
95 | - CUDA_CALLABLE rect(vec<T> size, vec<T> center, vec<T> directionX, vec<T> directionY ) | |
111 | + | |
112 | + ///creates a rectangle from a size, centerpoint, X, and Y direction vectors. | |
113 | + ///@param size of the rectangle in ND space, size[0] = size in X, size[1] = size in Y. | |
114 | + ///@param center: x,y,z location of the center. | |
115 | + ///@param directionX: u,v,w direction of the X vector. | |
116 | + ///@param directionY: u,v,w direction of the Y vector. | |
117 | + CUDA_CALLABLE rect(vec<T> size, vec<T> center, vec<T> directionX, vec<T> directionY) | |
118 | + : plane<T>((directionX.cross(directionY)).norm(), center) | |
96 | 119 | { |
97 | - C = center; | |
98 | 120 | X = directionX; |
99 | 121 | Y = directionY; |
100 | 122 | scale(size[0], size[1]); |
101 | 123 | } |
102 | - | |
103 | - CUDA_CALLABLE void scale(T factor1, T factor2){ | |
124 | + | |
125 | + CUDA_CALLABLE void scale(T factor){ | |
126 | + X *= factor; | |
127 | + Y *= factor; | |
128 | + } | |
129 | + | |
130 | + ///scales a rectangle in ND space. | |
131 | + ///@param factor1: size of the scale in the X-direction. | |
132 | + ///@param factor2: size of the scale in the Y-direction. | |
133 | + CUDA_CALLABLE void scale(T factor1, T factor2) | |
134 | + { | |
104 | 135 | X *= factor1; |
105 | 136 | Y *= factor2; |
106 | 137 | } |
107 | 138 | |
139 | + ///@param n; vector with the normal. | |
140 | + ///Orients the rectangle along the normal n. | |
141 | + CUDA_CALLABLE void normal(vec<T> n) | |
142 | + { | |
143 | + //orient the rectangle along the specified normal | |
144 | + rotate(n, X, Y); | |
145 | + } | |
146 | + | |
147 | + ///general init method that sets a general rectangle. | |
148 | + CUDA_CALLABLE void init() | |
149 | + { | |
150 | + X = vec<T>(1, 0, 0); | |
151 | + Y = vec<T>(0, 1, 0); | |
152 | + } | |
153 | + | |
108 | 154 | //boolean comparison |
109 | 155 | bool operator==(const rect<T> & rhs) |
110 | 156 | { |
111 | - if(C == rhs.C && X == rhs.X && Y == rhs.Y) | |
157 | + if(P == rhs.P && X == rhs.X && Y == rhs.Y) | |
112 | 158 | return true; |
113 | 159 | else |
114 | 160 | return false; |
115 | 161 | } |
116 | 162 | |
117 | - /******************************************* | |
118 | - Return the normal for the rect | |
119 | - *******************************************/ | |
120 | - CUDA_CALLABLE stim::vec<T> n() | |
121 | - { | |
122 | - return (X.cross(Y)).norm(); | |
123 | - } | |
124 | 163 | |
125 | 164 | //get the world space value given the planar coordinates a, b in [0, 1] |
126 | 165 | CUDA_CALLABLE stim::vec<T> p(T a, T b) |
127 | 166 | { |
128 | 167 | stim::vec<T> result; |
129 | 168 | //given the two parameters a, b = [0 1], returns the position in world space |
130 | - vec<T> A = C - X * (T)0.5 - Y * (T)0.5; | |
169 | + vec<T> A = this->P - X * (T)0.5 - Y * (T)0.5; | |
131 | 170 | result = A + X * a + Y * b; |
132 | 171 | |
133 | 172 | return result; |
... | ... | @@ -142,16 +181,16 @@ public: |
142 | 181 | std::string str() |
143 | 182 | { |
144 | 183 | std::stringstream ss; |
145 | - vec<T> A = C - X * (T)0.5 - Y * (T)0.5; | |
184 | + vec<T> A = P - X * (T)0.5 - Y * (T)0.5; | |
146 | 185 | ss<<std::left<<"B="<<std::setfill('-')<<std::setw(20)<<A + Y<<">"<<"C="<<A + Y + X<<std::endl; |
147 | 186 | ss<<std::setfill(' ')<<std::setw(23)<<"|"<<"|"<<std::endl<<std::setw(23)<<"|"<<"|"<<std::endl; |
148 | 187 | ss<<std::left<<"A="<<std::setfill('-')<<std::setw(20)<<A<<">"<<"D="<<A + X; |
149 | 188 | |
150 | - return ss.str(); | |
189 | + return ss.str(); | |
151 | 190 | |
152 | 191 | } |
153 | 192 | |
154 | - //scales the rectangle by a value rhs | |
193 | + ///multiplication operator scales the rectangle by a value rhs. | |
155 | 194 | CUDA_CALLABLE rect<T> operator*(T rhs) |
156 | 195 | { |
157 | 196 | //scales the plane by a scalar value |
... | ... | @@ -164,36 +203,44 @@ public: |
164 | 203 | |
165 | 204 | } |
166 | 205 | |
167 | - //computes the distance between the specified point and this rectangle | |
206 | + ///computes the distance between the specified point and this rectangle. | |
207 | + ///@param p: x, y, z coordinates of the point to calculate distance to. | |
168 | 208 | CUDA_CALLABLE T dist(vec<T> p) |
169 | 209 | { |
170 | 210 | //compute the distance between a point and this rect |
171 | 211 | |
172 | - vec<T> A = C - X * (T)0.5 - Y * (T)0.5; | |
212 | + vec<T> A = P - X * (T)0.5 - Y * (T)0.5; | |
173 | 213 | |
174 | - //first break the rect up into two triangles | |
175 | - triangle<T> T0(A, A+X, A+Y); | |
176 | - triangle<T> T1(A+X+Y, A+X, A+Y); | |
214 | + //first break the rect up into two triangles | |
215 | + triangle<T> T0(A, A+X, A+Y); | |
216 | + triangle<T> T1(A+X+Y, A+X, A+Y); | |
177 | 217 | |
178 | 218 | |
179 | - T d0 = T0.dist(p); | |
180 | - T d1 = T1.dist(p); | |
219 | + T d0 = T0.dist(p); | |
220 | + T d1 = T1.dist(p); | |
181 | 221 | |
182 | - if(d0 < d1) | |
183 | - return d0; | |
184 | - else | |
185 | - return d1; | |
222 | + if(d0 < d1) | |
223 | + return d0; | |
224 | + else | |
225 | + return d1; | |
226 | + } | |
227 | + | |
228 | + CUDA_CALLABLE T center(vec<T> p) | |
229 | + { | |
230 | + this->P = p; | |
186 | 231 | } |
187 | 232 | |
233 | + ///Returns the maximum distance of the rectangle from a point p to the sides of the rectangle. | |
234 | + ///@param p: x, y, z point. | |
188 | 235 | CUDA_CALLABLE T dist_max(vec<T> p) |
189 | 236 | { |
190 | - vec<T> A = C - X * (T)0.5 - Y * (T)0.5; | |
191 | - T da = (A - p).len(); | |
192 | - T db = (A+X - p).len(); | |
193 | - T dc = (A+Y - p).len(); | |
194 | - T dd = (A+X+Y - p).len(); | |
237 | + vec<T> A = P - X * (T)0.5 - Y * (T)0.5; | |
238 | + T da = (A - p).len(); | |
239 | + T db = (A+X - p).len(); | |
240 | + T dc = (A+Y - p).len(); | |
241 | + T dd = (A+X+Y - p).len(); | |
195 | 242 | |
196 | - return std::max( da, std::max(db, std::max(dc, dd) ) ); | |
243 | + return std::max( da, std::max(db, std::max(dc, dd) ) ); | |
197 | 244 | } |
198 | 245 | }; |
199 | 246 | ... | ... |