MeshLib C++ Docs
Loading...
Searching...
No Matches
MRUnorientedTriangle.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRId.h"
4#include <cassert>
5#include <utility>
6
7namespace MR
8{
11
12
16{
17 ThreeVertIds verts{};
18
19 UnorientedTriangle( const ThreeVertIds & inVs,
20 bool * outFlipped = nullptr )
21 : verts( inVs )
22 {
23 bool flipped = false;
24 auto checkSwap = [this, &flipped]( int i, int j )
25 {
26 assert( i < j );
27 assert( verts[i] != verts[j] );
28 if ( verts[i] > verts[j] )
29 {
30 flipped = !flipped;
31 std::swap( verts[i], verts[j] );
32 }
33 };
34 checkSwap( 0, 1 );
35 checkSwap( 0, 2 );
36 checkSwap( 1, 2 );
37 if ( outFlipped )
38 *outFlipped = flipped;
39 }
40
42 ThreeVertIds getFlipped() const { return { verts[0], verts[2], verts[1] }; }
43
44 operator ThreeVertIds &() { return verts; }
45 operator const ThreeVertIds &() const { return verts; }
46
47 VertId &operator[]( std::size_t i ) { return verts[i]; }
48 const VertId &operator[]( std::size_t i ) const { return verts[i]; }
49
50 friend bool operator==( const UnorientedTriangle& a, const UnorientedTriangle& b ) = default;
51};
52
53}
54
55namespace std
56{
57
58template <>
59struct hash<MR::UnorientedTriangle>
60{
61 size_t operator() ( const MR::UnorientedTriangle& triplet ) const noexcept
62 {
63 return
64 2 * size_t( triplet.verts[0] ) +
65 3 * size_t( triplet.verts[1] ) +
66 5 * size_t( triplet.verts[2] );
67 }
68};
69
70}
const VertId & operator[](std::size_t i) const
Definition MRUnorientedTriangle.h:48
VertId & operator[](std::size_t i)
Definition MRUnorientedTriangle.h:47
friend bool operator==(const UnorientedTriangle &a, const UnorientedTriangle &b)=default
ThreeVertIds verts
Definition MRUnorientedTriangle.h:17
ThreeVertIds getFlipped() const
returns this triangle with the opposite orientation
Definition MRUnorientedTriangle.h:42
UnorientedTriangle(const ThreeVertIds &inVs, bool *outFlipped=nullptr)
Definition MRUnorientedTriangle.h:19
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
Definition MRUnorientedTriangle.h:16