MeshLib C++ Docs
Loading...
Searching...
No Matches
MRPrecisePredicates3.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRVector3.h"
4#include "MRId.h"
5#include <array>
6#include <optional>
7
8namespace MR
9{
12
13
16
24[[nodiscard]] MRMESH_API bool orient3d( const Vector3i & a, const Vector3i & b, const Vector3i & c );
25
33[[nodiscard]] inline bool orient3d( const Vector3i & a, const Vector3i & b, const Vector3i & c, const Vector3i & d )
34 { return orient3d( a - d, b - d, c - d ); }
35
37{
38 VertId id;
39 Vector3i pt;
40};
41
47[[nodiscard]] MRMESH_API bool orient3d( const PreciseVertCoords* vs );
48[[nodiscard]] inline bool orient3d( const std::array<PreciseVertCoords, 4> & vs )
49 { return orient3d( vs.data() ); }
50
60[[nodiscard]] MRMESH_API bool ccwAroundLine( const PreciseVertCoords* vs );
61[[nodiscard]] inline bool ccwAroundLine( const std::array<PreciseVertCoords, 5> & vs )
62 { return ccwAroundLine( vs.data() ); }
63
65{
66 bool doIntersect = false;
67 bool dIsLeftFromABC = false;
68
69 explicit operator bool() const { return doIntersect; }
70};
71
76 const std::array<PreciseVertCoords, 5> & vs );
77
85[[nodiscard]] MRMESH_API bool segmentIntersectionOrder( const std::array<PreciseVertCoords, 8> & vs );
86
95[[nodiscard]] MRMESH_API bool segmentIntersectionTriPlaneOrder( const std::array<PreciseVertCoords, 8> & vs );
96
99{
100 Vector3d center;
101 double invRange = 1;
102
104 [[nodiscard]] int scaleOnly( double v ) const
105 {
106 return (int)std::round( v * invRange );
107 }
108
110 [[nodiscard]] Vector3i operator()( const Vector3d& p ) const
111 {
112 const auto d = p - center;
113 return { scaleOnly( d.x ), scaleOnly( d.y ), scaleOnly( d.z ) };
114 }
115
117 [[nodiscard]] Vector3i operator()( const Vector3f& p ) const
118 {
119 return operator()( Vector3d{ p } );
120 }
121};
122
125{
126 double range = 1;
127 Vector3d center;
128
130 [[nodiscard]] Vector3d convert( const Vector3i& v ) const
131 {
132 return Vector3d{ v } * range + center;
133 }
134
136 [[nodiscard]] Vector3f operator()( const Vector3i& v ) const
137 {
138 return Vector3f( convert( v ) );
139 }
140};
141
148
150[[nodiscard]] MRMESH_API ConvertToIntVector getToIntConverter( const Box3d& box );
152[[nodiscard]] MRMESH_API ConvertToFloatVector getToFloatConverter( const Box3d& box );
153
157 const VertCoords& points, const VertBitSet* valid = nullptr );
158
161[[nodiscard]] MRMESH_API VertCoords computeFloatCoords( const ConvertToFloatVector& conv,
162 const Vector<Vector3i, VertId>& intCoords, const VertBitSet* valid = nullptr );
163
166[[nodiscard]] MRMESH_API std::optional<Vector3i> findTwoSegmentsIntersection( const Vector3i& ai, const Vector3i& bi, const Vector3i& ci, const Vector3i& di );
167
171 const Vector3f& a, const Vector3f& b, const Vector3f& c,
172 const Vector3f& d, const Vector3f& e,
173 CoordinateConverters converters );
174
176
177}
#define MRMESH_API
Definition MRMeshFwd.h:85
std::vector<T>-like container that requires specific indexing type,
Definition MRVector.h:23
Vector3d convert(const Vector3i &v) const
int-to-double coordinates converter
Definition MRPrecisePredicates3.h:130
Vector3i pt
integer coordinates of the vertex
Definition MRPrecisePredicates3.h:39
Vector3i operator()(const Vector3d &p) const
double-to-int coordinates converter
Definition MRPrecisePredicates3.h:110
int scaleOnly(double v) const
applies scaling only (without translation) with the following rounding to the nearest int
Definition MRPrecisePredicates3.h:104
Vector3f operator()(const Vector3i &v) const
int-to-float coordinates converter
Definition MRPrecisePredicates3.h:136
Vector3i operator()(const Vector3f &p) const
float-to-int coordinates converter
Definition MRPrecisePredicates3.h:117
double invRange
Definition MRPrecisePredicates3.h:101
Vector3d center
Definition MRPrecisePredicates3.h:127
bool doIntersect
whether triangle and segment intersect
Definition MRPrecisePredicates3.h:66
Vector3d center
Definition MRPrecisePredicates3.h:100
ConvertToFloatVector toFloat
Definition MRPrecisePredicates3.h:146
bool segmentIntersectionOrder(const std::array< PreciseVertCoords2, 6 > &vs)
bool dIsLeftFromABC
value of orient3d( A, B, C, D ) (see there); "left" means the side the right-hand normal cross( B - A...
Definition MRPrecisePredicates3.h:67
double range
Definition MRPrecisePredicates3.h:126
VertId id
unique id of the vertex (in both meshes)
Definition MRPrecisePredicates3.h:38
ConvertToIntVector toInt
Definition MRPrecisePredicates3.h:145
ConvertToIntVector getToIntConverter(const Box3d &box)
creates converter from Vector3f to Vector3i in Box range (int diapason is mapped to box range)
bool orient3d(const Vector3i &a, const Vector3i &b, const Vector3i &c)
Vector< Vector3i, VertId > computeIntCoords(const ConvertToIntVector &conv, const VertCoords &points, const VertBitSet *valid=nullptr)
std::optional< Vector3i > findTwoSegmentsIntersection(const Vector3i &ai, const Vector3i &bi, const Vector3i &ci, const Vector3i &di)
TriangleSegmentIntersectResult doTriangleSegmentIntersect(const std::array< PreciseVertCoords, 5 > &vs)
ConvertToFloatVector getToFloatConverter(const Box3d &box)
creates converter from Vector3i to Vector3f in Box range (int diapason is mapped to box range)
bool ccwAroundLine(const PreciseVertCoords *vs)
Vector3f findTriangleSegmentIntersectionPrecise(const Vector3f &a, const Vector3f &b, const Vector3f &c, const Vector3f &d, const Vector3f &e, CoordinateConverters converters)
bool segmentIntersectionTriPlaneOrder(const std::array< PreciseVertCoords, 8 > &vs)
VertCoords computeFloatCoords(const ConvertToFloatVector &conv, const Vector< Vector3i, VertId > &intCoords, const VertBitSet *valid=nullptr)
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
scale then translate int-to-float coordinate converter
Definition MRPrecisePredicates3.h:125
translate then scale float-to-int coordinate converter
Definition MRPrecisePredicates3.h:99
this struct contains coordinate converters float-int-float
Definition MRPrecisePredicates3.h:144
Definition MRPrecisePredicates3.h:37
Definition MRPrecisePredicates3.h:65