MeshCore::MeshGeomFacet Class Reference

The MeshGeomFacet class is geometric counterpart to MeshFacet that holds the geometric data points of a triangle. More...

#include <Elements.h>

Public Member Functions

Construction
 MeshGeomFacet (void)
 default constructor More...
 
 MeshGeomFacet (const Base::Vector3f &v1, const Base::Vector3f &v2, const Base::Vector3f &v3)
 Constructor with the corner points. More...
 
 ~MeshGeomFacet (void)
 Destruction. More...
 
bool IsPointOf (const Base::Vector3f &rclPoint, float fDistance) const
 Checks if the point is part of the facet. More...
 
bool IsPointOf (const Base::Vector3f &rclPoint) const
 Checks if the point is inside or at the border of the facet. More...
 
bool IsPointOfFace (const Base::Vector3f &rclP, float fDistance) const
 Checks whether the given point is inside the facet with tolerance fDistance. More...
 
bool Weights (const Base::Vector3f &rclP, float &w0, float &w1, float &w2) const
 Calculates the weights w1, ..., w3 of the corners to get the point rclP, i.e. More...
 
float DistancePlaneToPoint (const Base::Vector3f &rclPoint) const
 Calculates the distance of a point to the plane defined by the triangle. More...
 
void ProjectPointToPlane (const Base::Vector3f &rclPoint, Base::Vector3f &rclProj) const
 Calculates the projection of a point onto the plane defined by the triangle. More...
 
void ProjectFacetToPlane (MeshGeomFacet &rclFacet) const
 Calculates the projection of a facet onto the plane defined by the triangle. More...
 
bool IsDegenerated (float epsilon) const
 Checks whether the triangle is degenerated. More...
 
bool IsDeformed (float fCosOfMinAngle, float fCosOfMaxAngle) const
 Checks whether the triangle is deformed. More...
 
void Enlarge (float fDist)
 Enlarges the triangle. More...
 
void CalcNormal (void)
 Calculates the facet normal for storing internally. More...
 
void ArrangeNormal (const Base::Vector3f &rclN)
 Arrange the facet normal so the both vectors have the same orientation. More...
 
void AdjustCirculationDirection (void)
 Adjusts the facet's orientation to its normal. More...
 
void NormalInvalid (void)
 Invalidate the normal. More...
 
bool IsFlag (MeshFacet::TFlagType tF) const
 Query the flag state of the facet. More...
 
void SetFlag (MeshFacet::TFlagType tF)
 Set flag state. More...
 
void ResetFlag (MeshFacet::TFlagType tF)
 Reset flag state. More...
 
Base::Vector3f GetGravityPoint (void) const
 Calculates the facet's gravity point. More...
 
Base::Vector3f GetNormal (void) const
 Returns the normal of the facet. More...
 
void SetNormal (const Base::Vector3f &rclNormal)
 Sets the facet's normal. More...
 
Base::BoundBox3f GetBoundBox (void) const
 Returns the wrapping bounding box. More...
 
float Perimeter () const
 Calculates the perimeter of the facet. More...
 
float Area () const
 Calculates the area of a facet. More...
 
float MaximumAngle () const
 Calculates the maximum angle of a facet. More...
 
float MinimumAngle () const
 Calculates the minimum angle of a facet. More...
 
bool ContainedByOrIntersectBoundingBox (const Base::BoundBox3f &rcBB) const
 Checks if the facet is inside the bounding box or intersects with it. More...
 
bool IntersectBoundingBox (const Base::BoundBox3f &rclBB) const
 Checks if the facet intersects with the given bounding box. More...
 
bool IntersectWithFacet (const MeshGeomFacet &rclFacet) const
 This method checks if both facets intersect. More...
 
int IntersectWithFacet (const MeshGeomFacet &facet, Base::Vector3f &rclPt0, Base::Vector3f &rclPt1) const
 Intersect the facet with the other facet The result is line given by two points (if intersected). More...
 
float DistanceToLineSegment (const Base::Vector3f &rcP1, const Base::Vector3f &rcP2) const
 Calculates the shortest distance from the line segment defined by rcP1 and rcP2 to this facet. More...
 
