d609550e
David Mayerich
fixed bug in plan...
|
1
2
|
#ifndef RTS_QUAD_H
#define RTS_QUAD_H
|
a47a23a9
dmayerich
added ENVI functions
|
3
4
|
//enable CUDA_CALLABLE macro
|
cce7daf9
Pavel Govyadinov
added glObj.h to ...
|
5
6
7
8
|
#include <stim/cuda/callable.h>
#include <stim/math/vector.h>
#include <stim/math/triangle.h>
#include <stim/math/quaternion.h>
|
a47a23a9
dmayerich
added ENVI functions
|
9
|
#include <iostream>
|
8d4f0940
David Mayerich
ERROR in plane wa...
|
10
|
#include <iomanip>
|
57729e5b
David Mayerich
changed directory...
|
11
|
#include <algorithm>
|
a47a23a9
dmayerich
added ENVI functions
|
12
|
|
8a86bd56
David Mayerich
changed rts names...
|
13
|
namespace stim{
|
a47a23a9
dmayerich
added ENVI functions
|
14
|
|
7006df5f
David Mayerich
reformat of direc...
|
15
|
//template for a quadangle class in ND space
|
a9275be5
David Mayerich
added vector fiel...
|
16
|
template <class T, int N = 3>
|
7006df5f
David Mayerich
reformat of direc...
|
17
|
struct quad
|
a47a23a9
dmayerich
added ENVI functions
|
18
19
|
{
/*
|
a9275be5
David Mayerich
added vector fiel...
|
20
|
B------------------>C
|
a47a23a9
dmayerich
added ENVI functions
|
21
22
23
24
25
|
^ ^
| |
Y |
| |
| |
|
a9275be5
David Mayerich
added vector fiel...
|
26
|
A---------X-------->O
|
a47a23a9
dmayerich
added ENVI functions
|
27
28
29
30
31
32
|
*/
/*T A[N];
T B[N];
T C[N];*/
|
a9275be5
David Mayerich
added vector fiel...
|
33
34
35
|
rts::vec<T, N> A;
rts::vec<T, N> X;
rts::vec<T, N> Y;
|
a47a23a9
dmayerich
added ENVI functions
|
36
37
|
|
7006df5f
David Mayerich
reformat of direc...
|
38
|
CUDA_CALLABLE quad()
|
a47a23a9
dmayerich
added ENVI functions
|
39
40
41
42
|
{
}
|
a9275be5
David Mayerich
added vector fiel...
|
43
|
CUDA_CALLABLE quad(vec<T, N> a, vec<T, N> b, vec<T, N> c)
|
a47a23a9
dmayerich
added ENVI functions
|
44
45
|
{
|
a9275be5
David Mayerich
added vector fiel...
|
46
47
48
|
A = a;
Y = b - a;
X = c - a - Y;
|
a47a23a9
dmayerich
added ENVI functions
|
49
50
51
|
}
|
7006df5f
David Mayerich
reformat of direc...
|
52
53
54
|
/*******************************************************************
Constructor - create a quad from a position, normal, and rotation
*******************************************************************/
|
a9275be5
David Mayerich
added vector fiel...
|
55
|
CUDA_CALLABLE quad(rts::vec<T, N> c, rts::vec<T, N> normal, T width, T height, T theta)
|
7006df5f
David Mayerich
reformat of direc...
|
56
57
58
|
{
//compute the X direction - start along world-space X
|
a9275be5
David Mayerich
added vector fiel...
|
59
|
Y = rts::vec<T, N>(0, 1, 0);
|
7006df5f
David Mayerich
reformat of direc...
|
60
|
if(Y == normal)
|
a9275be5
David Mayerich
added vector fiel...
|
61
|
Y = rts::vec<T, N>(0, 0, 1);
|
7006df5f
David Mayerich
reformat of direc...
|
62
63
64
65
66
67
68
69
70
71
|
X = Y.cross(normal).norm();
std::cout<<X<<std::endl;
//rotate the X axis by theta radians
rts::quaternion<T> q;
q.CreateRotation(theta, normal);
X = q.toMatrix3() * X;
Y = normal.cross(X);
|
a47a23a9
dmayerich
added ENVI functions
|
72
|
|
7006df5f
David Mayerich
reformat of direc...
|
73
74
75
|
//normalize everything
X = X.norm();
Y = Y.norm();
|
a47a23a9
dmayerich
added ENVI functions
|
76
|
|
7006df5f
David Mayerich
reformat of direc...
|
77
78
79
|
//scale to match the quad width and height
X = X * width;
Y = Y * height;
|
a47a23a9
dmayerich
added ENVI functions
|
80
|
|
7006df5f
David Mayerich
reformat of direc...
|
81
|
//set the corner of the plane
|
7731cf24
David Mayerich
fixed precision p...
|
82
|
A = c - X * 0.5f - Y * 0.5f;
|
a47a23a9
dmayerich
added ENVI functions
|
83
|
|
7006df5f
David Mayerich
reformat of direc...
|
84
|
std::cout<<X<<std::endl;
|
a47a23a9
dmayerich
added ENVI functions
|
85
86
|
}
|
8d4f0940
David Mayerich
ERROR in plane wa...
|
87
88
89
90
91
92
93
94
95
|
//boolean comparison
bool operator==(const quad<T, N> & rhs)
{
if(A == rhs.A && X == rhs.X && Y == rhs.Y)
return true;
else
return false;
}
|
7006df5f
David Mayerich
reformat of direc...
|
96
97
98
|
/*******************************************
Return the normal for the quad
*******************************************/
|
a9275be5
David Mayerich
added vector fiel...
|
99
|
CUDA_CALLABLE rts::vec<T, N> n()
|
a47a23a9
dmayerich
added ENVI functions
|
100
|
{
|
7006df5f
David Mayerich
reformat of direc...
|
101
102
103
|
return (X.cross(Y)).norm();
}
|
a9275be5
David Mayerich
added vector fiel...
|
104
|
CUDA_CALLABLE rts::vec<T, N> p(T a, T b)
|
7006df5f
David Mayerich
reformat of direc...
|
105
|
{
|
a9275be5
David Mayerich
added vector fiel...
|
106
|
rts::vec<T, N> result;
|
a47a23a9
dmayerich
added ENVI functions
|
107
108
|
//given the two parameters a, b = [0 1], returns the position in world space
result = A + X * a + Y * b;
|
cc8715ef
dmayerich
organization
|
109
|
|
a47a23a9
dmayerich
added ENVI functions
|
110
111
112
|
return result;
}
|
a9275be5
David Mayerich
added vector fiel...
|
113
|
CUDA_CALLABLE rts::vec<T, N> operator()(T a, T b)
|
a47a23a9
dmayerich
added ENVI functions
|
114
115
116
117
|
{
return p(a, b);
}
|
a9275be5
David Mayerich
added vector fiel...
|
118
|
std::string str()
|
a47a23a9
dmayerich
added ENVI functions
|
119
120
121
|
{
std::stringstream ss;
|
8d4f0940
David Mayerich
ERROR in plane wa...
|
122
123
124
|
ss<<std::left<<"B="<<setfill('-')<<setw(20)<<A + Y<<">"<<"C="<<A + Y + X<<std::endl;
ss<<setfill(' ')<<setw(23)<<"|"<<"|"<<std::endl<<setw(23)<<"|"<<"|"<<std::endl;
ss<<std::left<<"A="<<setfill('-')<<setw(20)<<A<<">"<<"D="<<A + X;
|
a47a23a9
dmayerich
added ENVI functions
|
125
126
127
128
129
|
return ss.str();
}
|
7006df5f
David Mayerich
reformat of direc...
|
130
|
CUDA_CALLABLE quad<T, N> operator*(T rhs)
|
a47a23a9
dmayerich
added ENVI functions
|
131
132
133
|
{
//scales the plane by a scalar value
|
7006df5f
David Mayerich
reformat of direc...
|
134
|
//compute the center point
|
a9275be5
David Mayerich
added vector fiel...
|
135
|
rts::vec<T, N> c = A + X*0.5f + Y*0.5f;
|
a47a23a9
dmayerich
added ENVI functions
|
136
|
|
7006df5f
David Mayerich
reformat of direc...
|
137
138
|
//create the new quadangle
quad<T, N> result;
|
a47a23a9
dmayerich
added ENVI functions
|
139
140
|
result.X = X * rhs;
result.Y = Y * rhs;
|
7731cf24
David Mayerich
fixed precision p...
|
141
|
result.A = c - result.X*0.5f - result.Y*0.5f;
|
a47a23a9
dmayerich
added ENVI functions
|
142
143
144
145
|
return result;
}
|
0174d823
dmayerich
bug fixes and exits
|
146
|
|
a9275be5
David Mayerich
added vector fiel...
|
147
|
CUDA_CALLABLE T dist(vec<T, N> p)
|
0174d823
dmayerich
bug fixes and exits
|
148
149
150
151
|
{
//compute the distance between a point and this quad
//first break the quad up into two triangles
|
7006df5f
David Mayerich
reformat of direc...
|
152
153
|
triangle<T, N> T0(A, A+X, A+Y);
triangle<T, N> T1(A+X+Y, A+X, A+Y);
|
0174d823
dmayerich
bug fixes and exits
|
154
155
|
|
a9275be5
David Mayerich
added vector fiel...
|
156
157
|
T d0 = T0.dist(p);
T d1 = T1.dist(p);
|
0174d823
dmayerich
bug fixes and exits
|
158
159
160
161
162
163
|
if(d0 < d1)
return d0;
else
return d1;
}
|
7006df5f
David Mayerich
reformat of direc...
|
164
|
|
a9275be5
David Mayerich
added vector fiel...
|
165
|
CUDA_CALLABLE T dist_max(vec<T, N> p)
|
7006df5f
David Mayerich
reformat of direc...
|
166
167
168
169
170
171
|
{
T da = (A - p).len();
T db = (A+X - p).len();
T dc = (A+Y - p).len();
T dd = (A+X+Y - p).len();
|
3b012a80
David Mayerich
added code for co...
|
172
|
return std::max( da, std::max(db, std::max(dc, dd) ) );
|
7006df5f
David Mayerich
reformat of direc...
|
173
|
}
|
a47a23a9
dmayerich
added ENVI functions
|
174
175
176
177
178
|
};
} //end namespace rts
template <typename T, int N>
|
7006df5f
David Mayerich
reformat of direc...
|
179
|
std::ostream& operator<<(std::ostream& os, rts::quad<T, N> R)
|
a47a23a9
dmayerich
added ENVI functions
|
180
|
{
|
a9275be5
David Mayerich
added vector fiel...
|
181
|
os<<R.str();
|
a47a23a9
dmayerich
added ENVI functions
|
182
183
184
185
|
return os;
}
|
cc8715ef
dmayerich
organization
|
186
|
#endif
|