FreeCAD C++
Public Member Functions | Public Attributes | Protected Attributes | List of all members
MeshCore::MeshGeomFacet Class Reference

#include <Mod/Mesh/App/Core/Elements.h>

Detailed Description

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

Public Member Functions

bool IsPointOf (const Base::Vector3f &rclPoint, float fDistance) const
 
bool IsPointOf (const Base::Vector3f &rclPoint) const
 
bool IsPointOfFace (const Base::Vector3f &rclP, float fDistance) const
 
bool Weights (const Base::Vector3f &rclP, float &w0, float &w1, float &w2) const
 
float DistancePlaneToPoint (const Base::Vector3f &rclPoint) const
 
void ProjectPointToPlane (const Base::Vector3f &rclPoint, Base::Vector3f &rclProj) const
 
void ProjectFacetToPlane (MeshGeomFacet &rclFacet) const
 
bool IsDegenerated (float epsilon) const
 
bool IsDeformed (float fCosOfMinAngle, float fCosOfMaxAngle) const
 
void Enlarge (float fDist)
 
void CalcNormal (void)
 
void ArrangeNormal (const Base::Vector3f &rclN)
 
void AdjustCirculationDirection (void)
 
void NormalInvalid (void)
 
bool IsFlag (MeshFacet::TFlagType tF) const
 
void SetFlag (MeshFacet::TFlagType tF)
 
void ResetFlag (MeshFacet::TFlagType tF)
 
Base::Vector3f GetGravityPoint (void) const
 
Base::Vector3f GetNormal (void) const
 
void SetNormal (const Base::Vector3f &rclNormal)
 
Base::BoundBox3f GetBoundBox (void) const
 
float Perimeter () const
 
float Area () const
 
float MaximumAngle () const
 
float MinimumAngle () const
 
bool ContainedByOrIntersectBoundingBox (const Base::BoundBox3f &rcBB) const
 
bool IntersectBoundingBox (const Base::BoundBox3f &rclBB) const
 
bool IntersectWithFacet (const MeshGeomFacet &rclFacet) const
 
int IntersectWithFacet (const MeshGeomFacet &facet, Base::Vector3f &rclPt0, Base::Vector3f &rclPt1) const
 
float DistanceToLineSegment (const Base::Vector3f &rcP1, const Base::Vector3f &rcP2) const
 
float DistanceToPoint (const Base::Vector3f &rcPt) const
 
float DistanceToPoint (const Base::Vector3f &rclPt, Base::Vector3f &rclNt) const
 
bool IntersectWithLine (const Base::Vector3f &rclPt, const Base::Vector3f &rclDir, Base::Vector3f &rclRes) const
 
bool Foraminate (const Base::Vector3f &rclPt, const Base::Vector3f &rclDir, Base::Vector3f &rclRes, float fMaxAngle=Mathf::PI) const
 
bool IntersectWithPlane (const Base::Vector3f &rclBase, const Base::Vector3f &rclNormal, Base::Vector3f &rclP1, Base::Vector3f &rclP2) const
 
bool IntersectWithPlane (const Base::Vector3f &rclBase, const Base::Vector3f &rclNormal) const
 
bool IntersectPlaneWithLine (const Base::Vector3f &rclBase, const Base::Vector3f &rclNormal, Base::Vector3f &rclRes) const
 
float VolumeOfPrism (const MeshGeomFacet &rclF) const
 
void SubSample (float fStep, std::vector< Base::Vector3f > &rclPoints) const
 
float CenterOfInscribedCircle (Base::Vector3f &rclCenter) const
 
float CenterOfCircumCircle (Base::Vector3f &rclCenter) const
 
unsigned short NearestEdgeToPoint (const Base::Vector3f &rclPt) const
 
void NearestEdgeToPoint (const Base::Vector3f &rclPt, float &fDistance, unsigned short &side) const
 
bool IsPointOfSphere (const Base::Vector3f &rP) const
 
bool IsPointOfSphere (const MeshGeomFacet &rFacet) const
 
float AspectRatio () const
 
float AspectRatio2 () const
 
float Roundness () const
 
Construction
 MeshGeomFacet (void)
 default constructor
 
 MeshGeomFacet (const Base::Vector3f &v1, const Base::Vector3f &v2, const Base::Vector3f &v3)
 Constructor with the corner points.
 
 ~MeshGeomFacet (void)
 Destruction.
 

Public Attributes

Base::Vector3f _aclPoints [3]
 
unsigned char _ucFlag
 
unsigned long _ulProp
 

Protected Attributes

Base::Vector3f _clNormal
 
bool _bNormalCalculated
 

Member Function Documentation

◆ AdjustCirculationDirection()

void MeshCore::MeshGeomFacet::AdjustCirculationDirection ( void  )

Adjusts the facet's orientation to its normal.

