UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SamplerOnParam.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 "Geo/GeoEnum.h"
7#include "Geo/Curves/Curve.h"
13#include "Math/Boundary.h"
14#include "Math/Point.h"
15#include "Utils/ArrayUtils.h"
16
17namespace UE::CADKernel
18{
19
20template<typename PolylineType, typename PointType>
22{
23public:
29
30protected:
31
33
59 virtual int32 CheckSamplingError(int32 FirstIndex, int32 EndIndex) override
60 {
61 const FVector& APoint = this->Sampling.GetPointAt(this->StartSamplingSegmentIndex);
62 double ACoordinate = this->Sampling.Coordinates[this->StartSamplingSegmentIndex];
63
64 const FVector& BPoint = this->EndStudySegment.Polyline->GetPointAt(this->EndStudySegment.Index);
65 double BCoordinate = this->EndStudySegment.Polyline->Coordinates[this->EndStudySegment.Index];
66
67 double ABCoordinate = BCoordinate - ACoordinate;
69
70 double MaxChord = 0;
71 double MaxParametrizationError = 0;
72
73 for (int32 Index = FirstIndex; Index < EndIndex; ++Index)
74 {
75 const FVector& PointM = this->CandidatePoints.GetPointAt(Index);
76
77 double CurvilinearAbscise;
79
81 double AMCoordinate = this->CandidatePoints.Coordinates[Index] - ACoordinate;
84
85 if (Chord > MaxChord)
86 {
87 MaxChord = Chord;
88 }
89
91 {
93 }
94 }
95
98 {
100 }
101
104 {
105 // S2 = S1 * sqare(L2 / L1)
106 // if the length is doubled, the chord error is still smaller than the desired chord error.
107 // the end point is not needed
108 return 0;
109 }
111 {
112 // the end point is needed because the Chord is smaller but nearly equal to the desired chord error.
114 }
116 {
117 // if the length is divided by two, the chord error is divided by 4 and becomes smaller than the desired chord error.
118 // Add First index and Index
120 }
121 else
122 {
123 SegmentNumToRespectChordError = this->CountOfNeededPointsToRespectChordError(APoint, BPoint, MaxChord);
124 }
125
127 };
128};
129
134{
135public:
142
149
150protected:
151
153 const FCurve& Curve;
155
156 virtual void EvaluatesNewCandidatePoints() override
157 {
158 CandidatePoints.bWithNormals = Sampling.bWithNormals;
159 CandidatePoints.bWithTangent = Sampling.bWithTangent;
160 if (CandidatePoints.bWithTangent)
161 {
165 }
166 else
167 {
171 }
172 };
173
178
179};
180
208
213{
214
215public:
223
231
232 virtual void Sample() override
233 {
236 }
237
239 {
240#ifdef DEBUG_CURVE_SAMPLING
241 CurveIndex = CurveToDisplay - 1;
242#endif
243
244 double Middle = SurfaceBoundary[InIsoType].GetMiddle();
245
247
249 RunSampling();
250
251 double Step = SurfaceBoundary[InIsoType].Length() / 6;
253 for (int32 IsoIndex = 1; IsoIndex < 6; ++IsoIndex)
254 {
255 IsoCoordinate[0] += Step;
256 if (IsoIndex == 3)
257 {
258 continue;
259 }
260
261 Swap(CandidatePoints.Coordinates, Sampling.Coordinates);
263 Swap(CandidatePoints.Coordinates, Sampling.Coordinates);
264 Swap(CandidatePoints.Points, Sampling.Points);
265
266 // Check the result
267 CandidatePoints.Coordinates.Empty(Sampling.Coordinates.Num());
268
269 for (int32 Index = 0; Index < Sampling.Coordinates.Num() - 1; ++Index)
270 {
271 double UCoord = Sampling.Coordinates[Index] + (Sampling.Coordinates[Index + 1] - Sampling.Coordinates[Index]) * 0.5;
272 CandidatePoints.Coordinates.Add(UCoord);
273 }
274
276
277#ifdef DEBUG_CURVE_SAMPLING
278 CurveToDisplay = CurveIndex;
279 DisplaySampling(CurveIndex == CurveToDisplay, 0);
280#endif
281
282 RunSampling();
283 }
284
286 }
287
288 virtual void SamplingInitalizing() override
289 {
290
291#ifdef DEBUG_CURVE_SAMPLING
292 ++CurveIndex;
293#endif
295 Sampling.Empty(100);
296
297 CandidatePoints.Empty(100);
298
299 // Initialization of the algorithm with the not derivable coordinates of the curve and at least 5 temporary points
301 {
306
308
311
312 for (int32 Index = 0; Index < LocalNotDerivableCoordinates.Num() - 1; ++Index)
313 {
315 {
317 }
318 }
319 }
320
321 CandidatePoints.SwapCoordinates(NextCoordinates);
323
324 // Not Derivable point initialize the sampling
327 {
329 IsOptimalSegments.Add(false);
330 }
332
333 CandidatePoints.RemoveComplementaryPoints(ComplementaryPointOffset);
334 }
335
336protected:
337
340
342
344
345 bool bNotDerivableFound = false;
346
349
363
364 virtual void EvaluatesNewCandidatePoints() override
365 {
366 if (CandidatePoints.Coordinates.Num() > 0)
367 {
370
373
377
378 Swap(CandidatePoints.Points, PointGrid.Points3D);
379 }
380 else
381 {
382 CandidatePoints.Points.SetNum(0);
383 }
384 }
385
386};
387
388} // ns UE::CADKernel
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
Definition Array.h:670
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
ElementType Pop(EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:1196
void Empty(SizeType Slack=0)
Definition Array.h:2273
Definition SamplerOnParam.h:185
virtual void EvaluatesNewCandidatePoints() override
Definition SamplerOnParam.h:198
const FCurve & Curve
Definition SamplerOnParam.h:195
FCurveSamplerOnParam(const FCurve &InCurve, const FLinearBoundary &InBoundary, double InMaxSagError, double InMaxParameterizationError, FPolyline3D &OutPolyline)
Definition SamplerOnParam.h:187
virtual void GetNotDerivableCoordinates(TArray< double > &OutNotDerivableCoordinates) override
Definition SamplerOnParam.h:203
double MaxParameterizationError
Definition SamplerOnParam.h:196
Definition Curve.h:21
virtual void EvaluatePoints(const TArray< double > &Coordinates, TArray< FCurvePoint > &OutPoints, int32 DerivativeOrder=0) const
Definition Curve.cpp:35
void FindNotDerivableCoordinates(int32 DerivativeOrder, TArray< double > &OutNotDerivableCoordinates) const
Definition Curve.h:190
virtual void Evaluate2DPoints(const TArray< double > &Coordinates, TArray< FVector2d > &OutPoints) const
Definition Curve.cpp:68
Definition RestrictionCurve.h:33
Definition SamplerOnParam.h:213
void Set(EIso InIsoType, double InIsoCoordinate, const FLinearBoundary &CurveBounds)
Definition SamplerOnParam.h:224
EIso IsoType
Definition SamplerOnParam.h:348
virtual void EvaluatesNewCandidatePoints() override
Definition SamplerOnParam.h:364
FSurfaceSamplerOnParam(const FSurface &InSurface, const FSurfacicBoundary &InBoundary, double InMaxSagError, double InMaxParameterizationError, FPolyline3D &TemporaryPolyline, FCoordinateGrid &OutSampling)
Definition SamplerOnParam.h:216
const FSurfacicBoundary & SurfaceBoundary
Definition SamplerOnParam.h:339
FCoordinateGrid NotDerivableCoordinates
Definition SamplerOnParam.h:343
bool bNotDerivableFound
Definition SamplerOnParam.h:345
FCoordinateGrid & SurfaceSampling
Definition SamplerOnParam.h:341
TArray< double > IsoCoordinate
Definition SamplerOnParam.h:347
virtual void GetNotDerivableCoordinates(TArray< double > &OutNotDerivableCoordinates) override
Definition SamplerOnParam.h:350
virtual void SamplingInitalizing() override
Definition SamplerOnParam.h:288
const FSurface & Surface
Definition SamplerOnParam.h:338
void Sample(EIso InIsoType)
Definition SamplerOnParam.h:238
virtual void Sample() override
Definition SamplerOnParam.h:232
Definition Surface.h:27
const FSurfacicBoundary & GetBoundary() const
Definition Surface.h:128
virtual void EvaluatePoints(const TArray< FVector2d > &InSurfacicCoordinates, TArray< FSurfacicPoint > &OutPoint3D, int32 InDerivativeOrder=0) const
Definition Surface.cpp:57
virtual void ValidateUVPoints(TArray< FVector2d > &UVPoints) const
Definition Surface.h:93
virtual void EvaluatePointGrid(const FCoordinateGrid &Coordinates, FSurfacicSampling &OutPoints, bool bComputeNormals=false) const
Definition Surface.cpp:170
virtual void LinesNotDerivables(const FSurfacicBoundary &Bounds, int32 InDerivativeOrder, FCoordinateGrid &OutNotDerivableCoordinates) const
Definition Surface.h:242
double GetIsoTolerance(EIso Iso) const
Definition Surface.h:164
Definition Boundary.h:248
double Length(const EIso &Iso) const
Definition Boundary.h:441
Definition SamplerOnParam.h:134
virtual void EvaluatesNewCandidatePoints() override
Definition SamplerOnParam.h:156
virtual void GetNotDerivableCoordinates(TArray< double > &OutNotDerivableCoordinates) override
Definition SamplerOnParam.h:174
FSurfacicCurveSamplerOnParam(const FSurface &InSurface, const FCurve &InCurve, const FLinearBoundary &InBoundary, double InMaxSagError, double InMaxParameterizationError, FSurfacicPolyline &OutPolyline)
Definition SamplerOnParam.h:143
const FCurve & Curve
Definition SamplerOnParam.h:153
FSurfacicCurveSamplerOnParam(const FRestrictionCurve &InCurve, const FLinearBoundary &InBoundary, double InMaxSagError, double InMaxParameterizationError, FSurfacicPolyline &OutPolyline)
Definition SamplerOnParam.h:136
const FSurface & Surface
Definition SamplerOnParam.h:152
double MaxParameterizationError
Definition SamplerOnParam.h:154
Definition SurfacicPolyline.h:30
Definition SamplerAbstract.h:20
TSamplingPoint EndStudySegment
Definition SamplerAbstract.h:409
void RunSampling()
Definition SamplerAbstract.h:143
double DesiredChordError
Definition SamplerAbstract.h:414
PolylineType & Sampling
Definition SamplerAbstract.h:384
TArray< char > IsOptimalSegments
Definition SamplerAbstract.h:392
TArray< double > NextCoordinates
Definition SamplerAbstract.h:412
FLinearBoundary Boundary
Definition SamplerAbstract.h:381
bool AddIntermediateCoordinates(double UMin, double UMax, int32 PointNum)
Definition SamplerAbstract.h:251
int32 CheckTangentError(const PointType &APoint, double ACoordinate, const PointType &BPoint, double BCoordinate, int32 FirstIndex, int32 EndIndex, int32 InStartSamplingSegmentIndex)
Definition SamplerAbstract.h:334
int32 CountOfNeededPointsToRespectChordError(const PointType &PointA, const PointType &PointB, double ChordError)
Definition SamplerAbstract.h:326
PolylineType CandidatePoints
Definition SamplerAbstract.h:386
int32 StartSamplingSegmentIndex
Definition SamplerAbstract.h:397
virtual int32 CheckSamplingError(int32 FirstIndex, int32 EndIndex) override
Definition SamplerOnParam.h:59
TSamplerBasedOnParametrizationAndChordError(const FLinearBoundary &InBoundary, double InMaxChordError, double InMaxParameterizationError, PolylineType &OutPolyline)
Definition SamplerOnParam.h:24
double DesiredParameterizationError
Definition SamplerOnParam.h:32
void SubArrayWithoutBoundary(const TArray< double > &InitialArray, const FLinearBoundary &Boundary, double Tolerance, TArray< double > &OutArray)
Definition ArrayUtils.h:154
Definition CADEntity.cpp:23
EIso
Definition GeoEnum.h:66
@ IsoV
Definition GeoEnum.h:68
@ IsoU
Definition GeoEnum.h:67
U16 Index
Definition radfft.cpp:71
Definition GeoPoint.h:103
void Swap(TArray< double > &InUCoordinates, TArray< double > &InVCoordinates)
Definition GeoPoint.h:116
TArray< double > Coordinates[2]
Definition GeoPoint.h:104
Definition Boundary.h:18
double Max
Definition Boundary.h:24
double Min
Definition Boundary.h:23
Definition SurfacicSampling.h:14
int32 Index
Definition SamplerAbstract.h:27
const PolylineType * Polyline
Definition SamplerAbstract.h:26
static UE_FORCEINLINE_HINT double Distance(const TVector< double > &V1, const TVector< double > &V2)
Definition Vector.h:1018