60 using uint =
unsigned int;
64 template<
typename T1,
typename T2>
struct same_type {
static bool const yes =
false; };
65 template<
typename T>
struct same_type<
T,
T> {
static bool const yes =
true; };
73 template<
class VEX,
typename SCALAR, u
int D>
81 static_assert(
D_ == VEX::D_,
"MUI Error [point.h]: Point dimensionality mismatch" );
86 return static_cast<VEX
const &
>(*this)[i];
89 inline operator VEX & () {
return static_cast<VEX &
>(*this); }
90 inline operator VEX
const& ()
const {
return static_cast<VEX const&
>(*this); }
99 template<
typename SCALAR, u
int D>
110 explicit inline point(
float const s) {
for(
uint i = 0 ; i < D ; i++)
x[i] = s; }
111 explicit inline point(
double const s) {
for(
uint i = 0 ; i < D ; i++)
x[i] = s; }
112 explicit inline point(
int const s) {
for(
uint i = 0 ; i < D ; i++)
x[i] = s; }
114 explicit inline point(
long const s) {
for(
uint i = 0 ; i < D ; i++)
x[i] = s; }
117 explicit inline point(
float const *ps) {
for(
uint i = 0 ; i < D ; i++)
x[i] = ps[i]; }
118 explicit inline point(
double const *ps) {
for(
uint i = 0 ; i < D ; i++)
x[i] = ps[i]; }
119 explicit inline point(
int const *ps) {
for(
uint i = 0 ; i < D ; i++)
x[i] = ps[i]; }
120 explicit inline point(
uint const *ps) {
for(
uint i = 0 ; i < D ; i++)
x[i] = ps[i]; }
121 explicit inline point(
long const *ps) {
for(
uint i = 0 ; i < D ; i++)
x[i] = ps[i]; }
122 explicit inline point(
ulong const *ps) {
for(
uint i = 0 ; i < D ; i++)
x[i] = ps[i]; }
125 template<
typename ...T>
inline point(SCALAR
const head,
T const ... tail ) {
126 std::array<TYPE_,D_> s( { head,
static_cast<SCALAR
>(tail)... } );
127 for(
uint i = 0 ; i < D ; i++)
x[i] = s[i];
131 for(
uint i = 0 ; i < D ; i++)
x[i] = u[i];
139 inline SCALAR *
data() {
return x; }
140 inline SCALAR
const*
data()
const {
return x; }
144 for(
uint i = 0 ; i < D ; i++)
x[i] += u[i];
148 for(
uint i = 0 ; i < D ; i++)
x[i] -= u[i];
152 for(
uint i = 0 ; i < D ; i++)
x[i] *= u[i];
156 for(
uint i = 0 ; i < D ; i++)
x[i] /= u[i];
161 for(
uint i = 0 ; i < D ; i++)
x[i] += u;
165 for(
uint i = 0 ; i < D ; i++)
x[i] -= u;
169 for(
uint i = 0 ; i < D ; i++)
x[i] *= u;
173 for(
uint i = 0 ; i < D ; i++)
x[i] /= u;
182 template<
class E1,
class E2,
typename SCALAR, u
int D>
191 template<
class E1,
class E2,
typename SCALAR, u
int D>
200 template<
class E,
typename SCALAR, u
int D>
208 template<
class E1,
class E2,
typename SCALAR, u
int D>
217 template<
class E,
typename SCALAR, u
int D>
226 template<
class E1,
class E2,
typename SCALAR, u
int D>
235 template<
class E,
typename SCALAR, u
int D>
244 template<
class E,
typename SCALAR, u
int D>
252 template<
class E,
typename SCALAR, u
int D>
261 template<
class E,
class OP,
typename SCALAR, u
int D>
270 template<
class E1,
class E2,
class OP,
typename SCALAR, u
int D>
284 template<
class E1,
class E2,
typename SCALAR, u
int D>
inline
289 template<
class E1,
class E2,
typename SCALAR, u
int D>
inline
294 template<
class E,
typename SCALAR, u
int D>
inline
299 template<
class E1,
class E2,
typename SCALAR, u
int D>
inline
304 template<
class E,
typename SCALAR, u
int D>
inline
309 template<
class E,
typename SCALAR, u
int D>
inline
314 template<
class E,
typename SCALAR, u
int D>
inline
319 template<
class E1,
class E2,
typename SCALAR, u
int D>
inline
324 template<
class E,
typename SCALAR, u
int D>
inline
333 template<
class E1,
class E2,
typename SCALAR>
inline
336 for(
uint i=0;i<3;i++) x[i] = u[(i+1U)%3U] * v[(i+2U)%3U] - u[(i+2U)%3U] * v[(i+1U)%3U];
341 template<
class E,
class OP,
typename SCALAR, u
int D>
inline
344 for(
uint i = 1 ; i < D ; i++) core = op( core, u[i] );
349 template<
class E,
typename SCALAR, u
int D>
inline
351 return reduce( u, [](SCALAR a, SCALAR b){
return a>b?a:b;} );
355 template<
class E,
typename SCALAR, u
int D>
inline
357 return reduce( u, [](SCALAR a, SCALAR b){
return a<b?a:b;} );
361 template<
class E,
typename SCALAR, u
int D>
inline
363 return reduce( u, [](SCALAR a, SCALAR b){
return a+b;} );
367 template<
class E,
typename SCALAR, u
int D>
inline
369 return sum(u) / double(D);
373 template<
class E1,
class E2,
typename SCALAR, u
int D>
inline
379 template<
class E,
typename SCALAR, u
int D>
inline
385 template<
class E,
typename SCALAR, u
int D>
inline
387 return std::sqrt(
normsq(u) );
391 template<
class E,
class OP,
typename SCALAR, u
int D>
inline
397 template<
class E1,
class E2,
class OP,
typename SCALAR, u
int D>
inline
398 vexpr_apply2<E1, E2, OP, SCALAR, D> apply(
vexpr<E1,SCALAR,D> const &u,
vexpr<E2,SCALAR,D> const &v, OP
const& op ) {
SCALAR dot(vexpr< E1, SCALAR, D > const &u, vexpr< E2, SCALAR, D > const &v)
Definition: point.h:374
point< SCALAR, 3U > cross(vexpr< E1, SCALAR, 3U > const &u, vexpr< E2, SCALAR, 3U > const &v)
Definition: point.h:334
vexpr_sub< E1, E2, SCALAR, D > operator-(vexpr< E1, SCALAR, D > const &u, vexpr< E2, SCALAR, D > const &v)
Definition: point.h:290
vexpr_scale< E, SCALAR, D > operator/(vexpr< E, SCALAR, D > const &u, SCALAR const a)
Definition: point.h:315
SCALAR reduce(vexpr< E, SCALAR, D > const &u, OP const &op)
Definition: point.h:342
vexpr_add< E1, E2, SCALAR, D > operator+(vexpr< E1, SCALAR, D > const &u, vexpr< E2, SCALAR, D > const &v)
Definition: point.h:285
unsigned long ulong
Definition: point.h:61
SCALAR sum(vexpr< E, SCALAR, D > const &u)
Definition: point.h:362
vexpr_mul< E1, E2, SCALAR, D > operator*(vexpr< E1, SCALAR, D > const &u, vexpr< E2, SCALAR, D > const &v)
Definition: point.h:300
SCALAR mean(vexpr< E, SCALAR, D > const &u)
Definition: point.h:368
SCALAR max(vexpr< E, SCALAR, D > const &u)
Definition: point.h:350
unsigned int uint
Definition: util.h:94
SCALAR normsq(vexpr< E, SCALAR, D > const &u)
Definition: point.h:380
vexpr_apply1< E, OP, SCALAR, D > apply(vexpr< E, SCALAR, D > const &u, OP const &op)
Definition: point.h:392
SCALAR min(vexpr< E, SCALAR, D > const &u)
Definition: point.h:356
SCALAR norm(vexpr< E, SCALAR, D > const &u)
Definition: point.h:386
SCALAR const * data() const
Definition: point.h:140
point(const vexpr< E, SCALAR, D > &u)
Definition: point.h:130
point(int const *ps)
Definition: point.h:119
point & operator+=(const vexpr< E, SCALAR, D > &u)
Definition: point.h:143
point(ulong const *ps)
Definition: point.h:122
point(int const s)
Definition: point.h:112
point & operator-=(const vexpr< E, SCALAR, D > &u)
Definition: point.h:147
static const uint D_
Definition: point.h:105
point(float const *ps)
Definition: point.h:117
SCALAR TYPE_
Definition: point.h:104
SCALAR x[D]
Definition: point.h:102
SCALAR & operator[](uint i)
Definition: point.h:135
point()
Definition: point.h:108
point(float const s)
Definition: point.h:110
point(uint const *ps)
Definition: point.h:120
point & operator*=(const vexpr< E, SCALAR, D > &u)
Definition: point.h:151
point(double const *ps)
Definition: point.h:118
SCALAR * data()
Definition: point.h:139
point(double const s)
Definition: point.h:111
point(long const s)
Definition: point.h:114
point(uint const s)
Definition: point.h:113
point(long const *ps)
Definition: point.h:121
point(SCALAR const head, T const ... tail)
Definition: point.h:125
point & operator/=(const vexpr< E, SCALAR, D > &u)
Definition: point.h:155
point(ulong const s)
Definition: point.h:115
static bool const yes
Definition: point.h:64
SCALAR operator[](uint i) const
Definition: point.h:185
E2 const & v_
Definition: point.h:188
E1 const & u_
Definition: point.h:187
vexpr_add(vexpr< E1, SCALAR, D > const &u, vexpr< E2, SCALAR, D > const &v)
Definition: point.h:184
E const & u_
Definition: point.h:266
vexpr_apply1(vexpr< E, SCALAR, D > const &u, OP const &op)
Definition: point.h:263
SCALAR operator[](uint i) const
Definition: point.h:264
OP const & o_
Definition: point.h:267
SCALAR operator[](uint i) const
Definition: point.h:273
E2 const & v_
Definition: point.h:276
vexpr_apply2(vexpr< E1, SCALAR, D > const &u, vexpr< E2, SCALAR, D > const &v, OP const &op)
Definition: point.h:272
OP const & o_
Definition: point.h:277
E1 const & u_
Definition: point.h:275
SCALAR operator[](uint i) const
Definition: point.h:229
E1 const & u_
Definition: point.h:231
E2 const & v_
Definition: point.h:232
vexpr_div(vexpr< E1, SCALAR, D > const &u, vexpr< E2, SCALAR, D > const &v)
Definition: point.h:228
E1 const & u_
Definition: point.h:213
E2 const & v_
Definition: point.h:214
SCALAR operator[](uint i) const
Definition: point.h:211
vexpr_mul(vexpr< E1, SCALAR, D > const &u, vexpr< E2, SCALAR, D > const &v)
Definition: point.h:210
E const & u_
Definition: point.h:205
vexpr_neg(vexpr< E, SCALAR, D > const &u)
Definition: point.h:202
SCALAR operator[](uint i) const
Definition: point.h:203
vexpr_rcp(vexpr< E, SCALAR, D > const &u)
Definition: point.h:246
E const & u_
Definition: point.h:249
SCALAR operator[](uint i) const
Definition: point.h:247
SCALAR const a_
Definition: point.h:241
SCALAR operator[](uint i) const
Definition: point.h:238
E const & u_
Definition: point.h:240
vexpr_rscale(vexpr< E, SCALAR, D > const &u, SCALAR const a)
Definition: point.h:237
SCALAR operator[](uint i) const
Definition: point.h:255
E const & u_
Definition: point.h:258
vexpr_scale_rcp(SCALAR const a, vexpr< E, SCALAR, D > const &u)
Definition: point.h:254
SCALAR const a_
Definition: point.h:257
SCALAR const a_
Definition: point.h:223
vexpr_scale(vexpr< E, SCALAR, D > const &u, SCALAR const a)
Definition: point.h:219
E const & u_
Definition: point.h:222
SCALAR operator[](uint i) const
Definition: point.h:220
E1 const & u_
Definition: point.h:196
SCALAR operator[](uint i) const
Definition: point.h:194
E2 const & v_
Definition: point.h:197
vexpr_sub(vexpr< E1, SCALAR, D > const &u, vexpr< E2, SCALAR, D > const &v)
Definition: point.h:193
SCALAR TYPE_
Definition: point.h:75
SCALAR operator[](uint i) const
Definition: point.h:85
vexpr()
Definition: point.h:79
uint d() const
Definition: point.h:92
static const uint D_
Definition: point.h:76