float DistanceToPoint (const Base::Vector3f &rcPt) const
 Calculates the shortest distance from the point rcPt to the facet. More...
 
float DistanceToPoint (const Base::Vector3f &rclPt, Base::Vector3f &rclNt) const
 Calculates the shortest distance from the point rcPt to the facet. More...
 
bool IntersectWithLine (const Base::Vector3f &rclPt, const Base::Vector3f &rclDir, Base::Vector3f &rclRes) const
 Calculates the intersection point of the line defined by the base rclPt and the direction rclDir with the facet. More...
 
bool Foraminate (const Base::Vector3f &rclPt, const Base::Vector3f &rclDir, Base::Vector3f &rclRes, float fMaxAngle=Mathf::PI) const
 Calculates the intersection point of the line defined by the base rclPt and the direction rclDir with the facet. More...
 
bool IntersectWithPlane (const Base::Vector3f &rclBase, const Base::Vector3f &rclNormal, Base::Vector3f &rclP1, Base::Vector3f &rclP2) const
 Checks if the facet intersects with the plane defined by the base rclBase and the normal rclNormal and returns true if two points are found, false otherwise. More...
 
bool IntersectWithPlane (const Base::Vector3f &rclBase, const Base::Vector3f &rclNormal) const
 Checks if the facet intersects with the plane defined by the base rclBase and the normal rclNormal. More...
 
bool IntersectPlaneWithLine (const Base::Vector3f &rclBase, const Base::Vector3f &rclNormal, Base::Vector3f &rclRes) const
 Checks if the plane defined by the facet rclFacet intersects with the line defined by the base rclBase and the direction rclNormal and returns the intersection point rclRes if possible. More...
 
float VolumeOfPrism (const MeshGeomFacet &rclF) const
 Calculates the volume of the prism defined by two facets. More...
 
void SubSample (float fStep, std::vector< Base::Vector3f > &rclPoints) const
 Subsamples the facet into points with resolution fStep. More...
 
float CenterOfInscribedCircle (Base::Vector3f &rclCenter) const
 Calculates the center and radius of the inscribed circle of the facet. More...
 
float CenterOfCircumCircle (Base::Vector3f &rclCenter) const
 Calculates the center and radius of the circum circle of the facet. More...
 
unsigned short NearestEdgeToPoint (const Base::Vector3f &rclPt) const
 Returns the edge number of the facet that is nearest to the point rclPt. More...
 
void NearestEdgeToPoint (const Base::Vector3f &rclPt, float &fDistance, unsigned short &side) const
 Returns the edge number side of the facet and the distance to the edge that is nearest to the point rclPt. More...
 
bool IsPointOfSphere (const Base::Vector3f &rP) const
 The center and radius of the circum circle define a sphere in 3D. More...
 
bool IsPointOfSphere (const MeshGeomFacet &rFacet) const
 This is an overloaded member function, provided for convenience. More...
 
float AspectRatio () const
 The aspect ratio is the longest edge length divided by its height. More...
 
float AspectRatio2 () const
 The alternative aspect ration is the ratio of the radius of the circum-circle and twice the radius of the in-circle. More...
 
float Roundness () const
 The roundness is in the range between 0.0 (colinear) and 1.0 (equilateral). More...
 
void Transform (const Base::Matrix4D &)
 Apply a transformation on the triangle. More...
 

Detailed Description

The MeshGeomFacet class is geometric counterpart to MeshFacet that holds the geometric data points of a triangle.

Constructor & Destructor Documentation

◆ MeshGeomFacet() [1/2]

MeshGeomFacet::MeshGeomFacet ( void  )

default constructor

Referenced by Weights().

◆ MeshGeomFacet() [2/2]

MeshGeomFacet::MeshGeomFacet ( const Base::Vector3f v1,
const Base::Vector3f v2,
const Base::Vector3f v3 
)

Constructor with the corner points.

References draftgeoutils.general::v1().

◆ ~MeshGeomFacet()

MeshCore::MeshGeomFacet::~MeshGeomFacet ( void  )

Destruction.

Member Function Documentation

◆ AdjustCirculationDirection()

void MeshCore::MeshGeomFacet::AdjustCirculationDirection ( void  )

Adjusts the facet's orientation to its normal.

◆ Area()

