42 #ifndef OPENMESH_SRC_OPENMESH_CORE_GEOMETRY_VECTOR11T_HH_ 43 #define OPENMESH_SRC_OPENMESH_CORE_GEOMETRY_VECTOR11T_HH_ 49 #include <type_traits> 58 #include <OpenMesh/Core/System/config.h> 66 template<
typename ... Ts>
67 struct are_convertible_to;
69 template<
typename To,
typename From,
typename ... Froms>
70 struct are_convertible_to<To, From, Froms...> {
71 static constexpr
bool value = std::is_convertible<From, To>::value
72 && are_convertible_to<To, Froms...>::value;
75 template<
typename To,
typename From>
76 struct are_convertible_to<To, From> :
public std::is_convertible<From, To> {
82 template<
typename Scalar,
int DIM>
85 static_assert(DIM >= 1,
"VectorT requires positive dimensionality.");
88 using container = std::array<Scalar, DIM>;
102 static constexpr
int dim() {
107 static constexpr
size_t size() {
111 static constexpr
const size_t size_ = DIM;
117 template<
typename T,
typename ... Ts,
118 typename =
typename std::enable_if<
sizeof...(Ts)+1 == DIM>::type,
119 typename =
typename std::enable_if<
120 are_convertible_to<Scalar, T, Ts...>::value>::type>
121 constexpr
VectorT(T v, Ts... vs) : values_ { {
static_cast<Scalar
>(v), static_cast<Scalar>(vs)...} } {
122 static_assert(
sizeof...(Ts)+1 == DIM,
123 "Invalid number of components specified in constructor.");
124 static_assert(are_convertible_to<Scalar, T, Ts...>::value,
125 "Not all components are convertible to Scalar.");
147 template<
typename S = Scalar,
int D = DIM>
149 typename
std::enable_if<D == 4,
150 VectorT<decltype(
std::declval<S>()/
std::declval<S>()), DIM>>::type {
151 static_assert(D == DIM,
"D and DIM need to be identical. (Never " 152 "override the default template arguments.)");
153 static_assert(std::is_same<S, Scalar>::value,
"S and Scalar need " 154 "to be the same type. (Never override the default template " 157 values_[0]/values_[3],
158 values_[1]/values_[3],
159 values_[2]/values_[3],
164 template<
typename Iterator,
166 *std::declval<Iterator&>(),
void(),
167 ++std::declval<Iterator&>(),
void())>
169 std::copy_n(it, DIM, values_.begin());
178 template<
typename otherScalarType,
179 typename =
typename std::enable_if<
180 std::is_convertible<otherScalarType, Scalar>::value>>
188 template<
typename OtherScalar,
189 typename =
typename std::enable_if<
190 std::is_convertible<OtherScalar, Scalar>::value>>
192 std::transform(_rhs.cbegin(), _rhs.cend(),
193 this->begin(), [](OtherScalar rhs) {
194 return static_cast<Scalar
>(std::move(rhs));
200 Scalar*
data() {
return values_.data(); }
203 const Scalar*
data()
const {
return values_.data(); }
223 return std::equal(_rhs.values_.cbegin(), _rhs.values_.cend(), values_.cbegin());
228 return !std::equal(_rhs.values_.cbegin(), _rhs.values_.cend(), values_.cbegin());
234 template<
typename OtherScalar>
236 typename std::enable_if<std::is_convertible<
237 decltype(this->values_[0] * _s), Scalar>::value,
239 for (
auto& e : *
this) {
246 template<
typename OtherScalar>
248 typename std::enable_if<std::is_convertible<
249 decltype(this->values_[0] / _s), Scalar>::value,
251 for (
auto& e : *
this) {
258 template<
typename OtherScalar>
259 typename std::enable_if<std::is_convertible<
260 decltype(std::declval<Scalar>() * std::declval<OtherScalar>()),
264 return vector_type(*
this) *= _s;
268 template<
typename OtherScalar>
269 typename std::enable_if<std::is_convertible<
270 decltype(std::declval<Scalar>() / std::declval<OtherScalar>()),
274 return vector_type(*
this) /= _s;
280 template<
typename OtherScalar>
282 typename std::enable_if<
283 sizeof(decltype(this->values_[0] * *_rhs.
data())) >= 0,
284 vector_type&>::type {
285 for (
int i = 0; i < DIM; ++i) {
286 data()[i] *= _rhs.
data()[i];
292 template<
typename OtherScalar>
294 typename std::enable_if<
295 sizeof(decltype(this->values_[0] / *_rhs.
data())) >= 0,
296 vector_type&>::type {
297 for (
int i = 0; i < DIM; ++i) {
298 data()[i] /= _rhs.
data()[i];
304 template<
typename OtherScalar>
306 typename std::enable_if<
307 sizeof(decltype(this->values_[0] - *_rhs.
data())) >= 0,
308 vector_type&>::type {
309 for (
int i = 0; i < DIM; ++i) {
310 data()[i] -= _rhs.
data()[i];
316 template<
typename OtherScalar>
318 typename std::enable_if<
319 sizeof(decltype(this->values_[0] + *_rhs.
data())) >= 0,
320 vector_type&>::type {
321 for (
int i = 0; i < DIM; ++i) {
322 data()[i] += _rhs.
data()[i];
328 template<
typename OtherScalar>
330 typename std::enable_if<
331 sizeof(decltype(this->values_[0] * *_rhs.
data())) >= 0,
333 return vector_type(*
this) *= _rhs;
337 template<
typename OtherScalar>
339 typename std::enable_if<
340 sizeof(decltype(this->values_[0] / *_rhs.
data())) >= 0,
342 return vector_type(*
this) /= _rhs;
346 template<
typename OtherScalar>
348 typename std::enable_if<
349 sizeof(decltype(this->values_[0] + *_rhs.
data())) >= 0,
351 return vector_type(*
this) += _rhs;
355 template<
typename OtherScalar>
357 typename std::enable_if<
358 sizeof(decltype(this->values_[0] - *_rhs.
data())) >= 0,
360 return vector_type(*
this) -= _rhs;
366 std::transform(values_.begin(), values_.end(), v.values_.begin(),
367 [](
const Scalar &s) {
return -s; });
373 template<
typename OtherScalar>
375 typename std::enable_if<DIM == 3,
376 VectorT<decltype((*
this)[0] * _rhs[0] -
377 (*
this)[0] * _rhs[0]), DIM>>::type {
379 values_[1] * _rhs[2] - values_[2] * _rhs[1],
380 values_[2] * _rhs[0] - values_[0] * _rhs[2],
381 values_[0] * _rhs[1] - values_[1] * _rhs[0]
387 template<
typename OtherScalar>
389 decltype(*
this % _rhs)
397 template<
typename OtherScalar>
399 decltype(*this->data() * *_rhs.
data()) {
401 return std::inner_product(begin() + 1, begin() + DIM, _rhs.begin() + 1,
402 *begin() * *_rhs.begin());
407 template<
typename OtherScalar>
409 decltype(*
this | _rhs)
420 template<
typename S = Scalar>
421 decltype(std::declval<S>() * std::declval<S>()) sqrnorm()
const {
422 static_assert(std::is_same<S, Scalar>::value,
"S and Scalar need " 423 "to be the same type. (Never override the default template " 425 typedef decltype(values_[0] * values_[0]) RESULT;
426 return std::accumulate(values_.cbegin() + 1, values_.cend(),
427 values_[0] * values_[0],
428 [](
const RESULT &l,
const Scalar &r) {
return l + r * r; });
432 template<
typename S = Scalar>
434 decltype(
std::sqrt(
std::declval<
VectorT<S, DIM>>().sqrnorm())) {
435 static_assert(std::is_same<S, Scalar>::value,
"S and Scalar need " 436 "to be the same type. (Never override the default template " 438 return std::sqrt(sqrnorm());
441 template<
typename S = Scalar>
443 decltype(
std::declval<
VectorT<S, DIM>>().norm()) {
444 static_assert(std::is_same<S, Scalar>::value,
"S and Scalar need " 445 "to be the same type. (Never override the default template " 452 template<
typename S = Scalar>
455 static_assert(std::is_same<S, Scalar>::value,
"S and Scalar need " 456 "to be the same type. (Never override the default template " 458 return *
this /= norm();
463 template<
typename S = Scalar>
465 decltype(*this /
std::declval<
VectorT<S, DIM>>().norm()) {
466 static_assert(std::is_same<S, Scalar>::value,
"S and Scalar need " 467 "to be the same type. (Never override the default template " 469 return *
this / norm();
474 template<
typename S = Scalar>
475 typename std::enable_if<
481 static_assert(std::is_same<S, Scalar>::value,
"S and Scalar need " 482 "to be the same type. (Never override the default template " 485 if (n !=
static_cast<decltype(norm())
>(0)) {
500 return std::accumulate(
501 values_.cbegin() + 1, values_.cend(), values_[0]);
518 return *std::max_element(values_.cbegin(), values_.cend());
524 *std::max_element(values_.cbegin(), values_.cend(),
525 [](
const Scalar &a,
const Scalar &b) {
526 return std::abs(a) < std::abs(b);
532 return *std::min_element(values_.cbegin(), values_.cend());
538 *std::min_element(values_.cbegin(), values_.cend(),
539 [](
const Scalar &a,
const Scalar &b) {
540 return std::abs(a) < std::abs(b);
546 return l1_norm()/DIM;
551 return std::accumulate(values_.cbegin() + 1, values_.cend(),
552 std::abs(values_[0]),
553 [](
const Scalar &l,
const Scalar &r) {
554 return l + std::abs(r);
560 std::transform(values_.cbegin(), values_.cend(),
561 _rhs.values_.cbegin(),
563 [](
const Scalar &l,
const Scalar &r) {
564 return std::min(l, r);
572 std::transform(values_.cbegin(), values_.cend(),
573 _rhs.values_.cbegin(),
575 [&result](
const Scalar &l,
const Scalar &r) {
588 std::transform(values_.cbegin(), values_.cend(),
589 _rhs.values_.cbegin(),
591 [](
const Scalar &l,
const Scalar &r) {
592 return std::max(l, r);
600 std::transform(values_.cbegin(), values_.cend(),
601 _rhs.values_.cbegin(),
603 [&result](
const Scalar &l,
const Scalar &r) {
615 inline vector_type
min(
const vector_type& _rhs)
const {
616 return vector_type(*this).
minimize(_rhs);
620 inline vector_type
max(
const vector_type& _rhs)
const {
621 return vector_type(*this).
maximize(_rhs);
629 template<
typename Functor>
630 inline vector_type
apply(
const Functor& _func)
const {
632 std::transform(result.values_.cbegin(), result.values_.cend(),
633 result.values_.begin(), _func);
639 std::fill(values_.begin(), values_.end(), _s);
650 return std::lexicographical_compare(
651 values_.begin(), values_.end(),
652 _rhs.values_.begin(), _rhs.values_.end());
657 noexcept(noexcept(std::swap(values_, _other.values_))) {
658 std::swap(values_, _other.values_);
666 using iterator =
typename container::iterator;
667 using const_iterator =
typename container::const_iterator;
668 using reverse_iterator =
typename container::reverse_iterator;
669 using const_reverse_iterator =
typename container::const_reverse_iterator;
671 iterator begin() noexcept {
return values_.begin(); }
672 const_iterator begin()
const noexcept {
return values_.cbegin(); }
673 const_iterator cbegin()
const noexcept {
return values_.cbegin(); }
675 iterator end() noexcept {
return values_.end(); }
676 const_iterator end()
const noexcept {
return values_.cend(); }
677 const_iterator cend()
const noexcept {
return values_.cend(); }
679 reverse_iterator rbegin() noexcept {
return values_.rbegin(); }
680 const_reverse_iterator rbegin()
const noexcept {
return values_.crbegin(); }
681 const_reverse_iterator crbegin()
const noexcept {
return values_.crbegin(); }
683 reverse_iterator rend() noexcept {
return values_.rend(); }
684 const_reverse_iterator rend()
const noexcept {
return values_.crend(); }
685 const_reverse_iterator crend()
const noexcept {
return values_.crend(); }
691 template<
typename Scalar,
int DIM,
typename OtherScalar>
693 decltype(rhs.operator*(_s)) {
699 template<
typename Scalar,
int DIM>
700 auto operator<<(std::ostream& os, const VectorT<Scalar, DIM> &_vec) ->
701 typename std::enable_if<
702 sizeof(decltype(os << _vec[0])) >= 0, std::ostream&>::type {
705 for (
int i = 1; i < DIM; ++i) {
706 os <<
" " << _vec[i];
712 template<
typename Scalar,
int DIM>
714 typename std::enable_if<
715 sizeof(decltype(is >> _vec[0])) >= 0, std::istream &>::type {
716 for (
int i = 0; i < DIM; ++i)
723 template<
typename Scalar,
int DIM>
730 template<
typename LScalar,
typename RScalar,
int DIM>
733 decltype(_v1 % _v2) {
739 template<
typename Scalar,
int DIM>
741 noexcept(noexcept(_v1.swap(_v2))) {
747 template<
typename Scalar,
int DIM>
754 template<
typename Scalar,
int DIM>
760 template<
typename Scalar,
int DIM,
typename OtherScalar>
767 template<
typename Scalar,
int DIM>
774 template<
typename Scalar,
int DIM>
781 template<
typename Scalar,
int DIM>
788 template<
typename Scalar,
int DIM>
795 template<
typename Scalar,
int DIM>
917 constexpr
OpenMesh::Vec4f operator"" _htmlColor(
unsigned long long raw_color) {
919 ((raw_color >> 24) & 0xFF) / 255.0f,
920 ((raw_color >> 16) & 0xFF) / 255.0f,
921 ((raw_color >> 8) & 0xFF) / 255.0f,
922 ((raw_color >> 0) & 0xFF) / 255.0f);
vector_type & maximize(const vector_type &_rhs)
maximize values: same as *this = max(*this, _rhs), but faster
Definition: Vector11T.hh:587
auto operator*=(const OtherScalar &_s) -> typename std::enable_if< std::is_convertible< decltype(this->values_[0] *_s), Scalar >::value, VectorT< Scalar, DIM > &>::type
component-wise self-multiplication with scalar
Definition: Vector11T.hh:235
auto normalize() -> decltype(*this/=std::declval< VectorT< S, DIM >>().norm())
normalize vector, return normalized vector
Definition: Vector11T.hh:453
Scalar max_abs() const
return the maximal absolute component
Definition: Vector11T.hh:522
vector_type &::type normalize_cond()
compute squared euclidean norm
Definition: Vector11T.hh:480
VectorT< float, 4 > Vec4f
4-float vector
Definition: Vector11T.hh:869
VectorT< Scalar, DIM > vector_type
type of this vector
Definition: Vector11T.hh:99
Scalar norm(const VectorT< Scalar, DIM > &_v)
Definition: Vector11T.hh:748
Scalar & operator[](size_t _i)
get i'th element read-write
Definition: Vector11T.hh:208
bool minimized(const vector_type &_rhs)
minimize values and signalize coordinate minimization
Definition: Vector11T.hh:570
static constexpr size_t size()
returns dimension of the vector
Definition: Vector11T.hh:107
VectorT(const VectorT< otherScalarType, DIM > &_rhs)
copy & cast constructor (explicit)
Definition: Vector11T.hh:181
auto homogenized() const -> typename std::enable_if< D==4, VectorT< decltype(std::declval< S >()/std::declval< S >()), DIM >>::type
Only for 4-component vectors with division operator on their Scalar: Dehomogenization.
Definition: Vector11T.hh:148
Scalar l8_norm() const
compute l8_norm
Definition: Vector11T.hh:505
Scalar max() const
return the maximal component
Definition: Vector11T.hh:517
Scalar sqrnorm(const VectorT< Scalar, DIM > &_v)
Definition: Vector11T.hh:755
void swap(VectorT &_other) noexcept(noexcept(std::swap(values_, _other.values_)))
swap with another vector
Definition: Vector11T.hh:656
VectorT(const Scalar &v)
Creates a vector with all components set to v.
Definition: Vector11T.hh:134
decltype(std::declval< S >() *std::declval< S >()) sqrnorm() const
compute squared euclidean norm
Definition: Vector11T.hh:421
auto cross(const VectorT< LScalar, DIM > &_v1, const VectorT< RScalar, DIM > &_v2) -> decltype(_v1 % _v2)
Definition: Vector11T.hh:732
vector_type max(const vector_type &_rhs) const
component-wise max
Definition: Vector11T.hh:620
bool operator==(const vector_type &_rhs) const
component-wise comparison
Definition: Vector11T.hh:222
auto normalized() const -> decltype(*this/std::declval< VectorT< S, DIM >>().norm())
return normalized vector
Definition: Vector11T.hh:464
Definition: Vector11T.hh:83
VectorT< Scalar, DIM > & normalize(VectorT< Scalar, DIM > &_v)
Definition: Vector11T.hh:768
auto cross(const VectorT< OtherScalar, DIM > &_rhs) const -> decltype(*this % _rhs)
cross product: only defined for Vec3* as specialization
Definition: Vector11T.hh:388
auto operator/=(const OtherScalar &_s) -> typename std::enable_if< std::is_convertible< decltype(this->values_[0]/_s), Scalar >::value, VectorT< Scalar, DIM > &>::type
component-wise self-division by scalar
Definition: Vector11T.hh:247
static vector_type vectorized(const Scalar &_s)
store the same value in each component
Definition: Vector11T.hh:644
vector_type & operator=(const VectorT< OtherScalar, DIM > &_rhs)
cast from vector with a different scalar type
Definition: Vector11T.hh:191
vector_type operator-(void) const
unary minus
Definition: Vector11T.hh:364
VectorT< Scalar, DIM > & vectorize(VectorT< Scalar, DIM > &_v, OtherScalar const &_val)
Definition: Vector11T.hh:761
Scalar value_type
the type of the scalar used in this template
Definition: Vector11T.hh:96
auto length() const -> decltype(std::declval< VectorT< S, DIM >>().norm())
compute squared euclidean norm
Definition: Vector11T.hh:442
void swap(VectorT< Scalar, DIM > &_v1, VectorT< Scalar, DIM > &_v2) noexcept(noexcept(_v1.swap(_v2)))
Definition: Vector11T.hh:740
VectorT(Iterator it)
construct from a value array or any other iterator
Definition: Vector11T.hh:168
Scalar min_abs() const
return the minimal absolute component
Definition: Vector11T.hh:536
std::enable_if< std::is_convertible< decltype(std::declval< Scalar >) *std::declval< OtherScalar >)), Scalar >::value, VectorT< Scalar, DIM > >::type operator*(const OtherScalar &_s) const
component-wise multiplication with scalar
Definition: Vector11T.hh:263
std::enable_if< std::is_convertible< decltype(std::declval< Scalar >)/std::declval< OtherScalar >)), Scalar >::value, VectorT< Scalar, DIM > >::type operator/(const OtherScalar &_s) const
component-wise division by with scalar
Definition: Vector11T.hh:273
Scalar l1_norm() const
compute L1 (Manhattan) norm
Definition: Vector11T.hh:499
bool operator!=(const vector_type &_rhs) const
component-wise comparison
Definition: Vector11T.hh:227
const Scalar * data() const
access to const Scalar array
Definition: Vector11T.hh:203
Scalar dot(const VectorT< Scalar, DIM > &_v1, const VectorT< Scalar, DIM > &_v2)
Definition: Vector11T.hh:724
VectorT< Scalar, DIM > & maximize(VectorT< Scalar, DIM > &_v1, VectorT< Scalar, DIM > &_v2)
Definition: Vector11T.hh:775
Scalar mean_abs() const
return absolute arithmetic mean
Definition: Vector11T.hh:550
VectorT< Scalar, DIM > max(const VectorT< Scalar, DIM > &_v1, const VectorT< Scalar, DIM > &_v2)
Definition: Vector11T.hh:789
vector_type apply(const Functor &_func) const
component-wise apply function object with Scalar operator()(Scalar).
Definition: Vector11T.hh:630
Scalar min() const
return the minimal component
Definition: Vector11T.hh:531
vector_type min(const vector_type &_rhs) const
component-wise min
Definition: Vector11T.hh:615
auto dot(const VectorT< OtherScalar, DIM > &_rhs) const -> decltype(*this|_rhs)
compute scalar product
Definition: Vector11T.hh:408
VectorT< Scalar, DIM > min(const VectorT< Scalar, DIM > &_v1, const VectorT< Scalar, DIM > &_v2)
Definition: Vector11T.hh:796
VectorT(container &&_array)
construct from an array
Definition: Vector11T.hh:173
auto norm() const -> decltype(std::sqrt(std::declval< VectorT< S, DIM >>().sqrnorm()))
compute euclidean norm
Definition: Vector11T.hh:433
bool operator<(const vector_type &_rhs) const
lexicographical comparison
Definition: Vector11T.hh:649
vector_type & vectorize(const Scalar &_s)
store the same value in each component (e.g. to clear all entries)
Definition: Vector11T.hh:638
constexpr VectorT()
default constructor creates uninitialized values.
Definition: Vector11T.hh:129
bool maximized(const vector_type &_rhs)
maximize values and signalize coordinate maximization
Definition: Vector11T.hh:598
auto operator*(const OtherScalar &_s, const VectorT< Scalar, DIM > &rhs) -> decltype(rhs.operator*(_s))
Component wise multiplication from the left.
Definition: Vector11T.hh:692
Scalar * data()
access to Scalar array
Definition: Vector11T.hh:200
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition: MeshItems.hh:59
VectorT< Scalar, DIM > & minimize(VectorT< Scalar, DIM > &_v1, VectorT< Scalar, DIM > &_v2)
Definition: Vector11T.hh:782
const Scalar & operator[](size_t _i) const
get i'th element read-only
Definition: Vector11T.hh:214
static constexpr int dim()
returns dimension of the vector (deprecated)
Definition: Vector11T.hh:102
auto operator|(const VectorT< OtherScalar, DIM > &_rhs) const -> decltype(*this->data() **_rhs.data())
compute scalar product
Definition: Vector11T.hh:398
Scalar mean() const
return arithmetic mean
Definition: Vector11T.hh:545
vector_type & minimize(const vector_type &_rhs)
minimize values: same as *this = min(*this, _rhs), but faster
Definition: Vector11T.hh:559