30 using Sphere = Sphere3<float>;
47 friend bool operator==(
const Plane&,
const Plane& ) =
default;
111 using Variant = std::variant<Sphere, ConeSegment, Plane>;
124 float halfLen = cyl.length / 2;
126 .referencePoint = cyl.
center(),
128 .positiveSideRadius = cyl.radius, .negativeSideRadius = cyl.radius,
129 .positiveLength = halfLen, .negativeLength = halfLen,
137 .positiveSideRadius = std::tan( cone.angle ) * cone.height, .negativeSideRadius = 0,
138 .positiveLength = cone.height, .negativeLength = 0,
184 [[nodiscard]]
operator bool()
const {
return status == Status::ok; }
205 Distance centerDistance;
228 std::vector<Primitives::Variant> intersections;
258template <
typename A,
typename B>
263template <
typename A,
typename B>
266 { t.measure( a, b ) } -> std::same_as<MeasureResult>;
309[[nodiscard]] std::string
name(
const T& primitive )
317template <
typename A,
typename B>
321template <
typename A,
typename B>
329 for (
auto* dist : { &ret.distance, &ret.centerDistance } )
332 if ( *dist && ( !std::isfinite( dist->distance ) || !dist->closestPointA.isFinite() || !dist->closestPointB.isFinite() ) )
333 dist->status = MeasureResult::Status::badRelativeLocation;
340 float a = ( dist->closestPointB - dist->closestPointA ).
length();
341 float b = std::abs( dist->distance );
342 return std::abs( a - b ) <= std::max( std::min( a, b ), 0.01f ) * 0.001f;
349 ret.angle.
status = MeasureResult::Status::badRelativeLocation;
352 assert( ret.angle <= ( std::abs( 1 - ret.angle.
dirA.
length() ) < 0.0001f ) );
353 assert( ret.angle <= ( std::abs( 1 - ret.angle.
dirB.
length() ) < 0.0001f ) );
369 return std::visit( [&](
const auto& elem ){
return (
measure)( elem, b ); }, a );
375 return std::visit( [&](
const auto& elem ){
return (
measure)( a, elem ); }, b );
#define MRMESH_API
Definition MRMeshFwd.h:80
length
Definition MRObjectDimensionsEnum.h:14
unsafe new ref MR.Vector3f direction()
unsafe new ref MR.Vector3f center()
unsafe new ref MR.Vector3f direction()
unsafe new ref MR.Vector3f center()
Definition MRFeatures.h:166
unsafe void swapObjects()
Definition MRFeatures.h:54
new unsafe ref float positiveSideRadius
new unsafe ref MR.Vector3f dir
new unsafe ref float negativeLength
new unsafe ref float positiveLength
new unsafe ref MR.Vector3f referencePoint
new unsafe ref float negativeSideRadius
Definition MRFeatures.h:33
Definition MRFeatures.h:318
Definition MRFeatures.h:264
Definition MRFeatures.h:20
std::string name(const T &primitive)
Definition MRFeatures.h:309
MRMESH_API Primitives::ConeSegment primitiveCylinder(const Vector3f &a, const Vector3f &b, float rad)
a and b are centers of the sides.
MeasureResult measure(const A &a, const B &b)
Definition MRFeatures.h:323
MRMESH_API std::shared_ptr< FeatureObject > primitiveToObject(const Primitives::Variant &primitive, float infiniteExtent)
MRMESH_API Primitives::ConeSegment primitiveCircle(const Vector3f &point, const Vector3f &normal, float rad)
normal doesn't need to be normalized.
MRMESH_API std::string_view toString(MeasureResult::Status status)
MRMESH_API Primitives::Sphere transformPrimitive(const AffineXf3f &xf, const Primitives::Sphere &primitive)
MRMESH_API Primitives::ConeSegment primitiveCone(const Vector3f &a, const Vector3f &b, float rad)
a is the center of the base, b is the pointy end.
MRMESH_API std::optional< Primitives::Variant > primitiveFromObjectWithWorldXf(const Object &object)
Primitives::Sphere toPrimitive(const Vector3f &point)
Definition MRFeatures.h:116
MRMESH_API std::optional< Primitives::Variant > primitiveFromObject(const Object &object)
Definition MRCameraOrientationPlugin.h:8
Vector3f normal(const MeshTopology &topology, const VertCoords &points, FaceId f)
computes triangular face normal from its vertices
Definition MRMeshMath.h:221
Definition MRFeatures.h:208
Vector3f pointA
Definition MRFeatures.h:209
Vector3f dirFor(bool b) const
Definition MRFeatures.h:215
MRMESH_API float computeAngleInRadians() const
Vector3f pointB
Definition MRFeatures.h:210
Vector3f dirA
Definition MRFeatures.h:213
bool isSurfaceNormalA
Whether dir{A,B} is a surface normal or a line direction.
Definition MRFeatures.h:218
Vector3f pointFor(bool b) const
Definition MRFeatures.h:211
bool isSurfaceNormalFor(bool b) const
Definition MRFeatures.h:221
Vector3f dirB
Definition MRFeatures.h:214
bool isSurfaceNormalB
Definition MRFeatures.h:219
Definition MRFeatures.h:182
Status status
Definition MRFeatures.h:183
Definition MRFeatures.h:188
float distanceAlongAxis(int i) const
Definition MRFeatures.h:197
Vector3f closestPointA
Definition MRFeatures.h:192
Vector3f closestPointFor(bool b) const
Definition MRFeatures.h:195
float distanceAlongAxisAbs(int i) const
Definition MRFeatures.h:198
Vector3f closestPointB
Definition MRFeatures.h:193
float distance
Definition MRFeatures.h:190
MRMESH_API MeasureResult measure(const Primitives::ConeSegment &a, const Primitives::ConeSegment &b) const
MRMESH_API MeasureResult measure(const Primitives::ConeSegment &a, const Primitives::Sphere &b) const
MRMESH_API MeasureResult measure(const Primitives::Plane &a, const Primitives::ConeSegment &b) const
MRMESH_API MeasureResult measure(const Primitives::Plane &a, const Primitives::Plane &b) const
MRMESH_API MeasureResult measure(const Primitives::Plane &a, const Primitives::Sphere &b) const
MRMESH_API MeasureResult measure(const Primitives::Sphere &a, const Primitives::Sphere &b) const
Definition MRFeatures.h:259
MRMESH_API std::string name(const Primitives::ConeSegment &prim) const
MRMESH_API std::string name(const Primitives::Plane &prim) const
MRMESH_API std::string name(const Primitives::Sphere &prim) const
Definition MRFeatures.h:241
readonly unsafe float length()
readonly unsafe bool isFinite()