◆ ArrangeNormal()

void MeshCore::MeshGeomFacet::ArrangeNormal ( const Base::Vector3f rclN)

Arrange the facet normal so the both vectors have the same orientation.

References GetNormal().

◆ AspectRatio()

float MeshGeomFacet::AspectRatio ( ) const

The aspect ratio is the longest edge length divided by its height.

References Base::Vector3< _Precision >::Sqr().

Referenced by Mesh::FacetPy::getAspectRatio().

◆ AspectRatio2()

float MeshGeomFacet::AspectRatio2 ( ) const

The alternative aspect ration is the ratio of the radius of the circum-circle and twice the radius of the in-circle.

References Base::Distance().

Referenced by Mesh::FacetPy::getAspectRatio2().

◆ CalcNormal()

void MeshCore::MeshGeomFacet::CalcNormal ( void  )

◆ CenterOfCircumCircle()

float MeshGeomFacet::CenterOfCircumCircle ( Base::Vector3f rclCenter) const

◆ CenterOfInscribedCircle()

float MeshGeomFacet::CenterOfInscribedCircle ( Base::Vector3f rclCenter) const

Calculates the center and radius of the inscribed circle of the facet.

References Area(), Base::Distance(), Base::Vector3< _Precision >::x, Base::Vector3< _Precision >::y, and Base::Vector3< _Precision >::z.

Referenced by Mesh::FacetPy::getInCircle().

◆ ContainedByOrIntersectBoundingBox()

bool MeshCore::MeshGeomFacet::ContainedByOrIntersectBoundingBox ( const Base::BoundBox3f rcBB) const

Checks if the facet is inside the bounding box or intersects with it.

References GetBoundBox(), IntersectBoundingBox(), and Base::BoundBox3< _Precision >::IsInBox().

◆ DistancePlaneToPoint()

float MeshCore::MeshGeomFacet::DistancePlaneToPoint ( const Base::Vector3f rclPoint) const

Calculates the distance of a point to the plane defined by the triangle.

References Base::Vector3< _Precision >::DistanceToPlane(), and GetNormal().

Referenced by IsPointOf().

◆ DistanceToLineSegment()

float MeshGeomFacet::DistanceToLineSegment ( const Base::Vector3f rcP1,
const Base::Vector3f rcP2 
) const

Calculates the shortest distance from the line segment defined by rcP1 and rcP2 to this facet.

References Base::Vector3< _Precision >::x, Base::Vector3< _Precision >::y, and Base::Vector3< _Precision >::z.

◆ DistanceToPoint() [1/2]

float MeshGeomFacet::DistanceToPoint ( const Base::Vector3f rclPt,
Base::Vector3f rclNt 
) const

Calculates the shortest distance from the point rcPt to the facet.

rclNt is the point of the facet with shortest distance.

References Base::Vector3< _Precision >::Set(), Base::Vector3< _Precision >::x, Base::Vector3< _Precision >::y, and Base::Vector3< _Precision >::z.

◆ DistanceToPoint() [2/2]

float MeshCore::MeshGeomFacet::DistanceToPoint ( const Base::Vector3f rcPt) const

◆ Enlarge()

void MeshGeomFacet::Enlarge ( float  fDist)

◆ Foraminate()

bool MeshGeomFacet::Foraminate ( const Base::Vector3f rclPt,
const Base::Vector3f rclDir,
Base::Vector3f rclRes,
float  fMaxAngle = Mathf::PI 
) const

Calculates the intersection point of the line defined by the base rclPt and the direction rclDir with the facet.

The intersection must be inside the facet. If there is no intersection false is returned. This does actually the same as IntersectWithLine() with one additionally constraint that the angle between the direction of the line and the normal of the plane must not exceed fMaxAngle.

References Base::Vector3< _Precision >::GetAngle(), and GetNormal().

Referenced by MeshPart::CurveProjectorShape::findStartPoint(), MeshPart::CurveProjectorSimple::findStartPoint(), Mesh::MeshPy::foraminate(), MeshCore::MeshAlgorithm::GetFacetsFromToolMesh(), MeshCore::MeshAlgorithm::NearestFacetOnRay(), and MeshCore::MeshAlgorithm::Surround().

