1#ifndef UNITTESTS_COMMON_DUMMYTRAITS
2#define UNITTESTS_COMMON_DUMMYTRAITS
3#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
4#include <OpenMesh/Core/Utils/color_cast.hh>
11template <
int DIM>
class Vec {
14 Vec(
float x) : data({ x }) {}
15 Vec(
float x,
float y) : data({ x, y }) {}
16 Vec(
float x,
float y,
float z) : data({{ x, y, z }}) {}
17 Vec(
float x,
float y,
float z,
float w) : data({ x, y, z, w }) {}
21 float &operator[](
int i) {
return data[i]; }
22 float operator[](
int i)
const {
return data[i]; }
25 std::array<float, DIM> data;
28template <
int DIM>
bool operator==(
Vec<DIM> const &lhs,
Vec<DIM> const &rhs) {
29 for (
int i = 0; i < DIM; i++)
30 if (lhs[i] != rhs[i])
return false;
35Vec<DIM> operator+(Vec<DIM>
const &lhs, Vec<DIM>
const &rhs) {
37 for (
int i = 0; i < DIM; i++)
38 result[i] = lhs[i] + rhs[i];
43Vec<DIM> operator-(Vec<DIM>
const &lhs, Vec<DIM>
const &rhs) {
45 for (
int i = 0; i < DIM; i++)
46 result[i] = lhs[i] - rhs[i];
50template <
int DIM> Vec<DIM>
operator*(Vec<DIM>
const &lhs,
float rhs) {
52 for (
int i = 0; i < DIM; i++)
53 result[i] = lhs[i] * rhs;
57template <
int DIM> Vec<DIM>
operator*(
float lhs, Vec<DIM>
const &rhs) {
61template <
int DIM> Vec<DIM> operator/(Vec<DIM>
const &lhs,
float rhs) {
63 for (
int i = 0; i < DIM; i++)
64 result[i] = lhs[i] / rhs;
68template <
int DIM> Vec<DIM> &operator+=(Vec<DIM> &lhs, Vec<DIM>
const &rhs) {
69 return lhs = lhs + rhs;
71template <
int DIM> Vec<DIM> &operator-=(Vec<DIM> &lhs, Vec<DIM>
const &rhs) {
72 return lhs = lhs - rhs;
74template <
int DIM> Vec<DIM> &operator*=(Vec<DIM> &lhs,
float rhs) {
75 return lhs = lhs * rhs;
77template <
int DIM> Vec<DIM> &operator/=(Vec<DIM> &lhs,
float rhs) {
78 return lhs = lhs / rhs;
81template <
int DIM>
float norm(Vec<DIM>
const &v) {
83 for (
int i = 0; i < DIM; i++)
85 return std::sqrt(sum);
88template <
int DIM> Vec<DIM> &normalize(Vec<DIM> &v) {
return v /= norm(v); }
89template <
int DIM> Vec<DIM> &vectorize(Vec<DIM> &v,
float val) {
90 for (
int i = 0; i < DIM; i++)
95template <
int DIM> Vec<DIM> &minimize(Vec<DIM> &v1, Vec<DIM>
const &v2) {
96 for (
int i = 0; i < DIM; i++)
97 v1[i] = std::min(v1[i], v2[i]);
101template <
int DIM> Vec<DIM> &maximize(Vec<DIM> &v1, Vec<DIM>
const &v2) {
102 for (
int i = 0; i < DIM; i++)
103 v1[i] = std::max(v1[i], v2[i]);
107template <
int DIM>
float dot(Vec<DIM>
const &v1, Vec<DIM>
const &v2) {
109 for (
int i = 0; i < DIM; i++)
110 sum += v1[i] * v2[i];
114inline Vec<3> cross(Vec<3>
const &v1, Vec<3>
const &v2) {
115 return {v1[1] * v2[2] - v1[2] * v2[1],
116 v1[2] * v2[0] - v1[0] * v2[2],
117 v1[0] * v2[1] - v1[1] * v2[0]};
124 using value_type = float;
125 static const size_t size_ = DIM;
auto operator*(const OtherScalar &_s, const VectorT< Scalar, DIM > &rhs) -> decltype(rhs.operator*(_s))
Component wise multiplication from the left.
static const size_t size_
size/dimension of the vector
static size_t size()
size/dimension of the vector