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
19MRMESH_API bool orient3d( const Vector3i & a, const Vector3i & b, const Vector3i & c );
20
23inline bool orient3d( const Vector3i & a, const Vector3i & b, const Vector3i & c, const Vector3i & d )
24 { return orient3d( a - d, b - d, c - d ); }
25
27{
28 VertId id;
29 Vector3i pt;
30};
31
33MRMESH_API bool orient3d( const std::array<PreciseVertCoords, 4> & vs );
35
37{
38 bool doIntersect = false;
39 bool dIsLeftFromABC = false;
40
41 explicit operator bool() const { return doIntersect; }
42};
43
47 const std::array<PreciseVertCoords, 5> & vs );
48
53[[nodiscard]] MRMESH_API bool segmentIntersectionOrder( const std::array<PreciseVertCoords, 8> & vs );
54
57{
58 Vector3d center;
59 double invRange = 1;
60
62 [[nodiscard]] int scaleOnly( double v ) const
63 {
64 return (int)std::round( v * invRange );
65 }
66
68 [[nodiscard]] Vector3i operator()( const Vector3d& p ) const
69 {
70 const auto d = p - center;
71 return { scaleOnly( d.x ), scaleOnly( d.y ), scaleOnly( d.z ) };
72 }
73
75 [[nodiscard]] Vector3i operator()( const Vector3f& p ) const
76 {
77 return operator()( Vector3d{ p } );
78 }
79};
80
83{
84 double range = 1;
85 Vector3d center;
86
88 [[nodiscard]] Vector3d convert( const Vector3i& v ) const
89 {
90 return Vector3d{ v } * range + center;
91 }
92
94 [[nodiscard]] Vector3f operator()( const Vector3i& v ) const
95 {
96 return Vector3f( convert( v ) );
97 }
98};
99
106
111
115 const VertCoords& points, const VertBitSet* valid = nullptr );
116
119[[nodiscard]] MRMESH_API VertCoords computeFloatCoords( const ConvertToFloatVector& conv,
120 const Vector<Vector3i, VertId>& intCoords, const VertBitSet* valid = nullptr );
121
124[[nodiscard]] MRMESH_API std::optional<Vector3i> findTwoSegmentsIntersection( const Vector3i& ai, const Vector3i& bi, const Vector3i& ci, const Vector3i& di );
125
129 const Vector3f& a, const Vector3f& b, const Vector3f& c,
130 const Vector3f& d, const Vector3f& e,
131 CoordinateConverters converters );
132
134
135}
#define MRMESH_API
Definition MRMeshFwd.h:82
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:88
Vector3i pt
integer coordinates of the vertex
Definition MRPrecisePredicates3.h:29
Vector3i operator()(const Vector3d &p) const
double-to-int coordinates converter
Definition MRPrecisePredicates3.h:68
int scaleOnly(double v) const
applies scaling only (without translation) with the following rounding to the nearest int
Definition MRPrecisePredicates3.h:62
Vector3f operator()(const Vector3i &v) const
int-to-float coordinates converter
Definition MRPrecisePredicates3.h:94
Vector3i operator()(const Vector3f &p) const
float-to-int coordinates converter
Definition MRPrecisePredicates3.h:75
double invRange
Definition MRPrecisePredicates3.h:59
Vector3d center
Definition MRPrecisePredicates3.h:85
bool doIntersect
whether triangle and segment intersect
Definition MRPrecisePredicates3.h:38
Vector3d center
Definition MRPrecisePredicates3.h:58
ConvertToFloatVector toFloat
Definition MRPrecisePredicates3.h:104
bool segmentIntersectionOrder(const std::array< PreciseVertCoords2, 6 > &vs)
bool dIsLeftFromABC
whether the plane with orientated triangle ABC has D point at the left
Definition MRPrecisePredicates3.h:39
double range
Definition MRPrecisePredicates3.h:84
VertId id
unique id of the vertex (in both meshes)
Definition MRPrecisePredicates3.h:28
ConvertToIntVector toInt
Definition MRPrecisePredicates3.h:103
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)
Vector3f findTriangleSegmentIntersectionPrecise(const Vector3f &a, const Vector3f &b, const Vector3f &c, const Vector3f &d, const Vector3f &e, CoordinateConverters converters)
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:83
translate then scale float-to-int coordinate converter
Definition MRPrecisePredicates3.h:57
this struct contains coordinate converters float-int-float
Definition MRPrecisePredicates3.h:102
Definition MRPrecisePredicates3.h:27
Definition MRPrecisePredicates3.h:37