20 const auto ab = ( b - a ).lengthSq();
21 const auto ca = ( a - c ).lengthSq();
22 const auto bc = ( c - b ).lengthSq();
29 const auto f = cross( b - a, c - a ).lengthSq();
31 return std::numeric_limits<T>::infinity();
32 return ab * ca * bc / f;
47 const auto xabSq = cross( a, b ).lengthSq();
57 const auto ab = dot( a, b );
58 return ( bb * ( aa - ab ) * a + aa * ( bb - ab ) * b ) / ( 2 * xabSq );
75 const auto rr =
sqr( radius );
80 const auto x = std::sqrt( rr - circRadSq );
81 const auto xn = x *
normal( a, b, c );
83 centerPos = circCenter + xn;
84 centerNeg = circCenter - xn;
94 const auto ab = ( b - a ).
length();
95 const auto ca = ( a - c ).
length();
96 const auto bc = ( c - b ).
length();
97 if ( ab <= 0 || ca <= 0 || bc <= 0 )
99 const auto f = cross( b - a, c - a ).length();
100 return f * std::min( { ab, ca, bc } ) / ( ab * ca * bc );
114 const auto bc = ( c - b ).
length();
115 const auto ca = ( a - c ).
length();
116 const auto ab = ( b - a ).
length();
117 auto halfPerimeter = ( bc + ca + ab ) / 2;
118 auto den = 8 * ( halfPerimeter - bc ) * ( halfPerimeter - ca ) * ( halfPerimeter - ab );
120 return std::numeric_limits<T>::max();
122 return bc * ca * ab / den;
129 return cross( t[1] - t[0], t[2] - t[0] );
136 return cross( q, r );
143 return cross( q - p, r - p );
157 return normal( q - p, r - p );
164 return normal( t[1] - t[0], t[2] - t[0] );
176[[nodiscard]]
inline T
dblArea(
const Triangle3<T> & t )
199 return std::abs( cross( q - p, r - p ) );
213 const auto c = ( t[0] + t[1] + t[2] ) / T(3);
216 for (
int i = 0; i < 3; ++i )
218 const auto sq = ( t[i] - c ).lengthSq();
219 if ( longestSq >= sq )
224 const auto d = ( t[longest] - c ).normalized();
228 for (
int i = 0; i < 3; ++i )
229 res[i] = c + d * dot( d, t[i] - c );
238 const auto c = ( t[0] + t[1] + t[2] ) / T(3);
240 for (
int i = 0; i < 3; ++i )
241 res[i] = t[i] - n * dot( n, t[i] - c );
257 return dot( edgeDir, cross( leftNorm, rightNorm ) );
268 return dot( leftNorm, rightNorm );
282 return std::atan2( sin, cos );
298 const auto aa =
sqr( a );
299 const auto y = ( aa -
sqr( b ) +
sqr( c ) ) / ( 2 * c );
300 const auto yy =
sqr( y );
303 const auto x = std::sqrt( aa - yy );
321 auto y = ( p->x * p1->y - p1->x * p->y ) / ( p->x - p1->x );
322 if ( y < 0 || y > c )
324 return ( *p - *p1 ).length();
333 const T den = ( a + b + c ) * ( b + c - a );
335 return std::numeric_limits<T>::infinity();
336 const T num = ( a + c - b ) * ( a + b - c );
345[[nodiscard]]
inline T
cotan(
const Triangle3<T> & t, T absMaxVal = std::numeric_limits<T>::max() )
347 auto a = t[0] - t[2];
348 auto b = t[1] - t[2];
349 auto nom = dot( a, b );
350 auto den = cross( a, b ).length();
351 if ( fabs( nom ) >= absMaxVal * den )
352 return absMaxVal *
sgn( nom );
360[[nodiscard]]
inline T
cotan( T a, T b, T c )
362 const T den = ( a + b + c ) * ( b + c - a );
364 return -std::numeric_limits<T>::infinity();
365 const T num = ( a + c - b ) * ( a + b - c );
367 return std::numeric_limits<T>::infinity();
368 const auto tanSq = num / den;
369 return ( 1 - tanSq ) / ( 2 * std::sqrt( tanSq ) );
377 const auto bb = dot( b, b );
378 const auto bc = dot( b, c );
379 const auto cc = dot( c, c );
380 const auto det = bb * cc - bc * bc;
383 const auto kb = ( 1 / det ) * ( cc * vb - bc * vc );
384 const auto kc = ( 1 / det ) * (-bc * vb + bb * vc );
385 return kb * b + kc * c;
401 const auto gradSq = grad.
lengthSq();
404 const auto d = c - b;
406 const auto gort = d - ( dot( d, grad ) / gradSq ) * grad;
407 const auto god = dot( gort, d );
410 const auto gob = -dot( gort, b );
411 if ( gob <= 0 || gob >= god )
413 const auto a = gob / god;
414 assert( a < std::numeric_limits<T>::max() );
415 const auto ip = a * c + ( 1 - a ) * b;
416 if ( dot( grad, ip ) >= 0 )
431 if ( !grad.has_value() )
433 auto gradSq = grad->lengthSq();
436 return sqrt( 1 - gradSq ) *
normal( b, c ) - *grad;
449 return Plane3<T>( *n, dot( *n, a ) + ra );
length
Definition MRObjectDimensionsEnum.h:14
T minTriangleAngleSin(const Vector3< T > &a, const Vector3< T > &b, const Vector3< T > &c)
Definition MRTriMath.h:92
Definition MRCameraOrientationPlugin.h:8
float area(const MeshTopology &topology, const VertCoords &points, FaceId f)
returns the area of given face
Definition MRMeshMath.h:165
constexpr T sqr(T x) noexcept
squared value
Definition MRMeshFwd.h:752
MRMESH_API float circumcircleDiameter(const MeshTopology &topology, const VertCoords &points, FaceId f)
returns circumcircle diameter of given mesh triangle
MRMESH_API float dihedralAngle(const MeshTopology &topology, const VertCoords &points, UndirectedEdgeId e)
Vector3< T > circumcircleCenter(const Vector3< T > &a, const Vector3< T > &b)
Computes the center of the the triangle's 0AB circumcircle.
Definition MRTriMath.h:45
MRMESH_API float dihedralAngleCos(const MeshTopology &topology, const VertCoords &points, UndirectedEdgeId e)
std::optional< T > findTriExitPos(const Vector3< T > &b, const Vector3< T > &c, const Vector3< T > &grad)
Definition MRTriMath.h:399
std::optional< T > quadrangleOtherDiagonal(T a, T b, T c, T a1, T b1)
Definition MRTriMath.h:311
Triangle3< T > makeDegenerate(const Triangle3< T > &t)
make degenerate triangle (all 3 points on a line) that maximally resembles the input one and has the ...
Definition MRTriMath.h:211
T tanSqOfHalfAngle(T a, T b, T c)
Definition MRTriMath.h:331
Triangle3< T > triangleWithNormal(const Triangle3< T > &t, const Vector3< T > &n)
Definition MRTriMath.h:236
Vector3f dirDblArea(const MeshTopology &topology, const VertCoords &points, FaceId f)
computes directed double area for a triangular face from its vertices
Definition MRMeshMath.h:150
MRMESH_API float triangleAspectRatio(const MeshTopology &topology, const VertCoords &points, FaceId f)
returns aspect ratio of given mesh triangle equal to the ratio of the circum-radius to twice its in-r...
constexpr int sgn(T x) noexcept
sign of given value in { -1, 0, 1 }
Definition MRMeshFwd.h:756
std::optional< Vector3< T > > gradientInTri(const Vector3< T > &b, const Vector3< T > &c, T vb, T vc)
Definition MRTriMath.h:375
std::optional< Plane3< T > > tangentPlaneToSpheres(const Vector3< T > &a, const Vector3< T > &b, const Vector3< T > &c, T ra, T rb, T rc)
Definition MRTriMath.h:446
MRMESH_API float circumcircleDiameterSq(const MeshTopology &topology, const VertCoords &points, FaceId f)
returns squared circumcircle diameter of given mesh triangle
bool circumballCenters(const Vector3< T > &a, const Vector3< T > &b, const Vector3< T > &c, T radius, Vector3< T > ¢erPos, Vector3< T > ¢erNeg)
Definition MRTriMath.h:71
std::optional< Vector3< T > > tangentPlaneNormalToSpheres(const Vector3< T > &b, const Vector3< T > &c, T rb, T rc)
Definition MRTriMath.h:428
float dblArea(const MeshTopology &topology, const VertCoords &points, FaceId f)
returns twice the area of given face
Definition MRMeshMath.h:159
T minTriangleAngle(const Vector3< T > &a, const Vector3< T > &b, const Vector3< T > &c)
Definition MRTriMath.h:104
std::optional< Vector2< T > > posFromTriEdgeLengths(T a, T b, T c)
Definition MRTriMath.h:289
float cotan(const MeshTopology &topology, const VertCoords &points, UndirectedEdgeId ue)
Definition MRMeshMath.h:312
Vector3f normal(const MeshTopology &topology, const VertCoords &points, FaceId f)
computes triangular face normal from its vertices
Definition MRMeshMath.h:221
T dblAreaSq(const Vector3< T > &p, const Vector3< T > &q, const Vector3< T > &r)
computes the square of double area of given triangle
Definition MRTriMath.h:169
MRMESH_API float dihedralAngleSin(const MeshTopology &topology, const VertCoords &points, UndirectedEdgeId e)
Definition MRVector2.h:29
Definition MRMesh/MRVector3.h:30
Vector3 normalized() const MR_REQUIRES_IF_SUPPORTED(std
Definition MRMesh/MRVector3.h:74
T lengthSq() const
Definition MRMesh/MRVector3.h:65
readonly unsafe float length()
readonly unsafe MR.Vector3f normalized()
readonly unsafe float lengthSq()