Blame view

stim/math/quad.h 3.73 KB
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