37 Vector3f
normal = Vector3f( 1, 0, 0 );
111 using Variant = std::variant<Sphere, ConeSegment, Plane>;
124 float halfLen = cyl.length / 2;
126 .referencePoint = cyl.
center(),
127 .dir = cyl.direction().normalized(),
128 .positiveSideRadius = cyl.radius, .negativeSideRadius = cyl.radius,
129 .positiveLength = halfLen, .negativeLength = halfLen,
135 .referencePoint = cone.
center(),
136 .dir = cone.direction().normalized(),
137 .positiveSideRadius = std::tan( cone.angle ) * cone.height, .negativeSideRadius = 0,
138 .positiveLength = cone.height, .negativeLength = 0,
245struct Unary<Primitives::ConeSegment>
255template <
typename A,
typename B>
260template <
typename A,
typename B>
263 { t.measure( a, b ) } -> std::same_as<MeasureResult>;
306[[nodiscard]] std::string
name(
const T& primitive )
314template <
typename A,
typename B>
318template <
typename A,
typename B>
329 if ( *dist && ( !std::isfinite( dist->distance ) || !dist->closestPointA.isFinite() || !dist->closestPointB.isFinite() ) )
337 float a = ( dist->closestPointB - dist->closestPointA ).
length();
338 float b = std::abs( dist->distance );
339 return std::abs( a - b ) <= std::max( std::min( a, b ), 0.01f ) * 0.001f;
349 assert( ret.
angle <= ( std::abs( 1 - ret.
angle.
dirA.length() ) < 0.0001f ) );
350 assert( ret.
angle <= ( std::abs( 1 - ret.
angle.
dirB.length() ) < 0.0001f ) );
366 return std::visit( [&](
const auto& elem ){
return (
measure)( elem, b ); }, a );
372 return std::visit( [&](
const auto& elem ){
return (
measure)( a, elem ); }, b );
#define MRMESH_API
Definition MRMesh/MRMeshFwd.h:79
length
Definition MRObjectDimensionsEnum.h:14
named object in the data model
Definition MRObject.h:60
Definition MRFeatures.h:315
Definition MRFeatures.h:261
std::variant< Sphere, ConeSegment, Plane > Variant
Definition MRFeatures.h:111
Definition MRFeatures.h:20
std::string name(const T &primitive)
Definition MRFeatures.h:306
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:320
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
Cylinder3f
Definition MRMesh/MRMeshFwd.h:301
Cone3f
Definition MRMesh/MRMeshFwd.h:306
Definition MRFeatures.h:205
Vector3f pointA
Definition MRFeatures.h:206
Vector3f dirFor(bool b) const
Definition MRFeatures.h:212
MRMESH_API float computeAngleInRadians() const
Vector3f pointB
Definition MRFeatures.h:207
Vector3f dirA
Definition MRFeatures.h:210
bool isSurfaceNormalA
Whether dir{A,B} is a surface normal or a line direction.
Definition MRFeatures.h:215
Vector3f pointFor(bool b) const
Definition MRFeatures.h:208
bool isSurfaceNormalFor(bool b) const
Definition MRFeatures.h:218
Vector3f dirB
Definition MRFeatures.h:211
bool isSurfaceNormalB
Definition MRFeatures.h:216
Definition MRFeatures.h:182
Status status
Definition MRFeatures.h:183
Definition MRFeatures.h:188
Vector3f closestPointA
Definition MRFeatures.h:192
Vector3f closestPointFor(bool b) const
Definition MRFeatures.h:195
Vector3f closestPointB
Definition MRFeatures.h:193
float distance
Definition MRFeatures.h:190
Stores the results of measuring two objects relative to one another.
Definition MRFeatures.h:166
MRMESH_API void swapObjects()
Distance centerDistance
Definition MRFeatures.h:202
Angle angle
Definition MRFeatures.h:222
Distance distance
Definition MRFeatures.h:198
Status
Definition MRFeatures.h:168
@ badRelativeLocation
Can't be computed because of how the objects are located relative to each other.
@ notImplemented
Algorithms set this if this when something isn't yet implemented.
@ notFinite
The result was not finite. This is set automatically if you return non-finite values,...
std::vector< Primitives::Variant > intersections
Definition MRFeatures.h:225
Definition MRFeatures.h:54
friend bool operator==(const ConeSegment &, const ConeSegment &)=default
float length() const
Definition MRFeatures.h:85
MRMESH_API Sphere basePoint(bool negative) const
MRMESH_API ConeSegment extendToInfinity() const
Vector3f referencePoint
Some point on the axis, but not necessarily the true center point. Use centerPoint() for that.
Definition MRFeatures.h:62
MRMESH_API ConeSegment baseCircle(bool negative) const
MRMESH_API ConeSegment untruncateCone() const
float positiveSideRadius
Cap radius in the dir direction.
Definition MRFeatures.h:67
Vector3f dir
The axis direction. Must be normalized.
Definition MRFeatures.h:64
MRMESH_API Sphere centerPoint() const
float negativeLength
Distance from the center to the cap in the direction opposite to dir.
Definition MRFeatures.h:74
MRMESH_API Plane basePlane(bool negative) const
float negativeSideRadius
Cap radius in the direction opposite to dir.
Definition MRFeatures.h:69
MRMESH_API ConeSegment axis() const
float positiveLength
Distance from the center to the cap in the dir direction.
Definition MRFeatures.h:72
bool isZeroRadius() const
Definition MRFeatures.h:81
bool hollow
Definition MRFeatures.h:77
MRMESH_API ConeSegment extendToInfinity(bool negative) const
bool isCircle() const
Definition MRFeatures.h:82
Definition MRFeatures.h:33
Vector3f center
Definition MRFeatures.h:34
MRMESH_API Sphere intersectWithLine(const ConeSegment &line) const
MRMESH_API ConeSegment intersectWithPlane(const Plane &other) const
friend bool operator==(const Plane &, const Plane &)=default
Vector3f normal
Definition MRFeatures.h:37
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:256
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:238
V center
Definition MRSphere.h:12