◆ GetBoundBox()

Base::BoundBox3f MeshCore::MeshGeomFacet::GetBoundBox ( void  ) const

◆ GetGravityPoint()

◆ GetNormal()

Base::Vector3f MeshCore::MeshGeomFacet::GetNormal ( void  ) const

Returns the normal of the facet.

References CalcNormal().

Referenced by MeshCore::MeshBuilder::AddFacet(), MeshCore::MeshKernel::AddFacet(), MeshCore::MeshTopoAlgorithm::AdjustEdgesToCurvatureDirection(), ArrangeNormal(), MeshGui::ViewProviderMeshTransformDemolding::calcNormalVector(), MeshGui::ViewProviderMesh::createToolMesh(), DistancePlaneToPoint(), MeshCore::MeshEvalDentsOnSurface::Evaluate(), MeshCore::MeshEvalFoldsOnBoundary::Evaluate(), MeshCore::MeshAlgorithm::FillupHole(), MeshPart::CurveProjectorShape::findStartPoint(), MeshPart::CurveProjectorSimple::findStartPoint(), Foraminate(), Inspection::InspectNominalMesh::getDistance(), Inspection::InspectNominalFastMesh::getDistance(), MeshCore::PlaneSurfaceFit::Initialize(), IntersectPlaneWithLine(), IntersectWithFacet(), MeshCore::MeshTopoAlgorithm::IsCollapseEdgeLegal(), IsPointOf(), MeshPart::CurveProjectorWithToolMesh::makeToolMesh(), Mesh::MeshObject::offsetSpecial2(), MeshPart::MeshAlgos::offsetSpecial2(), MeshPart::CurveProjectorSimple::projectCurve(), MeshPart::CurveProjectorShape::projectCurve(), MeshPart::MeshProjection::projectEdgeToEdge(), ProjectFacetToPlane(), ProjectPointToPlane(), MeshCore::MeshOutput::SaveAsciiSTL(), MeshCore::MeshOutput::SaveBinarySTL(), MeshCore::MeshOutput::SaveInventor(), MeshCore::MeshOutput::SaveOBJ(), MeshCore::MeshTopoAlgorithm::ShouldSwapEdge(), MeshGui::ViewProviderMeshOrientation::showDefects(), MeshGui::ViewProviderMeshDuplicatedFaces::showDefects(), MeshGui::ViewProviderMeshIndices::showDefects(), MeshGui::ViewProviderMeshFolds::showDefects(), and MeshCore::CylinderSurfaceFit::TestTriangle().

◆ IntersectBoundingBox()

◆ IntersectPlaneWithLine()

bool MeshGeomFacet::IntersectPlaneWithLine ( const Base::Vector3f rclBase,
const Base::Vector3f rclNormal,
Base::Vector3f rclRes 
) const

Checks if the plane defined by the facet rclFacet intersects with the line defined by the base rclBase and the direction rclNormal and returns the intersection point rclRes if possible.

References GetGravityPoint(), and GetNormal().

Referenced by IntersectWithLine(), ProjectFacetToPlane(), and MeshPart::MeshProjection::projectOnMesh().

◆ IntersectWithFacet() [1/2]

int MeshGeomFacet::IntersectWithFacet ( const MeshGeomFacet facet,
Base::Vector3f rclPt0,
Base::Vector3f rclPt1 
) const

Intersect the facet with the other facet The result is line given by two points (if intersected).

Fast Triangle-Triangle Intersection Test by Tomas Moeller http://www.acm.org/jgt/papers/Moller97/tritri.html http://www.cs.lth.se/home/Tomas_Akenine_Moller/code/.

Return is the number of intersections points: 0: no intersection, 1: one intersection point (rclPt0), 2: two intersections points (rclPt0, rclPt1)

References GetBoundBox(), GetNormal(), Base::BoundBox3< _Precision >::IsInBox(), IsPointOf(), Base::Vector3< _Precision >::x, Base::Vector3< _Precision >::y, and Base::Vector3< _Precision >::z.

◆ IntersectWithFacet() [2/2]

bool MeshGeomFacet::IntersectWithFacet ( const MeshGeomFacet rclFacet) const

◆ IntersectWithLine()

