Commit 2137d77110928caec404f27178976bd2eca5d5ab

Authored by Pavel Govyadinov
1 parent 59360849

modified plane and rect in order have an inheritance scheme plane -> rect.

Showing 3 changed files with 328 additions and 58 deletions   Show diff stats
@@ -31,6 +31,12 @@ template <typename T> class plane @@ -31,6 +31,12 @@ template <typename T> class plane
31 init(); 31 init();
32 } 32 }
33 33
  34 + CUDA_CALLABLE plane(vec<T> p)
  35 + {
  36 + init();
  37 + P = p;
  38 + }
  39 +
34 CUDA_CALLABLE plane(vec<T> n, vec<T> p = vec<T>(0, 0, 0)) 40 CUDA_CALLABLE plane(vec<T> n, vec<T> p = vec<T>(0, 0, 0))
35 { 41 {
36 init(); 42 init();
@@ -125,6 +131,11 @@ template &lt;typename T&gt; class plane @@ -125,6 +131,11 @@ template &lt;typename T&gt; class plane
125 return v - perpendicular(v); 131 return v - perpendicular(v);
126 } 132 }
127 133
  134 + CUDA_CALLABLE void setU(vec<T> v)
  135 + {
  136 + U = (parallel(v.norm())).norm();
  137 + }
  138 +
128 CUDA_CALLABLE void decompose(vec<T> v, vec<T>& para, vec<T>& perp){ 139 CUDA_CALLABLE void decompose(vec<T> v, vec<T>& para, vec<T>& perp){
129 perp = N * v.dot(N); 140 perp = N * v.dot(N);
130 para = v - perp; 141 para = v - perp;
@@ -176,6 +187,18 @@ template &lt;typename T&gt; class plane @@ -176,6 +187,18 @@ template &lt;typename T&gt; class plane
176 187
177 } 188 }
178 189
  190 + CUDA_CALLABLE void rotate(vec<T> n, vec<T> &X, vec<T> &Y)
  191 + {
  192 + quaternion<T> q;
  193 + q.CreateRotation(N, n);
  194 +
  195 + N = q.toMatrix3() * N;
  196 + U = q.toMatrix3() * U;
  197 + X = q.toMatrix3() * X;
  198 + Y = q.toMatrix3() * Y;
  199 +
  200 + }
  201 +
179 }; 202 };
180 203
181 204
1 -#ifndef RTS_RECT_H  
2 -#define RTS_RECT_H 1 +#ifndef STIM_RECT_H
  2 +#define STIM_RECT_H
3 3
4 //enable CUDA_CALLABLE macro 4 //enable CUDA_CALLABLE macro
5 #include <stim/cuda/cudatools/callable.h> 5 #include <stim/cuda/cudatools/callable.h>
  6 +#include <stim/math/plane.h>
