OpenMesh
VectorT.hh
1/* ========================================================================= *
2 * *
3 * OpenMesh *
4 * Copyright (c) 2001-2023, RWTH-Aachen University *
5 * Department of Computer Graphics and Multimedia *
6 * All rights reserved. *
7 * www.openmesh.org *
8 * *
9 *---------------------------------------------------------------------------*
10 * This file is part of OpenMesh. *
11 *---------------------------------------------------------------------------*
12 * *
13 * Redistribution and use in source and binary forms, with or without *
14 * modification, are permitted provided that the following conditions *
15 * are met: *
16 * *
17 * 1. Redistributions of source code must retain the above copyright notice, *
18 * this list of conditions and the following disclaimer. *
19 * *
20 * 2. Redistributions in binary form must reproduce the above copyright *
21 * notice, this list of conditions and the following disclaimer in the *
22 * documentation and/or other materials provided with the distribution. *
23 * *
24 * 3. Neither the name of the copyright holder nor the names of its *
25 * contributors may be used to endorse or promote products derived from *
26 * this software without specific prior written permission. *
27 * *
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39 * *
40 * ========================================================================= */
41
42
43
44
45
46//=============================================================================
47//
48// CLASS VectorT
49//
50//=============================================================================
51
52// Don't parse this header file with doxygen since
53// for some reason (obviously due to a bug in doxygen,
54// bugreport: https://bugzilla.gnome.org/show_bug.cgi?id=629182)
55// macro expansion and preprocessor defines
56// don't work properly.
57
58#if ((defined(_MSC_VER) && (_MSC_VER >= 1900)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)) && !defined(OPENMESH_VECTOR_LEGACY)
59#include "Vector11T.hh"
60#else
61#ifndef DOXYGEN
62
63#ifndef OPENMESH_VECTOR_HH
64#define OPENMESH_VECTOR_HH
65
66
67//== INCLUDES =================================================================
68
69#include <OpenMesh/Core/System/config.h>
70#include <ostream>
71#include <cmath>
72#include <cassert>
73#include <cstring>
74
75#if defined(__GNUC__) && defined(__SSE__)
76#include <xmmintrin.h>
77#endif
78
79//== NAMESPACES ===============================================================
80
81
82namespace OpenMesh {
83
84
85//== CLASS DEFINITION =========================================================
86
87
97template<typename Scalar, int N> class VectorDataT {
98 public:
99 Scalar values_[N];
100};
101
102
103#if defined(__GNUC__) && defined(__SSE__)
104
106template<> class VectorDataT<float, 4> {
107 public:
108 union {
109 __m128 m128;
110 float values_[4];
111 };
112};
113
114#endif
115
116
117
118
119//== CLASS DEFINITION =========================================================
120
121
122#define DIM N
123#define TEMPLATE_HEADER template <typename Scalar, int N>
124#define CLASSNAME VectorT
125#define DERIVED VectorDataT<Scalar,N>
126#define unroll(expr) for (int i=0; i<N; ++i) expr(i)
127
133#include "VectorT_inc.hh"
134
135#undef DIM
136#undef TEMPLATE_HEADER
137#undef CLASSNAME
138#undef DERIVED
139#undef unroll
140
141
142
143
144//== PARTIAL TEMPLATE SPECIALIZATIONS =========================================
145#if OM_PARTIAL_SPECIALIZATION
146
147
148#define TEMPLATE_HEADER template <typename Scalar>
149#define CLASSNAME VectorT<Scalar,DIM>
150#define DERIVED VectorDataT<Scalar,DIM>
151
152
153#define DIM 2
154#define unroll(expr) expr(0) expr(1)
155#define unroll_comb(expr, op) expr(0) op expr(1)
156#define unroll_csv(expr) expr(0), expr(1)
157#include "VectorT_inc.hh"
158#undef DIM
159#undef unroll
160#undef unroll_comb
161#undef unroll_csv
162
163
164#define DIM 3
165#define unroll(expr) expr(0) expr(1) expr(2)
166#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2)
167#define unroll_csv(expr) expr(0), expr(1), expr(2)
168#include "VectorT_inc.hh"
169#undef DIM
170#undef unroll
171#undef unroll_comb
172#undef unroll_csv
173
174
175#define DIM 4
176#define unroll(expr) expr(0) expr(1) expr(2) expr(3)
177#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3)
178#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3)
179#include "VectorT_inc.hh"
180#undef DIM
181#undef unroll
182#undef unroll_comb
183#undef unroll_csv
184
185#define DIM 5
186#define unroll(expr) expr(0) expr(1) expr(2) expr(3) expr(4)
187#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) op expr(4)
188#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3), expr(4)
189#include "VectorT_inc.hh"
190#undef DIM
191#undef unroll
192#undef unroll_comb
193#undef unroll_csv
194
195#define DIM 6
196#define unroll(expr) expr(0) expr(1) expr(2) expr(3) expr(4) expr(5)
197#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) op expr(4) op expr(5)
198#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3), expr(4), expr(5)
199#include "VectorT_inc.hh"
200#undef DIM
201#undef unroll
202#undef unroll_comb
203#undef unroll_csv
204
205
206#undef TEMPLATE_HEADER
207#undef CLASSNAME
208#undef DERIVED
209
210
211
212
213//== FULL TEMPLATE SPECIALIZATIONS ============================================
214#else
215
217template<>
218inline VectorT<float,3>
220{
221 return
222 VectorT<float,3>(values_[1]*_rhs.values_[2]-values_[2]*_rhs.values_[1],
223 values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2],
224 values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]);
225}
226
227
229template<>
232{
233 return
234 VectorT<double,3>(values_[1]*_rhs.values_[2]-values_[2]*_rhs.values_[1],
235 values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2],
236 values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]);
237}
238
239#endif
240
241
242
243//== GLOBAL FUNCTIONS =========================================================
244
245
248template<typename Scalar1, typename Scalar2,int N>
249inline VectorT<Scalar1,N> operator*(Scalar2 _s, const VectorT<Scalar1,N>& _v) {
250 return _v*_s;
251}
252
253
256template<typename Scalar, int N>
257inline Scalar
258dot(const VectorT<Scalar,N>& _v1, const VectorT<Scalar,N>& _v2) {
259 return (_v1 | _v2);
260}
261
262
265template<typename Scalar, int N>
266inline VectorT<Scalar,N>
267cross(const VectorT<Scalar,N>& _v1, const VectorT<Scalar,N>& _v2) {
268 return (_v1 % _v2);
269}
270
271
274template<typename Scalar, int DIM>
275Scalar norm(const VectorT<Scalar, DIM>& _v) {
276 return _v.norm();
277}
278
279
282template<typename Scalar, int DIM>
283Scalar sqrnorm(const VectorT<Scalar, DIM>& _v) {
284 return _v.sqrnorm();
285}
286
287
290template<typename Scalar, int DIM, typename OtherScalar>
291VectorT<Scalar, DIM>& vectorize(VectorT<Scalar, DIM>& _v, OtherScalar const& _val) {
292 return _v.vectorize(_val);
293}
294
295
298template<typename Scalar, int DIM>
300 return _v.normalize();
301}
302
303
306template<typename Scalar, int DIM>
308 return _v1.maximize(_v2);
309}
310
311
314template<typename Scalar, int DIM>
316 return _v1.minimize(_v2);
317}
318
319
322template<typename Scalar, int DIM>
324 return VectorT<Scalar, DIM>(_v1).maximize(_v2);
325}
326
327
330template<typename Scalar, int DIM>
332 return VectorT<Scalar, DIM>(_v1).minimize(_v2);
333}
334
335
336//== TYPEDEFS =================================================================
337
351typedef VectorT<float,1> Vec1f;
354
368typedef VectorT<float,2> Vec2f;
371
385typedef VectorT<float,3> Vec3f;
389typedef VectorT<bool,3> Vec3b;
390
404typedef VectorT<float,4> Vec4f;
407
424
438typedef VectorT<float,6> Vec6f;
441
442
443//=============================================================================
444} // namespace OpenMesh
445//=============================================================================
446
447
448#endif // OPENMESH_VECTOR_HH defined
449//=============================================================================
450#endif // DOXYGEN
451#endif // C++11
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition: MeshItems.hh:59
VectorT< signed char, 3 > Vec3c
3-byte signed vector
Definition: Vector11T.hh:839
VectorT< double, 3 > Vec3d
3-double vector
Definition: Vector11T.hh:853
VectorT< signed int, 1 > Vec1i
1-int signed vector
Definition: Vector11T.hh:813
VectorT< unsigned char, 5 > Vec5uc
5-byte unsigned vector
Definition: Vector11T.hh:877
VectorT< unsigned int, 2 > Vec2ui
2-int unsigned vector
Definition: Vector11T.hh:832
VectorT< double, 1 > Vec1d
1-double vector
Definition: Vector11T.hh:819
VectorT< double, 4 > Vec4d
4-double vector
Definition: Vector11T.hh:872
VectorT< float, 2 > Vec2f
2-float vector
Definition: Vector11T.hh:834
VectorT< signed short int, 3 > Vec3s
3-short signed vector
Definition: Vector11T.hh:843
VectorT< double, 2 > Vec2d
2-double vector
Definition: Vector11T.hh:836
VectorT< signed int, 5 > Vec5i
5-int signed vector
Definition: Vector11T.hh:883
VectorT< signed char, 4 > Vec4c
4-byte signed vector
Definition: Vector11T.hh:858
VectorT< signed char, 5 > Vec5c
5-byte signed vector
Definition: Vector11T.hh:875
VectorT< unsigned int, 5 > Vec5ui
5-int unsigned vector
Definition: Vector11T.hh:885
VectorT< signed short int, 5 > Vec5s
5-short signed vector
Definition: Vector11T.hh:879
VectorT< unsigned int, 4 > Vec4ui
4-int unsigned vector
Definition: Vector11T.hh:868
VectorT< unsigned short int, 3 > Vec3us
3-short unsigned vector
Definition: Vector11T.hh:845
VectorT< unsigned char, 3 > Vec3uc
3-byte unsigned vector
Definition: Vector11T.hh:841
VectorT< signed short int, 2 > Vec2s
2-short signed vector
Definition: Vector11T.hh:826
VectorT< signed int, 2 > Vec2i
2-int signed vector
Definition: Vector11T.hh:830
auto operator*(const OtherScalar &_s, const VectorT< Scalar, DIM > &rhs) -> decltype(rhs.operator*(_s))
Component wise multiplication from the left.
Definition: Vector11T.hh:693
VectorT< signed char, 2 > Vec2c
2-byte signed vector
Definition: Vector11T.hh:822
VectorT< unsigned short int, 2 > Vec2us
2-short unsigned vector
Definition: Vector11T.hh:828
VectorT< signed char, 6 > Vec6c
6-byte signed vector
Definition: Vector11T.hh:892
VectorT< signed int, 6 > Vec6i
6-int signed vector
Definition: Vector11T.hh:900
VectorT< signed int, 4 > Vec4i
4-int signed vector
Definition: Vector11T.hh:866
VectorT< signed short int, 4 > Vec4s
4-short signed vector
Definition: Vector11T.hh:862
VectorT< unsigned char, 6 > Vec6uc
6-byte unsigned vector
Definition: Vector11T.hh:894
VectorT< float, 6 > Vec6f
6-float vector
Definition: Vector11T.hh:904
VectorT< float, 5 > Vec5f
5-float vector
Definition: Vector11T.hh:887
VectorT< unsigned char, 2 > Vec2uc
2-byte unsigned vector
Definition: Vector11T.hh:824
VectorT< unsigned int, 6 > Vec6ui
6-int unsigned vector
Definition: Vector11T.hh:902
VectorT< float, 4 > Vec4f
4-float vector
Definition: Vector11T.hh:870
VectorT< unsigned char, 1 > Vec1uc
1-byte unsigned vector
Definition: Vector11T.hh:807
VectorT< unsigned char, 4 > Vec4uc
4-byte unsigned vector
Definition: Vector11T.hh:860
VectorT< unsigned short int, 1 > Vec1us
1-short unsigned vector
Definition: Vector11T.hh:811
VectorT< float, 1 > Vec1f
1-float vector
Definition: Vector11T.hh:817
VectorT< double, 6 > Vec6d
6-double vector
Definition: Vector11T.hh:906
VectorT< signed short int, 1 > Vec1s
1-short signed vector
Definition: Vector11T.hh:809
VectorT< bool, 3 > Vec3b
3-bool vector
Definition: Vector11T.hh:855
VectorT< unsigned int, 1 > Vec1ui
1-int unsigned vector
Definition: Vector11T.hh:815
VectorT< signed char, 1 > Vec1c
1-byte signed vector
Definition: Vector11T.hh:805
VectorT< double, 5 > Vec5d
5-double vector
Definition: Vector11T.hh:889
VectorT< unsigned short int, 4 > Vec4us
4-short unsigned vector
Definition: Vector11T.hh:864
VectorT< unsigned int, 3 > Vec3ui
3-int unsigned vector
Definition: Vector11T.hh:849
VectorT< unsigned short int, 6 > Vec6us
6-short unsigned vector
Definition: Vector11T.hh:898
VectorT< unsigned short int, 5 > Vec5us
5-short unsigned vector
Definition: Vector11T.hh:881
VectorT< float, 3 > Vec3f
3-float vector
Definition: Vector11T.hh:851
VectorT< signed short int, 6 > Vec6s
6-short signed vector
Definition: Vector11T.hh:896
VectorT< signed int, 3 > Vec3i
3-int signed vector
Definition: Vector11T.hh:847
VectorT< Scalar, DIM > & normalize(VectorT< Scalar, DIM > &_v)
non-member normalize
Definition: Vector11T.hh:769
Scalar dot(const VectorT< Scalar, DIM > &_v1, const VectorT< Scalar, DIM > &_v2)
symmetric version of the dot product
Definition: Vector11T.hh:725
VectorT< Scalar, DIM > & minimize(VectorT< Scalar, DIM > &_v1, VectorT< Scalar, DIM > &_v2)
non-member minimize
Definition: Vector11T.hh:783
VectorT< Scalar, DIM > & vectorize(VectorT< Scalar, DIM > &_v, OtherScalar const &_val)
non-member vectorize
Definition: Vector11T.hh:762
VectorT< Scalar, DIM > min(const VectorT< Scalar, DIM > &_v1, const VectorT< Scalar, DIM > &_v2)
non-member min
Definition: Vector11T.hh:797
Scalar sqrnorm(const VectorT< Scalar, DIM > &_v)
non-member sqrnorm
Definition: Vector11T.hh:756
auto cross(const VectorT< LScalar, DIM > &_v1, const VectorT< RScalar, DIM > &_v2) -> decltype(_v1 % _v2)
symmetric version of the cross product
Definition: Vector11T.hh:733
VectorT< Scalar, DIM > & maximize(VectorT< Scalar, DIM > &_v1, VectorT< Scalar, DIM > &_v2)
non-member maximize
Definition: Vector11T.hh:776
VectorT< Scalar, DIM > max(const VectorT< Scalar, DIM > &_v1, const VectorT< Scalar, DIM > &_v2)
non-member max
Definition: Vector11T.hh:790
auto operator%(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std::enable_if< DIM==3, VectorT< decltype((*this)[0] *_rhs[0] -(*this)[0] *_rhs[0]), DIM > >::type
cross product: only defined for Vec3* as specialization
Definition: Vector11T.hh:375
Scalar norm(const VectorT< Scalar, DIM > &_v)
non-member norm
Definition: Vector11T.hh:749
Definition: VectorT_inc.hh:68
vector_type & maximize(const vector_type &_rhs)
maximize values: same as *this = max(*this, _rhs), but faster
Definition: VectorT_inc.hh:564
VectorT< Scalar, 3 > operator%(const VectorT< Scalar, 3 > &_rhs) const
cross product: only defined for Vec3* as specialization
Scalar norm() const
compute euclidean norm
Definition: VectorT_inc.hh:410
vector_type & vectorize(const Scalar &_s)
store the same value in each component (e.g. to clear all entries)
Definition: VectorT_inc.hh:605
Scalar sqrnorm() const
compute squared euclidean norm
Definition: VectorT_inc.hh:414
vector_type & normalize()
normalize vector, return normalized vector
Definition: VectorT_inc.hh:432
vector_type & minimize(const vector_type &_rhs)
minimize values: same as *this = min(*this, _rhs), but faster
Definition: VectorT_inc.hh:547

Project OpenMesh, ©  Visual Computing Institute, RWTH Aachen. Documentation generated using doxygen .