bool MeshGeomFacet::IntersectWithLine ( const Base::Vector3f rclPt,
const Base::Vector3f rclDir,
Base::Vector3f rclRes 
) const

Calculates the intersection point of the line defined by the base rclPt and the direction rclDir with the facet.

The intersection must be inside the facet. If there is no intersection false is returned.

References IntersectPlaneWithLine(), and IsPointOfFace().

Referenced by MeshCore::MeshEvalDentsOnSurface::Evaluate(), MeshPart::CurveProjectorWithToolMesh::makeToolMesh(), and MeshPart::CurveProjectorSimple::projectCurve().

◆ IntersectWithPlane() [1/2]

bool MeshCore::MeshGeomFacet::IntersectWithPlane ( const Base::Vector3f rclBase,
const Base::Vector3f rclNormal 
) const

Checks if the facet intersects with the plane defined by the base rclBase and the normal rclNormal.

◆ IntersectWithPlane() [2/2]

bool MeshGeomFacet::IntersectWithPlane ( const Base::Vector3f rclBase,
const Base::Vector3f rclNormal,
Base::Vector3f rclP1,
Base::Vector3f rclP2 
) const

◆ IsDeformed()

bool MeshGeomFacet::IsDeformed ( float  fCosOfMinAngle,
float  fCosOfMaxAngle 
) const

Checks whether the triangle is deformed.

A triangle is deformed if an angle exceeds a given maximum angle or falls below a given minimum angle. For performance reasons the cosine of minimum and maximum angle is expected.

References Base::Vector3< _Precision >::Normalize().

Referenced by MeshCore::MeshEvalDeformedFacets::Evaluate(), MeshCore::MeshEvalDeformedFacets::GetIndices(), Mesh::FacetPy::isDeformed(), and Mesh::MeshObject::refine().

◆ IsDegenerated()

bool MeshGeomFacet::IsDegenerated ( float  epsilon) const

◆ IsFlag()

bool MeshCore::MeshGeomFacet::IsFlag ( MeshFacet::TFlagType  tF) const

Query the flag state of the facet.

Referenced by Mesh::MeshObject::offsetSpecial2(), and MeshPart::MeshAlgos::offsetSpecial2().

◆ IsPointOf() [1/2]

bool MeshGeomFacet::IsPointOf ( const Base::Vector3f rclPoint) const

Checks if the point is inside or at the border of the facet.

The point must already exactly lie on the plane defined by the facet, which is not checked. This method is very efficient.

◆ IsPointOf() [2/2]

bool MeshGeomFacet::IsPointOf ( const Base::Vector3f rclPoint,
float  fDistance 
) const

Checks if the point is part of the facet.

A point is regarded as part of a facet if the distance is lower fDistance and the projected point in the facet normal direction is inside the triangle.

References DistancePlaneToPoint(), Base::Vector3< _Precision >::DistanceToLine(), and GetNormal().

Referenced by IntersectWithFacet().

◆ IsPointOfFace()

bool MeshGeomFacet::IsPointOfFace ( const Base::Vector3f rclP,
float  fDistance 
) const

Checks whether the given point is inside the facet with tolerance fDistance.

This method does actually the same as IsPointOf() but this implementation is done more effective through comparison of normals.

Referenced by MeshCore::MeshAlgorithm::FirstFacetToVertex(), MeshCore::MeshAlgorithm::GetFacetsFromToolMesh(), IntersectWithLine(), MeshPart::MeshProjection::projectOnMesh(), and MeshCore::MeshAlgorithm::Surround().

◆ IsPointOfSphere() [1/2]

bool MeshGeomFacet::IsPointOfSphere ( const Base::Vector3f rP) const

The center and radius of the circum circle define a sphere in 3D.

If the point rP is part of this sphere true is returned, otherwise false.

References CenterOfCircumCircle(), DraftVecUtils::dist(), and Base::DistanceP2().

◆ IsPointOfSphere() [2/2]

bool MeshGeomFacet::IsPointOfSphere ( const MeshGeomFacet rFacet) const

This is an overloaded member function, provided for convenience.

It behaves essentially like the above function. If one of the facet's points is inside the sphere true is returned, otherwise false.

