UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PolylineTools.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "Core/Types.h"
5#include "Math/Aabb.h"
6#include "Math/Boundary.h"
7#include "Math/Geometry.h"
8#include "Math/Point.h"
9#include "Geo/GeoEnum.h"
10#include "Geo/GeoPoint.h"
12
13#include "Algo/ForEach.h"
14#include "Algo/Reverse.h"
15
16namespace UE::CADKernel
17{
18
20{
27
33
34 void Update(const double Coordinate, const FVector& Point)
35 {
36 for (int32 Index = 0; Index < 3; ++Index)
37 {
38 if (Point[Index] > Max[Index])
39 {
40 Max[Index] = Point[Index];
42 CoordinateOfMaxPoint[Index] = Coordinate;
43 }
44
45 if (Point[Index] < Min[Index])
46 {
47 Min[Index] = Point[Index];
49 CoordinateOfMinPoint[Index] = Coordinate;
50 }
51 }
52 }
53
54 void Update(const double Coordinate, const FVector2d& Point2D)
55 {
56 Update(Coordinate, FVector(Point2D, 0.));
57 }
58};
59
60namespace PolylineTools
61{
62
64{
65 double MeanLinearIteration = InPolylineSize / ResultSize;
67
69 {
70 return true;
71 }
72 return false;
73}
74
75template<typename PointType>
76inline PointType LinearInterpolation(const TArray<PointType>& Array, const int32 Index, const double Coordinate)
77{
78 ensureCADKernel(Index + 1 < Array.Num());
79 return PointOnSegment<PointType>(Array[Index], Array[Index + 1], Coordinate);
80}
81
82inline double SectionCoordinate(const TArray<double>& Array, const int32 Index, const double Coordinate)
83{
84 ensureCADKernel(Index + 1 < Array.Num());
85 const double DeltaU = Array[Index + 1] - Array[Index];
86 if (FMath::IsNearlyZero(DeltaU))
87 {
88 return 0;
89 }
90 return (Coordinate - Array[Index]) / DeltaU;
91}
92
93template<typename PointType>
95{
96 double Length = 0;
97 for (int32 Index = 1; Index < Polyline.Num(); ++Index)
98 {
99 Length += PointType::Distance(Polyline[Index - 1], Polyline[Index]);
100 }
101 return Length;
102}
103
104template<typename PointType>
106{
107 const double Tolerance = ComputeLength(Polyline) * 0.1;
108 return Tolerance * Tolerance;
109}
110
111template<typename PointType>
112TArray<double> ComputePolylineSegmentLengths(const PointType& StartPoint, const TArray<PointType>& InnerPolyline, const PointType& EndPoint)
113{
116 if (InnerPointCount > 0)
117 {
118 ElementLength.Reserve(InnerPointCount + 1);
119 const PointType* PrevPoint = &InnerPolyline[0];
120 {
121 ElementLength.Add(PointType::Distance(*PrevPoint, StartPoint));
122 }
123
124 for (int32 Index = 1; Index < InnerPointCount; ++Index)
125 {
127 ElementLength.Add(PointType::Distance(*PrevPoint, CurrentPoint));
129 }
130 {
131 ElementLength.Add(PointType::Distance(*PrevPoint, EndPoint));
132 }
133 }
134 else
135 {
136 ElementLength.Reserve(1);
137 ElementLength.Add(PointType::Distance(StartPoint, EndPoint));
138 }
139
140 return MoveTemp(ElementLength);
141}
142
146template<typename PointType>
148{
149 double DistanceStart = PointType::DistSquared(Polyline[0], DesiredEnd);
150 double DistanceEnd = PointType::DistSquared(Polyline.Last(), DesiredEnd);
151
153 {
155 }
156
158
159 PointType Delta = DesiredEnd - Polyline.Last();
161
162 PolylineLength = 0;
163 PolylineLength = PointType::Distance(Polyline[1], Polyline[0]);
164 for (int32 Index = 1; Index < Polyline.Num() - 1; ++Index)
165 {
166 double LengthNextSegment = PointType::Distance(Polyline[Index], Polyline[Index + 1]);
169 }
170 Polyline.Last() = DesiredEnd;
171
173 {
175 }
176}
177
178template<class PointType>
179PointType ComputePoint(const TArray<double>& PolylineCoordinates, const TArray<PointType>& PolylinePoints, const int32 Index, const double PointCoordinate)
180{
181 double Delta = PolylineCoordinates[Index + 1] - PolylineCoordinates[Index];
183 {
184 return PolylinePoints[Index];
185 }
186
187 return PolylinePoints[Index] + (PolylinePoints[Index + 1] - PolylinePoints[Index]) * (PointCoordinate - PolylineCoordinates[Index]) / Delta;
188};
189
190} // ns PolylineTools
191
192template<class PointType>
194{
195protected:
198
199public:
205
206protected:
207
209 {
211
213
215 double EdgeLength = 0;
216 double LengthOfSegment = 0;
217
220 {
221 PointType StartPoint = ComputePoint(BoundaryIndices[0], InBoundary.Min);
223
224 PointType EndPoint = ComputePoint(BoundaryIndices[1], InBoundary.Max);
226
227 EdgeLength = PointType::Distance(StartPoint, PolylinePoints[BoundaryIndices[0] + 1]);
228 double LengthOfSegments = PointType::Distance(PointIndice0, PolylinePoints[BoundaryIndices[0] + 1]);
229
230 LastEdgeSegmentLength = PointType::Distance(EndPoint, PolylinePoints[BoundaryIndices[1]]);
231 const double LastSegmentLength = PointType::Distance(NextPointIndice1, PolylinePoints[BoundaryIndices[1]]);
232
234 for (int32 Index = BoundaryIndices[0] + 1; Index < BoundaryIndices[1]; ++Index)
235 {
236 const double SegLength = PointType::Distance(PolylinePoints[Index], PolylinePoints[Index + 1]);
237 EdgeLength += SegLength;
240 }
241 EdgeLength += LastEdgeSegmentLength;
244 }
245 else
246 {
247 PointType StartPoint = ComputePoint(BoundaryIndices[0], InBoundary.Min);
248 PointType EndPoint = ComputePoint(BoundaryIndices[1], InBoundary.Max);
249 EdgeLength = PointType::Distance(StartPoint, EndPoint);
250 const double SegLength = PointType::Distance(PolylinePoints[BoundaryIndices[0]], PolylinePoints[BoundaryIndices[0] + 1]);
252 }
253 return EdgeLength;
254 }
255
256 PointType ComputePoint(const int32 Index, const double PointCoordinate) const
257 {
260 {
261 return PolylinePoints[Index];
262 }
263
265 };
266
272 {
273 double MinDistance = HUGE_VAL;
274 double UForMinDistance = 0;
275
276 double ParamU = 0.;
277 int32 SegmentIndex = 0;
278
280 {
282 double SquareDistance = FMath::Square(ProjectPoint[0] - InPointToProject[0]);
283 if (SquareDistance > MinDistance)
284 {
285 continue;
286 }
287 SquareDistance += FMath::Square(ProjectPoint[1] - InPointToProject[1]);
288 if (SquareDistance > MinDistance)
289 {
290 continue;
291 }
292 SquareDistance += FMath::Square(ProjectPoint[2] - InPointToProject[2]);
293 if (SquareDistance > MinDistance)
294 {
295 continue;
296 }
297 MinDistance = SquareDistance;
299 SegmentIndex = Index;
300 OutProjectedPoint = ProjectPoint;
301 }
302
304 }
305
306public:
307
314
319 PointType ApproximatePoint(const double InCoordinate) const
320 {
324 }
325
330 template<class CurvePointType>
332 {
335
336 OutPoint.DerivativeOrder = InDerivativeOrder;
337
338 double DeltaU = PolylineCoordinates[Index + 1] - PolylineCoordinates[Index];
339 if (FMath::IsNearlyZero(DeltaU))
340 {
342 OutPoint.Gradient = PointType::ZeroVector;
343 OutPoint.Laplacian = PointType::ZeroVector;
344 return;
345 }
346
347 double SectionCoordinate = (InCoordinate - PolylineCoordinates[Index]) / DeltaU;
348
349 PointType Tangent = PolylinePoints[Index + 1] - PolylinePoints[Index];
350 OutPoint.Point = PolylinePoints[Index] + Tangent * SectionCoordinate;
351
352 if (InDerivativeOrder > 0)
353 {
354 OutPoint.Gradient = Tangent;
355 OutPoint.Laplacian = PointType::ZeroVector;
356 }
357 }
358
359 template<class CurvePointType>
361 {
362 if (!InCoordinates.Num())
363 {
364 ensureCADKernel(false);
365 return;
366 }
367
369 {
370 for (int32 IPoint = 0; IPoint < InCoordinates.Num(); ++IPoint)
371 {
373
374 OutPoints[IPoint].DerivativeOrder = InDerivativeOrder;
375
376 double DeltaU = PolylineCoordinates[Index + 1] - PolylineCoordinates[Index];
377 if (FMath::IsNearlyZero(DeltaU))
378 {
380 OutPoints[IPoint].Gradient = PointType::ZeroVector;
381 OutPoints[IPoint].Laplacian = PointType::ZeroVector;
382 continue;
383 }
384
385 double SectionCoordinate = (InCoordinates[IPoint] - PolylineCoordinates[Index]) / DeltaU;
386
387 PointType Tangent = PolylinePoints[Index + 1] - PolylinePoints[Index];
388 OutPoints[IPoint].Point = PolylinePoints[Index] + Tangent * SectionCoordinate;
389
390 if (InDerivativeOrder > 0)
391 {
392 OutPoints[IPoint].Gradient = Tangent;
393 OutPoints[IPoint].Laplacian = PointType::ZeroVector;
394 }
395 }
396 };
397
399
400 int32 StartIndex = DichotomyFinder.Find(InCoordinates[0]);
401 int32 EndIndex = DichotomyFinder.Find(InCoordinates.Last());
402 bool bUseDichotomy = PolylineTools::IsDichotomyToBePreferred(EndIndex - StartIndex, InCoordinates.Num());
403
405 if (bUseDichotomy)
406 {
407 DichotomyFinder.StartLower = StartIndex;
408 DichotomyFinder.StartUpper = EndIndex;
410 }
411 else
412 {
415 }
416 }
417
418
424 {
425 if (!InCoordinates.Num())
426 {
427 return;
428 }
429
431 {
432 for (double Coordinate : InCoordinates)
433 {
434 int32 Index = Finder.Find(Coordinate);
435 OutPoints.Emplace(ComputePoint(Index, Coordinate));
436 }
437 };
438
440
441 int32 StartIndex = DichotomyFinder.Find(InCoordinates[0]);
442 int32 EndIndex = DichotomyFinder.Find(InCoordinates.Last());
443 bool bUseDichotomy = PolylineTools::IsDichotomyToBePreferred(EndIndex - StartIndex, InCoordinates.Num());
444
445 OutPoints.Empty(InCoordinates.Num());
446 if (bUseDichotomy)
447 {
448 DichotomyFinder.StartLower = StartIndex;
449 DichotomyFinder.StartUpper = EndIndex;
451 }
452 else
453 {
456 }
457 }
458
460 {
462
465
466 const PointType StartPoint = ComputePoint(BoundaryIndices[0], InBoundary.Min);
467 double FromStartSegmentLength = PointType::Distance(PolylinePoints[BoundaryIndices[0]], StartPoint);
468
470 {
471 OutCoordinates.SetNum(3);
472 OutCoordinates[0] = InBoundary.GetMin();
473 OutCoordinates[1] = InBoundary.GetMiddle();
474 OutCoordinates[2] = InBoundary.GetMax();
475 return;
476 }
477
479
480 const double SectionLength = CurveLength / (double)(SegmentNum);
481
482 OutCoordinates.Empty();
483 OutCoordinates.Reserve(SegmentNum + 1);
484 OutCoordinates.Add(InBoundary.Min);
485
486 TFunction<double(const int32, const int32, const double, const double)> ComputeSamplePointCoordinate = [&](const int32 IndexCurvilinear, const int32 IndexCoordinate, const double Length, const double Coordinate)
487 {
489 };
490
491 double CurvilinearLength = 0.;
492
493 double LastCoordinate = InBoundary.Min;
495 {
497 {
499 OutCoordinates.Add(Coordinate);
503 {
504 while (OutCoordinates.Last() + SMALL_NUMBER > InBoundary.GetMax())
505 {
506 OutCoordinates.Pop();
507 }
508 OutCoordinates.Add(InBoundary.GetMax());
509 return;
510 }
511 }
513 }
514
515 while (OutCoordinates.Last() + SMALL_NUMBER > InBoundary.GetMax())
516 {
518 }
519 OutCoordinates.Add(InBoundary.GetMax());
520 }
521
526 double ProjectPointToPolyline(const FLinearBoundary& InBoundary, const PointType& PointOnEdge, PointType& OutProjectedPoint) const
527 {
531 if (InBoundary.Contains(Coordinate))
532 {
533 return Coordinate;
534 }
535
536 if (Coordinate < InBoundary.GetMin())
537 {
538 Coordinate = InBoundary.GetMin();
539 }
540 else if (Coordinate > InBoundary.GetMax())
541 {
542 Coordinate = InBoundary.GetMax();
543 }
545 return Coordinate;
546 }
547
569
576 {
577#ifdef DEBUG_PROJECT_COINCIDENTAL_POLYLINE
578 static int32 Counter = 0;
579 ++Counter;
580 bool bDisplay = true; // (Counter == 22);
581 if (bDisplay)
582 {
583 F3DDebugSession Session(FString::Printf(TEXT("ProjectCoincidentalPolyline %d"), Counter));
584 {
585 F3DDebugSession _(TEXT("ProjectCoincidentalPolyline"));
587 }
588 {
589 F3DDebugSession _(TEXT("ProjectCoincidentalPolyline"));
591 }
592 }
593#endif
594
596
599
600 int32 StartIndex = BoundaryIndices[0];
601 const int32 EndIndex = BoundaryIndices[1] + 1;
602
603 TFunction<double(const PointType&)> ProjectPointToPolyline = [&](const PointType& InPointToProject)
604 {
605#ifdef DEBUG_PROJECT_COINCIDENTAL_POLYLINE
606 PointType ClosePoint;
607#endif
608
609 double MinDistance = HUGE_VAL;
610 double UForMinDistance = 0;
611
612 double ParamU = 0.;
613 int32 SegmentIndex = 0;
614 for (int32 Index = StartIndex; Index < EndIndex; ++Index)
615 {
617 double SquareDistance = FVector::DistSquared(ProjectPoint, InPointToProject);
618 if (SquareDistance > MinDistance + SquareTol)
619 {
620 break;
621 }
622
623 if (SquareDistance < MinDistance)
624 {
625 MinDistance = SquareDistance;
627 SegmentIndex = Index;
628#ifdef DEBUG_PROJECT_COINCIDENTAL_POLYLINE
629 ClosePoint = ProjectPoint;
630#endif
631 }
632
633 }
634#ifdef DEBUG_PROJECT_COINCIDENTAL_POLYLINE
635 if (bDisplay)
636 {
637 F3DDebugSession Session(TEXT("ProjectPoint"));
638 {
641 //Wait();
642 }
643 }
644#endif
645
646 StartIndex = SegmentIndex;
648 };
649
651 {
653 for (const PointType& Point : InPointsToProject)
654 {
655 double Coordinate = ProjectPointToPolyline(Point);
656 OutProjectedPointCoords.Emplace(Coordinate);
657 }
658 }
659 else
660 {
662 for (int32 Index = InPointsToProject.Num() - 1, Pndex = 0; Index >= 0; --Index, ++Pndex)
663 {
665 }
666 }
667 }
668
669
711
744
773
774 double ComputeLength() const
775 {
777 }
778
780 {
781 double Length = 0;
782 if (BoundaryIndex[1] > BoundaryIndex[0])
783 {
784 PointType StartPoint = ComputePoint(BoundaryIndex[0], InBoundary.Min);
785 PointType EndPoint = ComputePoint(BoundaryIndex[1], InBoundary.Max);
786 Length = PointType::Distance(StartPoint, PolylinePoints[BoundaryIndex[0] + 1]);
787 Length += PointType::Distance(EndPoint, PolylinePoints[BoundaryIndex[1]]);
788
789 if (BoundaryIndex[1] > BoundaryIndex[0] + 1)
790 {
791 for (int32 Index = BoundaryIndex[0] + 1; Index < BoundaryIndex[1]; ++Index)
792 {
793 Length += PointType::Distance(PolylinePoints[Index], PolylinePoints[Index + 1]);
794 }
795 }
796 }
797 else
798 {
799 PointType StartPoint = ComputePoint(BoundaryIndex[0], InBoundary.Min);
800 PointType EndPoint = ComputePoint(BoundaryIndex[1], InBoundary.Max);
801 Length = PointType::Distance(StartPoint, EndPoint);
802 }
803 return Length;
804 }
805
812
813 template<int Dimension = 3>
815 {
816 Aabb.Empty();
817 if (BoundaryIndex[1] > BoundaryIndex[0])
818 {
819 for (int32 Index = BoundaryIndex[0] + 1; Index <= BoundaryIndex[1]; ++Index)
820 {
822 }
823 }
824
825 PointType StartPoint = ComputePoint(BoundaryIndex[0], InBoundary.Min);
826 Aabb += StartPoint;
827 PointType EndPoint = ComputePoint(BoundaryIndex[1], InBoundary.Max);
828 Aabb += EndPoint;
829 }
830};
831
832} // namespace UE::CADKernel
833
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define ensureCADKernel(InExpression)
Definition Types.h:115
#define HUGE_VALUE
Definition Types.h:16
#define FVector
Definition IOSSystemIncludes.h:8
#define SMALL_NUMBER
Definition UnrealMathUtility.h:66
#define DOUBLE_KINDA_SMALL_NUMBER
Definition UnrealMathUtility.h:73
#define DOUBLE_SMALL_NUMBER
Definition UnrealMathUtility.h:72
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT ElementType * GetData() UE_LIFETIMEBOUND
Definition Array.h:1027
UE_REWRITE SizeType Max() const
Definition Array.h:1161
ElementType Pop(EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:1196
Definition AndroidPlatformMisc.h:14
Definition Display.h:62
Definition IndexOfCoordinateFinder.h:85
Definition IndexOfCoordinateFinder.h:20
Definition IndexOfCoordinateFinder.h:33
Definition Aabb.h:23
Definition PolylineTools.h:194
PointType ComputePoint(const int32 Index, const double PointCoordinate) const
Definition PolylineTools.h:256
double ProjectPointToPolyline(const FLinearBoundary &InBoundary, const PointType &PointOnEdge, PointType &OutProjectedPoint) const
Definition PolylineTools.h:526
void SamplePolyline(const FLinearBoundary &InBoundary, const double DesiredSegmentLength, TArray< double > &OutCoordinates) const
Definition PolylineTools.h:459
void ApproximatePoints(const TArray< double > &InCoordinates, TArray< CurvePointType > &OutPoints, int32 InDerivativeOrder=0) const
Definition PolylineTools.h:360
TPolylineApproximator(const TArray< double > &InPolylineCoordinates, const TArray< PointType > &InPolylinePoints)
Definition PolylineTools.h:200
void GetSubPolyline(const FLinearBoundary &InBoundary, const EOrientation Orientation, TArray< PointType > &OutPoints) const
Definition PolylineTools.h:673
void ComputeBoundingBox(const int BoundaryIndex[2], const FLinearBoundary &InBoundary, TAABB< PointType, Dimension > &Aabb)
Definition PolylineTools.h:814
PointType ApproximatePoint(const double InCoordinate) const
Definition PolylineTools.h:319
void UpdateSubPolylineBBox(const FLinearBoundary &InBoundary, FPolylineBBox &OutBBox) const
Definition PolylineTools.h:748
double ComputeLengthOfSubPolyline(const int BoundaryIndex[2], const FLinearBoundary &InBoundary) const
Definition PolylineTools.h:779
double ComputeLengthOfSubPolyline(const FLinearBoundary &InBoundary) const
Definition PolylineTools.h:806
const TArray< PointType > & PolylinePoints
Definition PolylineTools.h:197
double ComputeLength() const
Definition PolylineTools.h:774
void GetStartEndIndex(const FLinearBoundary &InBoundary, int32 BoundaryIndices[2]) const
Definition PolylineTools.h:308
void ProjectPointsToPolyline(const FLinearBoundary &InBoundary, const TArray< PointType > &InPointsToProject, TArray< double > &OutProjectedPointCoords, TArray< PointType > &OutProjectedPoints) const
Definition PolylineTools.h:552
double ProjectPointToPolyline(int32 BoundaryIndices[2], const PointType &InPointToProject, PointType &OutProjectedPoint) const
Definition PolylineTools.h:271
const TArray< double > & PolylineCoordinates
Definition PolylineTools.h:196
double ComputeCurvilinearCoordinatesOfPolyline(const FLinearBoundary &InBoundary, TArray< double > &OutCurvilinearCoordinates, int32 BoundaryIndices[2]) const
Definition PolylineTools.h:208
void ProjectCoincidentalPolyline(const FLinearBoundary &InBoundary, const TArray< PointType > &InPointsToProject, bool bSameOrientation, TArray< double > &OutProjectedPointCoords, const double ToleranceOfProjection) const
Definition PolylineTools.h:575
void ApproximatePoint(double InCoordinate, CurvePointType &OutPoint, int32 InDerivativeOrder) const
Definition PolylineTools.h:331
void ApproximatePoints(const TArray< double > &InCoordinates, TArray< PointType > &OutPoints) const
Definition PolylineTools.h:423
void GetSubPolyline(const FLinearBoundary &InBoundary, TArray< double > &OutCoordinates, TArray< PointType > &OutPoints) const
Definition PolylineTools.h:716
UE_REWRITE void Reverse(T(&Array)[ArraySize])
Definition Reverse.h:28
double SectionCoordinate(const TArray< double > &Array, const int32 Index, const double Coordinate)
Definition PolylineTools.h:82
double ComputeSquareToleranceForProjection(const TArray< PointType > &Polyline)
Definition PolylineTools.h:105
void ExtendTo(TArray< PointType > &Polyline, const PointType &DesiredEnd)
Definition PolylineTools.h:147
double ComputeLength(const TArray< PointType > &Polyline)
Definition PolylineTools.h:94
TArray< double > ComputePolylineSegmentLengths(const PointType &StartPoint, const TArray< PointType > &InnerPolyline, const PointType &EndPoint)
Definition PolylineTools.h:112
PointType LinearInterpolation(const TArray< PointType > &Array, const int32 Index, const double Coordinate)
Definition PolylineTools.h:76
PointType ComputePoint(const TArray< double > &PolylineCoordinates, const TArray< PointType > &PolylinePoints, const int32 Index, const double PointCoordinate)
Definition PolylineTools.h:179
bool IsDichotomyToBePreferred(int32 InPolylineSize, int32 ResultSize)
Definition PolylineTools.h:63
Definition CADEntity.cpp:23
EOrientation
Definition GeoEnum.h:82
void DisplayPoint(const TPoint &Point, FIdent Ident)
Definition Display.h:145
void DisplayPolyline(const TArray< TPoint > &Points, EVisuProperty Property)
Definition Display.h:281
@ YellowCurve
Definition Visu.h:29
@ RedPoint
Definition Visu.h:32
@ BluePoint
Definition Visu.h:30
@ BlueCurve
Definition Visu.h:31
@ Point
Definition Visu.h:17
U16 Index
Definition radfft.cpp:71
static UE_FORCEINLINE_HINT bool IsNearlyEqual(float A, float B, float ErrorTolerance=UE_SMALL_NUMBER)
Definition UnrealMathUtility.h:388
static constexpr UE_FORCEINLINE_HINT T Square(const T A)
Definition UnrealMathUtility.h:578
static UE_FORCEINLINE_HINT bool IsNearlyZero(float Value, float ErrorTolerance=UE_SMALL_NUMBER)
Definition UnrealMathUtility.h:407
static float Log2(float Value)
Definition UnrealMathUtility.h:722
Definition Boundary.h:18
Definition PolylineTools.h:20
FVector Max
Definition PolylineTools.h:21
void Update(const double Coordinate, const FVector2d &Point2D)
Definition PolylineTools.h:54
double CoordinateOfMinPoint[3]
Definition PolylineTools.h:26
FVector MinPoints[3]
Definition PolylineTools.h:24
FVector Min
Definition PolylineTools.h:22
FVector MaxPoints[3]
Definition PolylineTools.h:23
void Update(const double Coordinate, const FVector &Point)
Definition PolylineTools.h:34
FPolylineBBox()
Definition PolylineTools.h:28
double CoordinateOfMaxPoint[3]
Definition PolylineTools.h:25
static UE_FORCEINLINE_HINT double DistSquared(const TVector< double > &V1, const TVector< double > &V2)
Definition Vector.h:2478