25 #include <tulip/Array.h>
26 #include <tulip/tulipconf.h>
27 #include <tulip/TlpTools.h>
32 #define VECTOR Vector<TYPE, SIZE, OTYPE, DTYPE>
33 #define TEMPLATEVECTOR template <typename TYPE, size_t SIZE, typename OTYPE, typename DTYPE>
37 template <
typename TYPE,
typename OTYPE>
38 inline OTYPE tlpsqr(
const TYPE a) {
39 return static_cast<OTYPE
>(a) *
static_cast<OTYPE
>(a);
42 template <
typename TYPE,
typename OTYPE>
43 inline TYPE tlpsqrt(
const OTYPE a) {
44 return static_cast<TYPE
>(sqrt(a));
48 inline double tlpsqrt<double, long double>(
long double a) {
49 return double(sqrtl(a));
65 template <
typename TYPE,
size_t SIZE,
typename OTYPE =
double,
typename DTYPE = TYPE>
66 class Vector :
public Array<TYPE, SIZE> {
69 memset(this->data(), 0, SIZE *
sizeof(TYPE));
71 inline Vector(
const Vector<TYPE, SIZE, OTYPE> &v) {
74 inline Vector(
const Vector<TYPE, SIZE + 1, OTYPE> &v) {
77 inline Vector(
const TYPE x) {
80 inline Vector(
const TYPE x,
const TYPE y) {
81 if (
int(SIZE) - 2 > 0)
82 memset(this->data() + 2, 0, (SIZE - 2) *
sizeof(TYPE));
85 inline Vector(
const TYPE x,
const TYPE y,
const TYPE z) {
86 if (
int(SIZE) - 3 > 0)
87 memset(this->data() + 3, 0, (SIZE - 3) *
sizeof(TYPE));
90 inline Vector(
const Vector<TYPE, 2, OTYPE> &v,
const TYPE z) {
93 inline Vector(
const TYPE x,
const TYPE y,
const TYPE z,
const TYPE w) {
96 inline Vector(
const Vector<TYPE, 2, OTYPE> &v,
const TYPE z,
const TYPE w) {
99 inline Vector(
const Vector<TYPE, 3, OTYPE> &v,
const TYPE w) {
103 inline void set(
const TYPE x) {
106 inline void set(
const TYPE x,
const TYPE y) {
111 inline void set(
const TYPE x,
const TYPE y,
const TYPE z) {
117 inline void set(
const TYPE x,
const TYPE y,
const TYPE z,
const TYPE w) {
124 inline void set(
const Vector<TYPE, 2, OTYPE> &v,
const TYPE z) {
126 memcpy(this->data(), v.data(), 2 *
sizeof(TYPE));
129 inline void set(
const Vector<TYPE, 2, OTYPE> &v,
const TYPE z,
const TYPE w) {
131 memcpy(this->data(), v.data(), 2 *
sizeof(TYPE));
135 inline void set(
const Vector<TYPE, 3, OTYPE> &v,
const TYPE w) {
137 memcpy(this->data(), v.data(), 3 *
sizeof(TYPE));
140 inline void set(
const Vector<TYPE, SIZE, OTYPE> &v) {
141 memcpy(this->data(), v.data(), SIZE *
sizeof(TYPE));
143 inline void set(
const Vector<TYPE, SIZE + 1, OTYPE> &v) {
144 memcpy(this->data(), v.data(), SIZE *
sizeof(TYPE));
146 inline void get(TYPE &x)
const {
149 inline void get(TYPE &x, TYPE &y)
const {
154 inline void get(TYPE &x, TYPE &y, TYPE &z)
const {
160 inline void get(TYPE &x, TYPE &y, TYPE &z, TYPE &w)
const {
169 inline TYPE x()
const {
172 inline TYPE y()
const {
176 inline TYPE z()
const {
180 inline TYPE w()
const {
201 inline TYPE width()
const {
204 inline TYPE height()
const {
207 inline TYPE depth()
const {
211 inline TYPE &width() {
214 inline TYPE &height() {
217 inline TYPE &depth() {
221 inline TYPE r()
const {
224 inline TYPE g()
const {
227 inline TYPE b()
const {
230 inline TYPE a()
const {
247 inline TYPE s()
const {
250 inline TYPE t()
const {
253 inline TYPE p()
const {
256 inline TYPE q()
const {
273 inline void setX(TYPE xx) {
276 inline void setY(TYPE yy) {
279 inline void setZ(TYPE zz) {
283 inline TYPE getX()
const {
286 inline TYPE getY()
const {
289 inline TYPE getZ()
const {
293 inline void setW(
const TYPE width) {
297 inline void setH(
const TYPE height) {
301 inline void setD(
const TYPE depth) {
305 inline TYPE getW()
const {
308 inline TYPE getH()
const {
311 inline TYPE getD()
const {
315 inline VECTOR &operator*=(
const TYPE);
316 inline VECTOR &operator*=(
const VECTOR &);
317 inline VECTOR &operator/=(
const TYPE);
318 inline VECTOR &operator/=(
const VECTOR &);
319 inline VECTOR &operator+=(
const TYPE);
320 inline VECTOR &operator+=(
const VECTOR &);
321 inline VECTOR &operator-=(
const TYPE);
322 inline VECTOR &operator-=(
const VECTOR &);
323 inline VECTOR &operator^=(
const VECTOR &);
325 inline bool operator>(
const VECTOR &)
const;
326 inline bool operator<(
const VECTOR &)
const;
327 inline bool operator!=(
const VECTOR &)
const;
328 inline bool operator==(
const VECTOR &)
const;
329 inline VECTOR &fill(
const TYPE obj);
330 inline TYPE norm()
const;
331 inline TYPE length()
const {
334 inline VECTOR &normalize() {
337 for (
size_t i = 0; i < SIZE; ++i)
338 tmp += tlpsqr<TYPE, OTYPE>((*
this)[i]);
340 if (tmp < sqrt(std::numeric_limits<TYPE>::epsilon())) {
344 for (
size_t i = 0; i < SIZE; ++i) {
346 (*this)[i] = -tlpsqrt<TYPE, OTYPE>(tlpsqr<TYPE, OTYPE>((*
this)[i]) / tmp);
348 (*
this)[i] = tlpsqrt<TYPE, OTYPE>(tlpsqr<TYPE, OTYPE>((*
this)[i]) / tmp);
353 inline DTYPE dist(
const VECTOR &)
const;
354 inline TYPE dotProduct(
const VECTOR &)
const;
356 inline VECTOR &operator=(
const VECTOR &) =
default;
360 inline TYPE dotProduct(
const VECTOR &a,
const VECTOR &b) {
361 return a.dotProduct(b);
365 inline TYPE dist(
const VECTOR &a,
const VECTOR &b) {
375 inline VECTOR minVector(
const VECTOR &u,
const VECTOR &v) {
378 for (
size_t i = 0; i < SIZE; ++i)
379 tmp[i] = std::min(u[i], v[i]);
389 inline VECTOR maxVector(
const VECTOR &u,
const VECTOR &v) {
392 for (
size_t i = 0; i < SIZE; ++i)
393 tmp[i] = std::max(u[i], v[i]);
402 inline void minMaxVectors(
const VECTOR &u,
const VECTOR &v, VECTOR &min, VECTOR &max) {
403 for (
size_t i = 0; i < SIZE; ++i) {
415 inline VECTOR operator*(
const VECTOR &,
const VECTOR &);
417 inline VECTOR operator*(
const TYPE,
const VECTOR &);
419 inline VECTOR operator*(
const VECTOR &,
const TYPE);
422 inline VECTOR operator+(
const VECTOR &,
const VECTOR &);
424 inline VECTOR operator+(
const VECTOR &,
const TYPE);
427 inline VECTOR operator-(
const VECTOR &,
const VECTOR &);
429 inline VECTOR operator-(
const VECTOR &,
const TYPE);
432 inline VECTOR operator/(
const VECTOR &,
const VECTOR &);
434 inline VECTOR operator/(
const VECTOR &,
const TYPE);
437 inline VECTOR operator^(
const VECTOR &,
const VECTOR &);
439 inline VECTOR operator-(
const VECTOR &);
443 typedef Vector<unsigned int, 2> Vec2ui;
447 typedef Vector<unsigned int, 3> Vec3ui;
451 typedef Vector<unsigned int, 4> Vec4ui;
455 typedef Vector<int, 2> Vec2i;
459 typedef Vector<int, 3> Vec3i;
463 typedef Vector<int, 4> Vec4i;
467 typedef Vector<double, 2, long double> Vec2d;
471 typedef Vector<double, 3, long double> Vec3d;
475 typedef Vector<double, 4, long double> Vec4d;
479 typedef Vector<float, 2, double> Vec2f;
483 typedef Vector<float, 3, double> Vec3f;
487 typedef Vector<float, 4, double> Vec4f;
491 static double sqrt(tlp::Vector<float, 5> &v) {
492 return sqrt((
double)v[0]);
495 template class TLP_SCOPE tlp::Vector<unsigned char, 4>;
501 size_t hash_vector(
const tlp::VECTOR &v) {
504 for (
size_t i = 0; i < SIZE; ++i) {
505 tlp_hash_combine(seed, v[i]);
512 struct hash<tlp::Vec2ui> {
513 inline std::size_t operator()(
const tlp::Vec2ui &v)
const {
514 return hash_vector(v);
519 struct hash<tlp::Vec3ui> {
520 inline std::size_t operator()(
const tlp::Vec3ui &v)
const {
521 return hash_vector(v);
526 struct hash<tlp::Vec4ui> {
527 inline std::size_t operator()(
const tlp::Vec4ui &v)
const {
528 return hash_vector(v);
533 struct hash<tlp::Vec2i> {
534 inline std::size_t operator()(
const tlp::Vec2i &v)
const {
535 return hash_vector(v);
540 struct hash<tlp::Vec3i> {
541 inline std::size_t operator()(
const tlp::Vec3i &v)
const {
542 return hash_vector(v);
547 struct hash<tlp::Vec4i> {
548 inline std::size_t operator()(
const tlp::Vec4i &v)
const {
549 return hash_vector(v);
554 struct hash<tlp::Vec2d> {
555 inline std::size_t operator()(
const tlp::Vec2d &v)
const {
556 return hash_vector(v);
561 struct hash<tlp::Vec3d> {
562 inline std::size_t operator()(
const tlp::Vec3f &v)
const {
563 return hash_vector(v);
568 struct hash<tlp::Vec4d> {
569 inline std::size_t operator()(
const tlp::Vec4d &v)
const {
570 return hash_vector(v);
575 struct hash<tlp::Vec2f> {
576 inline std::size_t operator()(
const tlp::Vec2f &v)
const {
577 return hash_vector(v);
582 struct hash<tlp::Vec3f> {
583 inline std::size_t operator()(
const tlp::Vec3f &v)
const {
584 return hash_vector(v);
589 struct hash<tlp::Vec4f> {
590 inline std::size_t operator()(
const tlp::Vec4f &v)
const {
591 return hash_vector(v);
596 #include "cxx/Vector.cxx"
600 #undef TEMPLATEVECTOR