6 #include <stim/math/vector.h> 7 #include <stim/math/vector.h>
7 #include <stim/math/triangle.h> 8 #include <stim/math/triangle.h>
8 -#include <stim/math/quaternion.h>  
9 #include <iostream> 9 #include <iostream>
10 #include <iomanip> 10 #include <iomanip>
11 #include <algorithm> 11 #include <algorithm>
@@ -13,14 +13,14 @@ @@ -13,14 +13,14 @@
13 namespace stim{ 13 namespace stim{
14 14
15 //template for a rectangle class in ND space 15 //template for a rectangle class in ND space
16 -template <class T>  
17 -struct rect 16 +template <typename T>
  17 +class rect : public plane <T>
18 { 18 {
19 /* 19 /*
20 ^ O 20 ^ O
21 | 21 |
22 | 22 |
23 - Y C 23 + Y P
24 | 24 |
25 | 25 |
26 O---------X---------> 26 O---------X--------->
@@ -28,7 +28,6 @@ struct rect @@ -28,7 +28,6 @@ struct rect
28 28
29 private: 29 private:
30 30
31 - stim::vec<T> C;  
32 stim::vec<T> X; 31 stim::vec<T> X;
33 stim::vec<T> Y; 32 stim::vec<T> Y;
34 33
@@ -42,26 +41,30 @@ private: @@ -42,26 +41,30 @@ private:
42 public: 41 public:
43 42
44 ///base constructor. 43 ///base constructor.
45 - CUDA_CALLABLE rect(){ 44 + CUDA_CALLABLE rect()
  45 + : plane<T>()
  46 + {
46 init(); 47 init();
47 } 48 }
48 49
49 ///create a rectangle given a size and position in Z space. 50 ///create a rectangle given a size and position in Z space.
50 ///@param size: size of the rectangle in ND space. 51 ///@param size: size of the rectangle in ND space.
51 ///@param z_pos z coordinate of the rectangle. 52 ///@param z_pos z coordinate of the rectangle.
52 - CUDA_CALLABLE rect(T size, T z_pos = (T)0){ 53 + CUDA_CALLABLE rect(T size, T z_pos = (T)0)
  54 + : plane<T>(z_pos)
  55 + {
53 init(); //use the default setup 56 init(); //use the default setup
54 scale(size); //scale the rectangle 57 scale(size); //scale the rectangle
55 - C[2] = z_pos;  
56 } 58 }
57 59
58 60
59 ///create a rectangle from a center point, normal 61 ///create a rectangle from a center point, normal
60 ///@param c: x,y,z location of the center. 62 ///@param c: x,y,z location of the center.
61 ///@param n: x,y,z direction of the normal. 63 ///@param n: x,y,z direction of the normal.
62 - CUDA_CALLABLE rect(vec<T> c, vec<T> n = vec<T>(0, 0, 1)){ 64 + CUDA_CALLABLE rect(vec<T> c, vec<T> n = vec<T>(0, 0, 1))
  65 + : plane<T>(n, c)
  66 + {
63 init(); //start with the default setting 67 init(); //start with the default setting
64 - C = c;  
65 normal(n); //orient 68 normal(n); //orient
66 } 69 }
67 70
@@ -69,11 +72,11 @@ public: @@ -69,11 +72,11 @@ public:
69 ///@param c: x,y,z location of the center. 72 ///@param c: x,y,z location of the center.
70 ///@param s: size of the rectangle. 73 ///@param s: size of the rectangle.
71 ///@param n: x,y,z direction of the normal. 74 ///@param n: x,y,z direction of the normal.
72 - CUDA_CALLABLE rect(vec<T> c, T s, vec<T> n = vec<T>(0, 0, 1)){ 75 + CUDA_CALLABLE rect(vec<T> c, T s, vec<T> n = vec<T>(0, 0, 1))
  76 + : plane<T>(n, c)
  77 + {
73 init(); //start with the default setting 78 init(); //start with the default setting
74 - C = c;  
75 scale(s); 79 scale(s);
76 - normal(n); //orient  
77 } 80 }
78 81
79 ///creates a rectangle from a centerpoint and an X and Y direction vectors. 82 ///creates a rectangle from a centerpoint and an X and Y direction vectors.
@@ -81,8 +84,8 @@ public: @@ -81,8 +84,8 @@ public:
81 ///@param directionX: u,v,w direction of the X vector. 84 ///@param directionX: u,v,w direction of the X vector.
82 ///@param directionY: u,v,w direction of the Y vector. 85 ///@param directionY: u,v,w direction of the Y vector.
83 CUDA_CALLABLE rect(vec<T> center, vec<T> directionX, vec<T> directionY ) 86 CUDA_CALLABLE rect(vec<T> center, vec<T> directionX, vec<T> directionY )
  87 + : plane<T>(p)
84 { 88 {
85 - C = center;  
86 X = directionX; 89 X = directionX;
87 Y = directionY; 90 Y = directionY;
88 } 91 }
@@ -93,8 +96,8 @@ public: @@ -93,8 +96,8 @@ public:
93 ///@param directionX: u,v,w direction of the X vector. 96 ///@param directionX: u,v,w direction of the X vector.
94 ///@param directionY: u,v,w direction of the Y vector. 97 ///@param directionY: u,v,w direction of the Y vector.
95 CUDA_CALLABLE rect(T size, vec<T> center, vec<T> directionX, vec<T> directionY ) 98 CUDA_CALLABLE rect(T size, vec<T> center, vec<T> directionX, vec<T> directionY )
  99 + : plane<T>(p)
96 { 100 {
97 - C = center;  
98 X = directionX; 101 X = directionX;
99 Y = directionY; 102 Y = directionY;
100 scale(size); 103 scale(size);
@@ -106,8 +109,8 @@ public: @@ -106,8 +109,8 @@ public:
106 ///@param directionX: u,v,w direction of the X vector. 109 ///@param directionX: u,v,w direction of the X vector.
107 ///@param directionY: u,v,w direction of the Y vector. 110 ///@param directionY: u,v,w direction of the Y vector.
108 CUDA_CALLABLE rect(vec<T> size, vec<T> center, vec<T> directionX, vec<T> directionY ) 111 CUDA_CALLABLE rect(vec<T> size, vec<T> center, vec<T> directionX, vec<T> directionY )
  112 + : plane<T>(p)
109 { 113 {
110 - C = center;  
111 X = directionX; 114 X = directionX;
112 Y = directionY; 115 Y = directionY;
113 scale(size[0], size[1]); 116 scale(size[0], size[1]);
@@ -116,28 +119,24 @@ public: @@ -116,28 +119,24 @@ public:
116 ///scales a rectangle in ND space. 119 ///scales a rectangle in ND space.
117 ///@param factor1: size of the scale in the X-direction. 120 ///@param factor1: size of the scale in the X-direction.
118 ///@param factor2: size of the scale in the Y-direction. 121 ///@param factor2: size of the scale in the Y-direction.
119 - CUDA_CALLABLE void scale(T factor1, T factor2){ 122 + CUDA_CALLABLE void scale(T factor1, T factor2)
  123 + {
120 X *= factor1; 124 X *= factor1;
121 Y *= factor2; 125 Y *= factor2;
122 } 126 }
123 127
124 ///@param n; vector with the normal. 128 ///@param n; vector with the normal.
125 ///Orients the rectangle along the normal n. 129 ///Orients the rectangle along the normal n.
126 - CUDA_CALLABLE void normal(vec<T> n){ //orient the rectangle along the specified normal  
127 -  
128 - n = n.norm(); //normalize, just in case  
129 - vec<T> n_current = X.cross(Y).norm(); //compute the current normal  
130 - quaternion<T> q; //create a quaternion  
131 - q.CreateRotation(n_current, n); //initialize a rotation from n_current to n  
132 -  
133 - //apply the quaternion to the vectors and position  
134 - X = q.toMatrix3() * X;  
135 - Y = q.toMatrix3() * Y; 130 + CUDA_CALLABLE void normal(vec<T> n)
  131 + {
  132 + //orient the rectangle along the specified normal
  133 + rotate(n, X, Y);
136 } 134 }
137 135
138 ///general init method that sets a general rectangle. 136 ///general init method that sets a general rectangle.
139 - CUDA_CALLABLE void init(){  
140 - C = vec<T>(0, 0, 0); 137 + CUDA_CALLABLE void init()
  138 + {
  139 + P = vec<T>(0, 0, 0);
141 X = vec<T>(1, 0, 0); 140 X = vec<T>(1, 0, 0);
142 Y = vec<T>(0, 1, 0); 141 Y = vec<T>(0, 1, 0);
143 } 142 }
@@ -145,26 +144,19 @@ public: @@ -145,26 +144,19 @@ public:
145 //boolean comparison 144 //boolean comparison
146 bool operator==(const rect<T> & rhs) 145 bool operator==(const rect<T> & rhs)
147 { 146 {
148 - if(C == rhs.C && X == rhs.X && Y == rhs.Y) 147 + if(P == rhs.P && X == rhs.X && Y == rhs.Y)
149 return true; 148 return true;
150 else 149 else
151 return false; 150 return false;
152 } 151 }
153 152
154 - /*******************************************  
155 - Return the normal for the rect  
156 - *******************************************/  
157 - CUDA_CALLABLE stim::vec<T> n()  
158 - {  
159 - return (X.cross(Y)).norm();  
160 - }  
161 153
162 //get the world space value given the planar coordinates a, b in [0, 1] 154 //get the world space value given the planar coordinates a, b in [0, 1]
163 CUDA_CALLABLE stim::vec<T> p(T a, T b) 155 CUDA_CALLABLE stim::vec<T> p(T a, T b)
164 { 156 {
165 stim::vec<T> result; 157 stim::vec<T> result;
166 //given the two parameters a, b = [0 1], returns the position in world space 158 //given the two parameters a, b = [0 1], returns the position in world space
167 - vec<T> A = C - X * (T)0.5 - Y * (T)0.5; 159 + vec<T> A = P - X * (T)0.5 - Y * (T)0.5;
168 result = A + X * a + Y * b; 160 result = A + X * a + Y * b;
169 161
170 return result; 162 return result;
@@ -179,12 +171,12 @@ public: @@ -179,12 +171,12 @@ public:
179 std::string str() 171 std::string str()
180 { 172 {
181 std::stringstream ss; 173 std::stringstream ss;
182 - vec<T> A = C - X * (T)0.5 - Y * (T)0.5; 174 + vec<T> A = P - X * (T)0.5 - Y * (T)0.5;
183 ss<<std::left<<"B="<<std::setfill('-')<<std::setw(20)<<A + Y<<">"<<"C="<<A + Y + X<<std::endl; 175 ss<<std::left<<"B="<<std::setfill('-')<<std::setw(20)<<A + Y<<">"<<"C="<<A + Y + X<<std::endl;
184 ss<<std::setfill(' ')<<std::setw(23)<<"|"<<"|"<<std::endl<<std::setw(23)<<"|"<<"|"<<std::endl; 176 ss<<std::setfill(' ')<<std::setw(23)<<"|"<<"|"<<std::endl<<std::setw(23)<<"|"<<"|"<<std::endl;
185 ss<<std::left<<"A="<<std::setfill('-')<<std::setw(20)<<A<<">"<<"D="<<A + X; 177 ss<<std::left<<"A="<<std::setfill('-')<<std::setw(20)<<A<<">"<<"D="<<A + X;
186 178
187 - return ss.str(); 179 + return ss.str();
188 180
189 } 181 }
190 182
@@ -207,20 +199,20 @@ public: @@ -207,20 +199,20 @@ public:
207 { 199 {
208 //compute the distance between a point and this rect 200 //compute the distance between a point and this rect
209 201
210 - vec<T> A = C - X * (T)0.5 - Y * (T)0.5; 202 + vec<T> A = P - X * (T)0.5 - Y * (T)0.5;
211 203
212 - //first break the rect up into two triangles  
213 - triangle<T> T0(A, A+X, A+Y);  
214 - triangle<T> T1(A+X+Y, A+X, A+Y); 204 + //first break the rect up into two triangles
  205 + triangle<T> T0(A, A+X, A+Y);
  206 + triangle<T> T1(A+X+Y, A+X, A+Y);
215 207
216 208
217 - T d0 = T0.dist(p);  
218 - T d1 = T1.dist(p); 209 + T d0 = T0.dist(p);
  210 + T d1 = T1.dist(p);
219 211
220 - if(d0 < d1)  
221 - return d0;  
222 - else  
223 - return d1; 212 + if(d0 < d1)
  213 + return d0;
  214 + else
  215 + return d1;
224 } 216 }
225 217
226 CUDA_CALLABLE T center(vec<T> p) 218 CUDA_CALLABLE T center(vec<T> p)
@@ -232,13 +224,13 @@ public: @@ -232,13 +224,13 @@ public:
232 ///@param p: x, y, z point. 224 ///@param p: x, y, z point.
233 CUDA_CALLABLE T dist_max(vec<T> p) 225 CUDA_CALLABLE T dist_max(vec<T> p)
234 { 226 {
235 - vec<T> A = C - X * (T)0.5 - Y * (T)0.5;  
236 - T da = (A - p).len();  
237 - T db = (A+X - p).len();  
238 - T dc = (A+Y - p).len();  
239 - T dd = (A+X+Y - p).len(); 227 + vec<T> A = P - X * (T)0.5 - Y * (T)0.5;
  228 + T da = (A - p).len();
  229 + T db = (A+X - p).len();
  230 + T dc = (A+Y - p).len();
  231 + T dd = (A+X+Y - p).len();
240 232
241 - return std::max( da, std::max(db, std::max(dc, dd) ) ); 233 + return std::max( da, std::max(db, std::max(dc, dd) ) );
242 } 234 }
243 }; 235 };
244 236
stim/math/rect_old.h 0 โ†’ 100644
  1 +#ifndef RTS_RECT_H
  2 +#define RTS_RECT_H
  3 +
  4 +//enable CUDA_CALLABLE macro
  5 +#include <stim/cuda/cudatools/callable.h>
  6 +#include <stim/math/vector.h>
  7 +#include <stim/math/triangle.h>
  8 +#include <stim/math/quaternion.h>
  9 +#include <iostream>
  10 +#include <iomanip>
  11 +#include <algorithm>
  12 +
  13 +namespace stim{
  14 +
  15 +//template for a rectangle class in ND space
  16 +template <class T>
  17 +struct rect
  18 +{
  19 + /*
  20 + ^ O
  21 + |
  22 + |
  23 + Y C
  24 + |
  25 + |
  26 + O---------X--------->
  27 + */
  28 +
  29 +private:
  30 +
  31 + stim::vec<T> C;
  32 + stim::vec<T> X;
  33 + stim::vec<T> Y;
  34 +
  35 + CUDA_CALLABLE void scale(T factor){
  36 + X *= factor;
  37 + Y *= factor;
  38 + }
  39 +
  40 +
  41 +
  42 +public:
  43 +
  44 + ///base constructor.
  45 + CUDA_CALLABLE rect(){
  46 + init();
  47 + }
  48 +
  49 + ///create a rectangle given a size and position in Z space.
  50 + ///@param size: size of the rectangle in ND space.
  51 + ///@param z_pos z coordinate of the rectangle.
  52 + CUDA_CALLABLE rect(T size, T z_pos = (T)0){
  53 + init(); //use the default setup
  54 + scale(size); //scale the rectangle
  55 + C[2] = z_pos;
  56 + }
  57 +
  58 +
  59 + ///create a rectangle from a center point, normal
  60 + ///@param c: x,y,z location of the center.
  61 + ///@param n: x,y,z direction of the normal.
  62 + CUDA_CALLABLE rect(vec<T> c, vec<T> n = vec<T>(0, 0, 1)){
  63 + init(); //start with the default setting
  64 + C = c;
  65 + normal(n); //orient
  66 + }
  67 +
  68 + ///create a rectangle from a center point, normal, and size
  69 + ///@param c: x,y,z location of the center.
  70 + ///@param s: size of the rectangle.
  71 + ///@param n: x,y,z direction of the normal.
  72 + CUDA_CALLABLE rect(vec<T> c, T s, vec<T> n = vec<T>(0, 0, 1)){
  73 + init(); //start with the default setting
  74 + C = c;
  75 + scale(s);
  76 + normal(n); //orient
  77 + }
  78 +
  79 + ///creates a rectangle from a centerpoint and an X and Y direction vectors.
  80 + ///@param center: x,y,z location of the center.
  81 + ///@param directionX: u,v,w direction of the X vector.
  82 + ///@param directionY: u,v,w direction of the Y vector.
  83 + CUDA_CALLABLE rect(vec<T> center, vec<T> directionX, vec<T> directionY )
  84 + {
  85 + C = center;
  86 + X = directionX;
  87 + Y = directionY;
  88 + }
  89 +
  90 + ///creates a rectangle from a size, centerpoint, X, and Y direction vectors.
  91 + ///@param size of the rectangle in ND space.
  92 + ///@param center: x,y,z location of the center.
  93 + ///@param directionX: u,v,w direction of the X vector.
  94 + ///@param directionY: u,v,w direction of the Y vector.
  95 + CUDA_CALLABLE rect(T size, vec<T> center, vec<T> directionX, vec<T> directionY )
  96 + {
  97 + C = center;
  98 + X = directionX;
  99 + Y = directionY;
  100 + scale(size);
  101 + }
  102 +
  103 + ///creates a rectangle from a size, centerpoint, X, and Y direction vectors.
  104 + ///@param size of the rectangle in ND space, size[0] = size in X, size[1] = size in Y.
  105 + ///@param center: x,y,z location of the center.
  106 + ///@param directionX: u,v,w direction of the X vector.
  107 + ///@param directionY: u,v,w direction of the Y vector.
  108 + CUDA_CALLABLE rect(vec<T> size, vec<T> center, vec<T> directionX, vec<T> directionY )
  109 + {
  110 + C = center;
  111 + X = directionX;
  112 + Y = directionY;
  113 + scale(size[0], size[1]);
  114 + }
  115 +
  116 + ///scales a rectangle in ND space.
  117 + ///@param factor1: size of the scale in the X-direction.
  118 + ///@param factor2: size of the scale in the Y-direction.
  119 + CUDA_CALLABLE void scale(T factor1, T factor2){
  120 + X *= factor1;
  121 + Y *= factor2;
  122 + }
  123 +
  124 + ///@param n; vector with the normal.
  125 + ///Orients the rectangle along the normal n.
  126 + CUDA_CALLABLE void normal(vec<T> n){ //orient the rectangle along the specified normal
  127 +
  128 + n = n.norm(); //normalize, just in case
  129 + vec<T> n_current = X.cross(Y).norm(); //compute the current normal
  130 + quaternion<T> q; //create a quaternion
  131 + q.CreateRotation(n_current, n); //initialize a rotation from n_current to n
  132 +
  133 + //apply the quaternion to the vectors and position
  134 + X = q.toMatrix3() * X;
  135 + Y = q.toMatrix3() * Y;
  136 + }
  137 +
  138 + ///general init method that sets a general rectangle.
  139 + CUDA_CALLABLE void init(){
  140 + C = vec<T>(0, 0, 0);
  141 + X = vec<T>(1, 0, 0);
  142 + Y = vec<T>(0, 1, 0);
  143 + }
  144 +
  145 + //boolean comparison
  146 + bool operator==(const rect<T> & rhs)
  147 + {
  148 + if(C == rhs.C && X == rhs.X && Y == rhs.Y)
  149 + return true;
  150 + else
  151 + return false;
  152 + }
  153 +
  154 + /*******************************************
  155 + Return the normal for the rect
  156 + *******************************************/
  157 + CUDA_CALLABLE stim::vec<T> n()
  158 + {
  159 + return (X.cross(Y)).norm();
  160 + }
  161 +
  162 + //get the world space value given the planar coordinates a, b in [0, 1]
  163 + CUDA_CALLABLE stim::vec<T> p(T a, T b)
  164 + {
  165 + stim::vec<T> result;
  166 + //given the two parameters a, b = [0 1], returns the position in world space
  167 + vec<T> A = C - X * (T)0.5 - Y * (T)0.5;
  168 + result = A + X * a + Y * b;
  169 +
  170 + return result;
  171 + }
  172 +
  173 + //parenthesis operator returns the world space given rectangular coordinates a and b in [0 1]
  174 + CUDA_CALLABLE stim::vec<T> operator()(T a, T b)
  175 + {
  176 + return p(a, b);
  177 + }
  178 +
  179 + std::string str()
  180 + {
  181 + std::stringstream ss;
  182 + vec<T> A = C - X * (T)0.5 - Y * (T)0.5;
  183 + ss<<std::left<<"B="<<std::setfill('-')<<std::setw(20)<<A + Y<<">"<<"C="<<A + Y + X<<std::endl;
  184 + ss<<std::setfill(' ')<<std::setw(23)<<"|"<<"|"<<std::endl<<std::setw(23)<<"|"<<"|"<<std::endl;
  185 + ss<<std::left<<"A="<<std::setfill('-')<<std::setw(20)<<A<<">"<<"D="<<A + X;
  186 +
  187 + return ss.str();
  188 +
  189 + }
  190 +
  191 + ///multiplication operator scales the rectangle by a value rhs.
  192 + CUDA_CALLABLE rect<T> operator*(T rhs)
  193 + {
  194 + //scales the plane by a scalar value
  195 +
  196 + //create the new rectangle
  197 + rect<T> result = *this;
  198 + result.scale(rhs);
  199 +
  200 + return result;
  201 +
  202 + }
  203 +
  204 + ///computes the distance between the specified point and this rectangle.
  205 + ///@param p: x, y, z coordinates of the point to calculate distance to.
  206 + CUDA_CALLABLE T dist(vec<T> p)
  207 + {
  208 + //compute the distance between a point and this rect
  209 +
  210 + vec<T> A = C - X * (T)0.5 - Y * (T)0.5;
  211 +
  212 + //first break the rect up into two triangles
  213 + triangle<T> T0(A, A+X, A+Y);
  214 + triangle<T> T1(A+X+Y, A+X, A+Y);
  215 +
  216 +
  217 + T d0 = T0.dist(p);
  218 + T d1 = T1.dist(p);
  219 +
  220 + if(d0 < d1)
  221 + return d0;
  222 + else
  223 + return d1;
  224 + }
  225 +
  226 + CUDA_CALLABLE T center(vec<T> p)
  227 + {
  228 + C = p;
  229 + }
  230 +
  231 + ///Returns the maximum distance of the rectangle from a point p to the sides of the rectangle.
  232 + ///@param p: x, y, z point.
  233 + CUDA_CALLABLE T dist_max(vec<T> p)
  234 + {
  235 + vec<T> A = C - X * (T)0.5 - Y * (T)0.5;
  236 + T da = (A - p).len();
  237 + T db = (A+X - p).len();
  238 + T dc = (A+Y - p).len();
  239 + T dd = (A+X+Y - p).len();
  240 +
  241 + return std::max( da, std::max(db, std::max(dc, dd) ) );
  242 + }
  243 +};
  244 +
  245 +} //end namespace rts
  246 +
  247 +template <typename T, int N>
  248 +std::ostream& operator<<(std::ostream& os, stim::rect<T> R)
  249 +{
  250 + os<<R.str();
  251 + return os;
  252 +}
  253 +
  254 +
  255 +#endif