20 FR2Vect3TC(T y1,T y2,T y3) : x1(y1), x2(y2), x3(y3) {};
22 explicit FR2Vect3TC(
const U &y) : x1(T(y.x1)), x2(T(y.x2)), x3(T(y.x3)) {}
25 {FGASSERT_FAST(n < 3);
return (&x1)[n];}
26 T
const& operator[](uint n)
const
27 {FGASSERT_FAST(n < 3);
return (&x1)[n];}
29 void set(T a) {x1 = a;x2 = a;x3 = a;}
40 {
return (x1==v.x1 && x2==v.x2 && x3==v.x3);}
42 {
return (x1!=v.x1 || x2!=v.x2 || x3!=v.x3);}
43 T
const len()
const {
return (T)(sqrt(x1*x1+x2*x2+x3*x3));}
44 T
const mag()
const {
return(x1*x1+x2*x2+x3*x3);}
50 T
const dot(
FR2Vect3TC vec)
const {
return(x1*vec.x1+x2*vec.x2+x3*vec.x3);}
66 {
return ((x.x3 < y.x3) ||
67 (x.x3 == y.x3 && x.x2 < y.x2) ||
68 (x.x3 == y.x3 && x.x2 == y.x2 && x.x1 < y.x1)); }
74template<
class T> std::ostream& operator<<(std::ostream&,
FR2Vect3TC<T>);
86const inline FR2Vect3TC<T> FR2Vect3TC<T>::operator-()
const
88 return FR2Vect3TC<T>(-x1,-x2,-x3);
92const inline FR2Vect3TC<T> FR2Vect3TC<T>::operator+(
93 const FR2Vect3TC<T> &v1)
96 return FR2Vect3TC<T>(x1 + v1.x1,
102const inline FR2Vect3TC<T> FR2Vect3TC<T>::operator-(
103 const FR2Vect3TC<T> &v1)
106 return FR2Vect3TC<T>(x1 - v1.x1,
112inline void FR2Vect3TC<T>::operator-=(
121inline void FR2Vect3TC<T>::operator+=(
130const inline FR2Vect3TC<T> FR2Vect3TC<T>::operator*(
134 return FR2Vect3TC<T>(x1*val, x2*val, x3*val);
138const inline FR2Vect3TC<T> FR2Vect3TC<T>::operator/(
142 FGASSERT_FAST(val != T(0));
144 return FR2Vect3TC<T>(x1/val, x2/val, x3/val);
148inline void FR2Vect3TC<T>::operator*=(
157inline void FR2Vect3TC<T>::operator/=(
160 FGASSERT_FAST(val != T(0));
174const inline FR2Vect3TC<T> FR2Vect3TC<T>::rotateX(
179 T cosine = (T)cos(theta),
180 sine = (T)sin(theta);
182 return FR2Vect3TC<T>(x1,
183 x2 * cosine - x3 * sine,
184 x3 * cosine + x2 * sine);
188const inline FR2Vect3TC<T> FR2Vect3TC<T>::rotateY(
193 T cosine = (T)cos(theta),
194 sine = (T)sin(theta);
196 return FR2Vect3TC<T>(x1 * cosine + x3 * sine,
198 x3 * cosine - x1 * sine);
202const inline FR2Vect3TC<T> FR2Vect3TC<T>::rotateZ(
207 T cosine = (T)cos(theta),
208 sine = (T)sin(theta);
210 return FR2Vect3TC<T>(x1 * cosine - x2 * sine,
211 x2 * cosine + x1 * sine,
216const FR2Vect3TC<T> FR2Vect3TC<T>::rotateK(
223 T vtheta = 1.0-cosine;
224 FR2Vect3TC<T> retval, k;
228 FGASSERT_FAST(ln != T(0));
232 (k.x1*k.x1*vtheta+cosine) * x1 +
233 (k.x1*k.x2*vtheta-k.x3*sine) * x2 +
234 (k.x1*k.x3*vtheta+k.x2*sine) * x3;
236 (k.x1*k.x2*vtheta+k.x3*sine) * x1 +
237 (k.x2*k.x2*vtheta+cosine) * x2 +
238 (k.x2*k.x3*vtheta-k.x1*sine) * x3;
240 (k.x1*k.x3*vtheta-k.x2*sine) * x1 +
241 (k.x2*k.x3*vtheta+k.x1*sine) * x2 +
242 (k.x3*k.x3*vtheta+cosine) * x3;
248const inline FR2Vect3TC<T> FR2Vect3TC<T>::cross(
253 return FR2Vect3TC<T>(x2 * vec.x3 - x3 * vec.x2,
254 x3 * vec.x1 - x1 * vec.x3,
255 x1 * vec.x2 - x2 * vec.x1);
271int fr2FindSortedVect3InsertPos(
272 const std::vector< FR2Vect3TC<T> > &list,
const FR2Vect3TC<T> &pt)
274 int numPts = list.size();
275 if (numPts == 0)
return 0;
280 if ((list[0].x3 > pt.x3) ||
281 (list[0].x3 == pt.x3 && list[0].x2 > pt.x2) ||
282 (list[0].x3 == pt.x3 && list[0].x2 == pt.x2 && list[0].x1 >= pt.x1))
285 if ((list[hi].x3 < pt.x3) ||
286 (list[hi].x3 == pt.x3 && list[hi].x2 < pt.x2) ||
287 (list[hi].x3 == pt.x3 && list[hi].x2 == pt.x2 && list[hi].x1 < pt.x1))
290 int idx = (hi+lo+1)/2;
294 if ((list[idx].x3 > pt.x3) ||
295 (list[idx].x3 == pt.x3 && list[idx].x2 > pt.x2) ||
296 (list[idx].x3 == pt.x3 && list[idx].x2 == pt.x2 &&
297 list[idx].x1 > pt.x1))
299 else if ((list[idx].x3 < pt.x3) ||
300 (list[idx].x3 == pt.x3 && list[idx].x2 < pt.x2) ||
301 (list[idx].x3 == pt.x3 && list[idx].x2 == pt.x2 &&
302 list[idx].x1 < pt.x1))