References CenterOfCircumCircle(), DraftVecUtils::dist(), and Base::DistanceP2().

◆ MaximumAngle()

float MeshGeomFacet::MaximumAngle ( ) const

◆ MinimumAngle()

float MeshGeomFacet::MinimumAngle ( ) const

Calculates the minimum angle of a facet.

References Base::Vector3< _Precision >::GetAngle(), and MeshCore::Math< Prec >::PI.

◆ NearestEdgeToPoint() [1/2]

unsigned short MeshGeomFacet::NearestEdgeToPoint ( const Base::Vector3f rclPt) const

Returns the edge number of the facet that is nearest to the point rclPt.

References Base::Distance().

Referenced by MeshCore::MeshAlgorithm::FirstFacetToVertex().

◆ NearestEdgeToPoint() [2/2]

void MeshGeomFacet::NearestEdgeToPoint ( const Base::Vector3f rclPt,
float &  fDistance,
unsigned short &  side 
) const

Returns the edge number side of the facet and the distance to the edge that is nearest to the point rclPt.

References Base::Distance().

◆ NormalInvalid()

void MeshCore::MeshGeomFacet::NormalInvalid ( void  )

Invalidate the normal.

It will be recomputed when querying it.

Referenced by Transform().

◆ Perimeter()

float MeshCore::MeshGeomFacet::Perimeter ( ) const

Calculates the perimeter of the facet.

References Base::Distance().

Referenced by MeshCore::MeshRemoveNeedles::Fixup().

◆ ProjectFacetToPlane()

void MeshGeomFacet::ProjectFacetToPlane ( MeshGeomFacet rclFacet) const

Calculates the projection of a facet onto the plane defined by the triangle.

References GetNormal(), and IntersectPlaneWithLine().

◆ ProjectPointToPlane()

void MeshGeomFacet::ProjectPointToPlane ( const Base::Vector3f rclPoint,
Base::Vector3f rclProj 
) const

Calculates the projection of a point onto the plane defined by the triangle.

References GetNormal(), and Base::Vector3< _Precision >::ProjectToPlane().

Referenced by MeshCore::MeshAlgorithm::FirstFacetToVertex().

◆ ResetFlag()

void MeshCore::MeshGeomFacet::ResetFlag ( MeshFacet::TFlagType  tF)

Reset flag state.

◆ Roundness()

float MeshGeomFacet::Roundness ( ) const

The roundness is in the range between 0.0 (colinear) and 1.0 (equilateral).

References Area(), and Base::Vector3< _Precision >::Sqr().

Referenced by Mesh::FacetPy::getRoundness().

◆ SetFlag()

void MeshCore::MeshGeomFacet::SetFlag ( MeshFacet::TFlagType  tF)

Set flag state.

◆ SetNormal()

void MeshCore::MeshGeomFacet::SetNormal ( const Base::Vector3f rclNormal)

◆ SubSample()

void MeshGeomFacet::SubSample ( float  fStep,
std::vector< Base::Vector3f > &  rclPoints 
) const

◆ Transform()

void MeshGeomFacet::Transform ( const Base::Matrix4D mat)

◆ VolumeOfPrism()

float MeshGeomFacet::VolumeOfPrism ( const MeshGeomFacet rclF) const

Calculates the volume of the prism defined by two facets.

Note
The two facets must not intersect.

◆ Weights()

bool MeshGeomFacet::Weights ( const Base::Vector3f rclP,
float &  w0,
float &  w1,
float &  w2 
) const

Calculates the weights w1, ..., w3 of the corners to get the point rclP, i.e.

rclP = w0*v0 + w1*v1 + w2*v2 (v0-v2 are the corners corners). If w0+w1+w2==1.0 then the point rclP lies on the plane that is spanned by the facet, otherwise the point doesn't lie on the plane. If the sum of wi is 1 and if each wi is between [0,1] than the point lies inside the facet or on the border, respectively.

If the point doesn't lie on the plane false is returned, true otherwise.

References Area(), and MeshGeomFacet().


The documentation for this class was generated from the following files:
  • Sources/FreeCAD/src/Mod/Mesh/App/Core/Elements.h
  • Sources/FreeCAD/src/Mod/Mesh/App/Core/Elements.cpp