◆ Area()

float MeshCore::MeshGeomFacet::Area ( ) const

Calculates the area of a facet.

◆ ArrangeNormal()

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

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

◆ AspectRatio()

float MeshCore::MeshGeomFacet::AspectRatio ( ) const

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

◆ AspectRatio2()

float MeshCore::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.

◆ CalcNormal()

void MeshCore::MeshGeomFacet::CalcNormal ( void  )

Calculates the facet normal for storing internally.

◆ CenterOfCircumCircle()

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

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

◆ CenterOfInscribedCircle()

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

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

◆ ContainedByOrIntersectBoundingBox()

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

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

◆ DistancePlaneToPoint()

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

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

◆ DistanceToLineSegment()

float MeshCore::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.

◆ DistanceToPoint() [1/2]

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

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

◆ DistanceToPoint() [2/2]

float MeshCore::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.

◆ Enlarge()

void MeshCore::MeshGeomFacet::Enlarge ( float  fDist)

Enlarges the triangle.

◆ Foraminate()

bool MeshCore::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.

◆ GetBoundBox()

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

Returns the wrapping bounding box.

◆ GetGravityPoint()

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

Calculates the facet's gravity point.

◆ GetNormal()

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

Returns the normal of the facet.

◆ IntersectBoundingBox()

bool MeshCore::MeshGeomFacet::IntersectBoundingBox ( const Base::BoundBox3f rclBB) const

Checks if the facet intersects with the given bounding box.

◆ IntersectPlaneWithLine()

bool MeshCore::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.

◆ IntersectWithFacet() [1/2]

bool MeshCore::MeshGeomFacet::IntersectWithFacet ( const MeshGeomFacet rclFacet) const

This method checks if both facets intersect.

◆ IntersectWithFacet() [2/2]

int MeshCore::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). Return is the number of intersections points: 0: no intersection, 1: one intersection point (rclPt0), 2: two intersections points (rclPt0, rclPt1)

◆ IntersectWithLine()

bool MeshCore::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.

◆ IntersectWithPlane() [1/2]

bool MeshCore::MeshGeomFacet::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.

◆ IntersectWithPlane() [2/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.

◆ IsDeformed()

bool MeshCore::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.

◆ IsDegenerated()

bool MeshCore::MeshGeomFacet::IsDegenerated ( float  epsilon) const

Checks whether the triangle is degenerated. A triangle is degenerated if its area is less than an epsilon.

◆ IsFlag()

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

Query the flag state of the facet.

◆ IsPointOf() [1/2]

bool MeshCore::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.

◆ IsPointOf() [2/2]

bool MeshCore::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.

◆ IsPointOfFace()

bool MeshCore::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.

◆ IsPointOfSphere() [1/2]

bool MeshCore::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.

◆ IsPointOfSphere() [2/2]

bool MeshCore::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.

◆ MaximumAngle()

float MeshCore::MeshGeomFacet::MaximumAngle ( ) const

Calculates the maximum angle of a facet.

◆ MinimumAngle()

float MeshCore::MeshGeomFacet::MinimumAngle ( ) const

Calculates the minimum angle of a facet.

◆ NearestEdgeToPoint() [1/2]

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

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

◆ NearestEdgeToPoint() [2/2]

void MeshCore::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.

◆ NormalInvalid()

void MeshCore::MeshGeomFacet::NormalInvalid ( void  )

Checks if the normal is not yet calculated.

◆ Perimeter()

float MeshCore::MeshGeomFacet::Perimeter ( ) const

Calculates the perimeter of the facet.

◆ ProjectFacetToPlane()

void MeshCore::MeshGeomFacet::ProjectFacetToPlane ( MeshGeomFacet rclFacet) const

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

◆ ProjectPointToPlane()

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

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

◆ ResetFlag()

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

Reset flag state

◆ Roundness()

float MeshCore::MeshGeomFacet::Roundness ( ) const

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

◆ SetFlag()

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

Set flag state

◆ SetNormal()

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

Sets the facet's normal.

◆ SubSample()

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

Subsamples the facet into points with resolution fStep.

◆ VolumeOfPrism()

float MeshCore::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 MeshCore::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.

Member Data Documentation

◆ _aclPoints

Base::Vector3f MeshCore::MeshGeomFacet::_aclPoints[3]

Geometric corner points.

◆ _bNormalCalculated

bool MeshCore::MeshGeomFacet::_bNormalCalculated
protected

True if the normal is already calculated.

◆ _clNormal

Base::Vector3f MeshCore::MeshGeomFacet::_clNormal
protected

Normal of the facet.

◆ _ucFlag

unsigned char MeshCore::MeshGeomFacet::_ucFlag

Flag property

◆ _ulProp

unsigned long MeshCore::MeshGeomFacet::_ulProp

Free usable property.