19template <
class TriangleMeshType>
93 int NumVertices =
Mesh.VertexCount();
96 Centroid /= (
double)NumVertices;
130 return Volume * (1.0 / 6.0);
155 double tmp0 = V0.X + V1.X;
201 V0.X * V0.X + V1.X * (V0.X + V1.X) + V2.X * F1.
X,
202 V0.Y * V0.Y + V1.Y * (V0.Y + V1.Y) + V2.Y * F1.
Y,
203 V0.Z * V0.Z + V1.Z * (V0.Z + V1.Z) + V2.Z * F1.
Z);
224 for (
int TriIdx : TriIndices)
241 double tmp0 = V0.X + V1.X;
254 for (
int i = 1; i < 3; ++i)
257 if (V.
X < MinV.
X) MinV.
X = V.
X;
259 if (V.
Y < MinV.
Y) MinV.
Y = V.
Y;
261 if (V.
Z < MinV.
Z) MinV.
Z = V.
Z;
270 for (
int i = 0; i <
Mesh.MaxVertexID(); ++i)
272 if (
Mesh.IsVertex(i))
281 template<
typename EnumerableTriListType>
303 template<
typename EnumerableTriListType>
310 for (
int32 vid : Vertices)
312 if (
Mesh.IsVertex(vid))
350 NearestPoint =
Query.ClosestTrianglePoint;
416 return A.Key <
B.Key;
454 template<
typename RayType = FRay3d>
471 Lengths.
Init(-1.0,
Mesh.MaxEdgeID());
473 for (
const int32 EdgeID :
Mesh.EdgeIndicesItr())
485 if (
Mesh.EdgeCount() == 0)
493 Mesh.GetEdgeV(EdgeIndex, vA, vB);
494 return (vA - vB).Length();
503 double MaxLength = 0.0;
504 for (
auto EdgeID :
Mesh.EdgeIndicesItr())
508 MaxLength = FMath::Max(MaxLength, (
vA -
vB).
Length());
517 if (
Mesh.EdgeCount() == 0)
522 double MinLength = FMathd::MaxReal;
523 for (
auto EdgeID :
Mesh.EdgeIndicesItr())
527 MinLength = FMath::Min(MinLength, (
vA -
vB).
Length());
537 for (
int EdgeID : Edges)
539 if (
Mesh.IsEdge(EdgeID))
542 Mesh.GetEdgeV(EdgeID,
A,
B);
554 if (
Mesh.EdgeCount() == 0)
567 for (
int EdgeID : Edges)
569 if (
Mesh.IsEdge(EdgeID))
572 Mesh.GetEdgeV(EdgeID,
A,
B);
589 if (
Mesh.EdgeCount() == 0)
604 int MaxCount = (NumSamples == 0) ?
MaxID : NumSamples;
611 if (
Mesh.IsEdge(EdgeID))
613 Mesh.GetEdgeV(EdgeID,
A,
B);
621 }
while (EdgeID != 0 && EdgeCount < MaxCount);
630 template<
typename MeshSpatialType>
638 if (!MeshA.IsVertex(VertexID)) { return; }
642 SpatialB.FindNearestTriangle(VertexPosition, DistSqr);
643 Distances[VertexID] =
sqrt(DistSqr);
652 template<
typename MeshSpatialType>
659 for (
auto& Dist : Distances)
668 template<
typename MeshSpatialType>
677 template<
typename MeshSpatialType>
683 for (
int VertexID = 0; VertexID <
MeshA.VertexCount(); ++VertexID)
685 if (!
MeshA.IsVertex(VertexID)) {
continue; }
689 SpatialB.FindNearestTriangle(VertexPosition, DistSqr);
690 Distances[VertexID] =
sqrt(DistSqr);
696 template<
typename MeshSpatialType>
703 for (
auto& Dist : Distances)
711 template<
typename MeshSpatialType>
721 template<
typename MeshSpatialType>
749 for (
double& Dist : Distances)
752 MinDistance = FMath::Min(Dist, MinDistance);
792 for (
const int32 VID : Vertices)
796 TriangleSet.Add(
TID);
800 return TriangleSet.Array();
#define check(expr)
Definition AssertionMacros.h:314
void ParallelFor(int32 Num, TFunctionRef< void(int32)> Body, bool bForceSingleThread, bool bPumpRenderingThread=false)
Definition ParallelFor.h:481
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::Math::TVector2< double > FVector2d
Definition MathFwd.h:61
#define BIG_NUMBER
Definition UnrealMathUtility.h:68
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void SetNumZeroed(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2340
void Init(const ElementType &Element, SizeType Number)
Definition Array.h:3043
void Append(const TArray< OtherElementType, OtherAllocatorType > &Source)
Definition Array.h:2412
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition UnrealString.h.inl:34
static RealType Sqrt(const RealType Value)
Definition MathUtil.h:342
Definition DistPoint3Triangle3.h:23
Real GetSquared()
Definition DistPoint3Triangle3.h:44
Definition IntrRay3Triangle3.h:67
bool Find()
Definition IntrRay3Triangle3.h:244
static bool Intersects(const TTriangle3< Real > &Triangle0, const TTriangle3< Real > &Triangle1, Real Tolerance=TMathUtil< Real >::ZeroTolerance)
Definition IntrTriangle3Triangle3.h:386
Definition MeshQueries.h:21
static double GetVolumeNonWatertight(const TriangleMeshType &Mesh, double DimScaleFactor=1)
Definition MeshQueries.h:107
static FVector2d GetVolumeAreaCenter(const TriangleMeshType &Mesh, FVector3d &OutCenterOfMass)
Definition MeshQueries.h:163
static FIntrRay3Triangle3d TriangleIntersection(const TriangleMeshType &Mesh, int TriIdx, const FRay3d &Ray)
Definition MeshQueries.h:41
static double MaxEdgeLength(const TriangleMeshType &Mesh)
Compute the longest edge length for the given mesh.
Definition MeshQueries.h:501
static FIndex2i FindIntersectingTriangles_LinearSearch(const TriangleMeshType &Mesh1, const TriangleMeshType &Mesh2)
Definition MeshQueries.h:424
static void VertexToSurfaceDistances(const TriangleMeshType &MeshA, const MeshSpatialType &SpatialB, TArray< double > &Distances)
Definition MeshQueries.h:631
static int FindHitTriangle_LinearSearch(const TriangleMeshType &Mesh, const FRay3d &Ray)
Definition MeshQueries.h:371
static void GetAllEdgeLengths(const TriangleMeshType &Mesh, TArray< double > &Lengths, double &TotalLength)
Definition MeshQueries.h:469
static double HausdorffDistanceSerial(const TriangleMeshType &MeshA, const MeshSpatialType &SpatialB)
Definition MeshQueries.h:697
static void VertexToSurfaceDistancesSerial(const TriangleMeshType &MeshA, const MeshSpatialType &SpatialB, TArray< double > &Distances)
Compute all vertex-to-surface distances in serial. Should only be used for debugging the parallel ver...
Definition MeshQueries.h:678
static double AverageEdgeLength(const TriangleMeshType &Mesh)
Compute the mean edge length for the given mesh.
Definition MeshQueries.h:483
static void EdgeLengthStatsFromEdges(const TriangleMeshType &Mesh, const TArray< int > &Edges, double &MinEdgeLength, double &MaxEdgeLength, double &AverageEdgeLength)
Given a mesh and a subset of mesh edges, compute the min, max, and mean edge lengths.
Definition MeshQueries.h:551
static FVector3d GetMeshVerticesCentroid(const TriangleMeshType &Mesh)
Definition MeshQueries.h:83
static FVector3d FindNearestPoint_LinearSearch(const TriangleMeshType &Mesh, const FVector3d &P)
Definition MeshQueries.h:340
static double TotalEdgeLength(const TriangleMeshType &Mesh, const TArray< int > &Edges)
Given a mesh and a subset of mesh edges, compute the total length of all the edges.
Definition MeshQueries.h:534
static FVector3d GetVertexWeightsOnTriangle(const TriangleMeshType &Mesh, int TriID, double TriArea, bool bWeightByArea, bool bWeightByAngle)
Definition MeshQueries.h:768
static FVector3d GetTriCentroid(const TriangleMeshType &Mesh, int TriIdx)
Definition MeshQueries.h:57
static FAxisAlignedBox3d GetTrianglesBounds(const TriangleMeshType &Mesh, const EnumerableTriListType &Triangles, const FTransform &Transform=FTransform::Identity)
Definition MeshQueries.h:282
static double HausdorffDistance(const TriangleMeshType &MeshA, const MeshSpatialType &SpatialB)
Definition MeshQueries.h:653
static FIntrRay3Triangle3d RayTriangleIntersection(const TriangleMeshType &Mesh, int TriIdx, const RayType &Ray)
Definition MeshQueries.h:455
static FVector2d GetVolumeArea(const TriangleMeshType &Mesh, const TArray< int > &TriIndices)
Definition MeshQueries.h:220
static FAxisAlignedBox3d GetTriBounds(const TriangleMeshType &Mesh, int TID)
Definition MeshQueries.h:249
static FDistPoint3Triangle3d TriangleDistance(const TriangleMeshType &Mesh, int TriIdx, FVector3d Point)
Definition MeshQueries.h:28
static double TwoSidedHausdorffDistanceSerial(const TriangleMeshType &MeshA, const MeshSpatialType &SpatialA, const TriangleMeshType &MeshB, const MeshSpatialType &SpatialB)
Definition MeshQueries.h:712
static void ExpandVertexSelectionToNeighbors(const TriangleMeshType &Mesh, const TArray< int32 > &Selection, TArray< int32 > &ExpandedSelection, TMap< int32, int32 > &VIDToExpandedSelectionIdx)
Definition MeshQueries.h:810
static void MeshDistanceStatistics(const TriangleMeshType &MeshA, const MeshSpatialType &SpatialB, const TriangleMeshType *MeshB, const MeshSpatialType *SpatialA, bool bSymmetric, double &MaxDistance, double &MinDistance, double &AverageDistance, double &RootMeanSqrDeviation)
Definition MeshQueries.h:722
static void GetTriNormalAreaCentroid(const TriangleMeshType &Mesh, int TriIdx, FVector3d &Normal, double &Area, FVector3d &Centroid)
Definition MeshQueries.h:72
static void FindHitTriangles_LinearSearch(const TriangleMeshType &Mesh, const FRay3d &Ray, TArray< TPair< float, int > > &SortedHitTriangles)
Definition MeshQueries.h:399
static double MinEdgeLength(const TriangleMeshType &Mesh)
Compute the shortest edge length for the given mesh.
Definition MeshQueries.h:515
static int FindNearestTriangle_LinearSearch(const TriangleMeshType &Mesh, const FVector3d &P)
Definition MeshQueries.h:321
static FAxisAlignedBox3d GetBounds(const TriangleMeshType &Mesh)
Definition MeshQueries.h:267
static FVector2d GetVolumeArea(const TriangleMeshType &Mesh)
Definition MeshQueries.h:134
static FAxisAlignedBox3d GetVerticesBounds(const TriangleMeshType &Mesh, const EnumerableTriListType &Vertices, const FTransform &Transform=FTransform::Identity)
Definition MeshQueries.h:304
static void EdgeLengthStats(const TriangleMeshType &Mesh, double &MinEdgeLength, double &MaxEdgeLength, double &AverageEdgeLength, int NumSamples=0)
Definition MeshQueries.h:586
static double TwoSidedHausdorffDistance(const TriangleMeshType &MeshA, const MeshSpatialType &SpatialA, const TriangleMeshType &MeshB, const MeshSpatialType &SpatialB)
Because Hausdorff distance is not symmetric, we compute the maximum of the distances between two surf...
Definition MeshQueries.h:669
static TArray< int32 > GetVertexSelectedTriangles(const TriangleMeshType &Mesh, const TArray< int32 > &Vertices)
Definition MeshQueries.h:788
static double TriDistanceSqr(const TriangleMeshType &Mesh, int TriIdx, const FVector3d &Point)
Definition MeshQueries.h:361
T TransformAccumulate(const A &Input, MapT MapOp, T Init, OpT Op)
Definition Accumulate.h:71
constexpr int InvalidID
Definition IndexTypes.h:13
TVector< RealType > NormalArea(const TVector< RealType > &V0, const TVector< RealType > &V1, const TVector< RealType > &V2, RealType &AreaOut)
Definition VectorUtil.h:139
TAxisAlignedBox3< double > FAxisAlignedBox3d
Definition BoxTypes.h:885
@ Area
Definition FitOrientedBox2.h:17
@ Volume
Definition FitOrientedBox3.h:19
Definition AdvancedWidgetsModule.cpp:13
Definition NumericLimits.h:41
Definition IndexTypes.h:27
static constexpr FIndex2i Invalid()
Definition IndexTypes.h:52
Definition IndexTypes.h:158
static TAxisAlignedBox3< double > Empty()
Definition BoxTypes.h:382
void Contain(const TVector< RealType > &V)
Definition BoxTypes.h:438
Definition TriangleTypes.h:263
TVector< RealType > Centroid() const
Definition TriangleTypes.h:304
static TVector< double > One()
Definition Vector.h:115
T Z
Definition Vector.h:68
T Y
Definition Vector.h:65
static CORE_API const TVector< double > ZeroVector
Definition Vector.h:79
T Length() const
Definition Vector.h:1722
UE_FORCEINLINE_HINT TVector< T > Cross(const TVector< T > &V2) const
Definition Vector.h:1535
T X
Definition Vector.h:62
UE_FORCEINLINE_HINT T Dot(const TVector< T > &V) const
Definition Vector.h:1553