30 #ifndef WFMATH_VECTOR_FUNCS_H
31 #define WFMATH_VECTOR_FUNCS_H
33 #include <wfmath/vector.h>
34 #include <wfmath/rotmatrix.h>
35 #include <wfmath/zero.h>
48 for(
int i = 0; i < dim; ++i) {
49 m_elem[i] = v.m_elem[i];
56 for(
int i = 0; i < dim; ++i) {
57 m_elem[i] = p.elements()[i];
74 for(
int i = 0; i < dim; ++i) {
75 m_elem[i] = v.m_elem[i];
82 bool Vector<dim>::isEqualTo(
const Vector<dim>& v, CoordType epsilon)
const
85 if (!v.m_valid || !m_valid) {
89 CoordType delta = _ScaleEpsilon(m_elem, v.m_elem, dim, epsilon);
90 for(
int i = 0; i < dim; ++i) {
91 if(std::fabs(m_elem[i] - v.m_elem[i]) > delta) {
102 v1.m_valid = v1.m_valid && v2.m_valid;
104 for(
int i = 0; i < dim; ++i) {
105 v1.m_elem[i] += v2.m_elem[i];
114 v1.m_valid = v1.m_valid && v2.m_valid;
116 for(
int i = 0; i < dim; ++i) {
117 v1.m_elem[i] -= v2.m_elem[i];
126 for(
int i = 0; i < dim; ++i) {
136 for(
int i = 0; i < dim; ++i) {
149 ans.m_valid = v.m_valid;
151 for(
int i = 0; i < dim; ++i) {
152 ans.m_elem[i] = -v.m_elem[i];
163 assert(
"need nonzero length vector" && mag > norm / std::numeric_limits<CoordType>::max());
165 return (*
this *= norm / mag);
173 for(
int i = 0; i < dim; ++i) {
197 assert(axis1 >= 0 && axis2 >= 0 && axis1 < dim && axis2 < dim && axis1 != axis2);
199 CoordType tmp1 = m_elem[axis1], tmp2 = m_elem[axis2];
201 ctheta = std::cos(theta);
203 m_elem[axis1] = tmp1 * ctheta - tmp2 * stheta;
204 m_elem[axis2] = tmp2 * ctheta + tmp1 * stheta;
214 return operator=(
Prod(*
this, m.
rotation(v1, v2, theta)));
220 return *
this =
Prod(*
this, m);
229 double delta = _ScaleEpsilon(v1.m_elem, v2.m_elem, dim);
233 for(
int i = 0; i < dim; ++i) {
234 ans += v1.m_elem[i] * v2.m_elem[i];
237 return (std::fabs(ans) >= delta) ? ans : 0;
245 for(
int i = 0; i < dim; ++i) {
247 ans += m_elem[i] * m_elem[i];
258 for(
int i = 0; i < dim; ++i) {
259 CoordType val1 = std::fabs(v1[i]), val2 = std::fabs(v2[i]);
270 (void) std::frexp(max1, &exp1);
271 (void) std::frexp(max2, &exp2);
299 CoordType& phi)
const;
304 template<> CoordType Vector<1>::sloppyMag()
const
305 {
return std::fabs(m_elem[0]);}
308 {m_elem[0] = x; m_elem[1] = y;}
309 template<>
Vector<3>::Vector(CoordType x, CoordType y, CoordType z) : m_valid(true)
310 {m_elem[0] = x; m_elem[1] = y; m_elem[2] = z;}
313 {
return rotate(0, 1, theta);}
316 {
return rotate(1, 2, theta);}
318 {
return rotate(2, 0, theta);}
320 {
return rotate(0, 1, theta);}
325 #endif // WFMATH_VECTOR_FUNCS_H