UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Boundary.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"
6#include "Math/MathConst.h"
7#include "Math/Point.h"
8
9namespace UE::CADKernel
10{
15#define MINIMAL_UNIT_LINEAR_TOLERANCE 1e-5
16
18{
19
22
23 double Min;
24 double Max;
25
27 {
28 Min = 0.;
29 Max = 1.;
30 }
31
33 : Min(Boundary.Min)
34 , Max(Boundary.Max)
35 {
36 }
37
38 FLinearBoundary(const double UMin, const double UMax)
39 {
40 Set(UMin, UMax);
41 }
42
43 FLinearBoundary(const FLinearBoundary& Boundary, const double OffsetTolerance)
44 : Min(Boundary.Min - OffsetTolerance)
45 , Max(Boundary.Max + OffsetTolerance)
46 {
47 }
48
49 FLinearBoundary(const double UMin, const double UMax, const double OffsetTolerance)
50 {
51 Set(UMin, UMax);
53 }
54
56 {
57 Ar.Serialize(&Boundary, sizeof(FLinearBoundary));
58 return Ar;
59 }
60
61 constexpr double GetMin() const
62 {
63 return Min;
64 }
65
66 constexpr double GetMax() const
67 {
68 return Max;
69 }
70
71 constexpr double GetAt(const double Coordinate) const
72 {
73 return Min + (Max - Min) * Coordinate;
74 }
75
76 constexpr double GetMiddle() const
77 {
78 return (Min + Max) * 0.5;
79 }
80
81 double Size() const { return Max - Min; }
82
83 void SetMin(const double Coordinates)
84 {
85 FMath::GetMinMax(Coordinates, Max, Min, Max);
86 }
87
88 void SetMax(const double Coordinates)
89 {
90 FMath::GetMinMax(Min, Coordinates, Min, Max);
91 }
92
93 void Set(const double InUMin = 0., const double InUMax = 1.)
94 {
95 FMath::GetMinMax(InUMin, InUMax, Min, Max);
96 }
97
101 void Set(const TArray<double>& Coordinates)
102 {
103 Init();
104 for (const double& Coordinate : Coordinates)
105 {
106 ExtendTo(Coordinate);
107 }
108 }
109
110
111 bool IsValid() const
112 {
113 return Min <= Max;
114 }
115
116 bool Contains(const double Coordinate) const
117 {
118 return RealCompare(Coordinate, Min) >= 0 && RealCompare(Coordinate, Max) <= 0;
119 }
120
121 double Length() const
122 {
123 return GetMax() - GetMin();
124 }
125
129 bool IsDegenerated() const
130 {
131 double DeltaU = (Max - Min);
132 return (DeltaU < DOUBLE_SMALL_NUMBER);
133 }
134
142 {
144 }
145
149 void MoveInsideIfNot(double& Coordinate, const double Tolerance = DOUBLE_SMALL_NUMBER) const
150 {
151 if (Coordinate <= Min)
152 {
153 Coordinate = Min + Tolerance;
154 }
155 else if (Coordinate >= Max)
156 {
157 Coordinate = Max - Tolerance;
158 }
159 }
160
161 void Offset(const double Tolerance = DOUBLE_SMALL_NUMBER)
162 {
163 Min -= Tolerance;
164 Max += Tolerance;
165 }
166
170 void Init()
171 {
172 Min = HUGE_VALUE;
173 Max = -HUGE_VALUE;
174 }
175
176 void ExtendTo(double MinCoordinate, double MaxCoordinate)
177 {
178 FMath::GetMinMax(MinCoordinate, MaxCoordinate);
179 Min = FMath::Min(Min, MinCoordinate);
180 Max = FMath::Max(Max, MaxCoordinate);
181 }
182
183 void TrimAt(const FLinearBoundary& MaxBound)
184 {
185 if (Max < MaxBound.Min || Min > MaxBound.Max)
186 {
187 *this = MaxBound;
188 return;
189 }
190
191 Min = FMath::Max(Min, MaxBound.Min);
192 Max = FMath::Min(Max, MaxBound.Max);
193 }
194
195 void ExtendTo(const FLinearBoundary& MaxBound)
196 {
197 Min = FMath::Min(Min, MaxBound.Min);
198 Max = FMath::Max(Max, MaxBound.Max);
199 }
200
201 void ExtendTo(const double Coordinate)
202 {
203 if (Coordinate < Min)
204 {
205 Min = Coordinate;
206 }
207
208 if (Coordinate > Max)
209 {
210 Max = Coordinate;
211 }
212 }
213
214 void RestrictTo(const FLinearBoundary& MaxBound)
215 {
216 if (MaxBound.Min > Min)
217 {
218 Min = MaxBound.Min;
219 }
220 if (MaxBound.Max < Max)
221 {
222 Max = MaxBound.Max;
223 }
224 }
225
230 {
232 {
235 }
236 }
237
239 {
240 Min = InBounds.Min;
241 Max = InBounds.Max;
242 return *this;
243 }
244
245};
246
248{
249private:
250 FLinearBoundary UVBoundaries[2];
251
252public:
255
256 FSurfacicBoundary() = default;
257
258 FSurfacicBoundary(const double InUMin, const double InUMax, const double InVMin, const double InVMax)
259 {
260 UVBoundaries[EIso::IsoU].Set(InUMin, InUMax);
261 UVBoundaries[EIso::IsoV].Set(InVMin, InVMax);
262 }
263
264 FSurfacicBoundary(const double InUMin, const double InUMax, const double InVMin, const double InVMax, const double OffsetTolerance)
265 {
266 UVBoundaries[EIso::IsoU].Set(InUMin, InUMax);
267 UVBoundaries[EIso::IsoV].Set(InVMin, InVMax);
269 }
270
271 FSurfacicBoundary(const FVector2d& Point1, const FVector2d& Point2)
272 {
273 Set(Point1, Point2);
274 }
275
276 FSurfacicBoundary(const FVector2d& Point1, const FVector2d& Point2, const double OffsetTolerance)
277 {
278 Set(Point1, Point2);
280 }
281
282 void Set(const FVector2d& Point1, const FVector2d& Point2)
283 {
284 UVBoundaries[EIso::IsoU].Set(Point1.X, Point2.X);
285 UVBoundaries[EIso::IsoV].Set(Point1.Y, Point2.Y);
286 }
287
289 {
290 Ar << Boundary[EIso::IsoU];
291 Ar << Boundary[EIso::IsoV];
292 return Ar;
293 }
294
296 {
297 UVBoundaries[EIso::IsoU] = BoundU;
298 UVBoundaries[EIso::IsoV] = BoundV;
299 }
300
301 void Set(const double InUMin, const double InUMax, const double InVMin, const double InVMax)
302 {
303 UVBoundaries[EIso::IsoU].Set(InUMin, InUMax);
304 UVBoundaries[EIso::IsoV].Set(InVMin, InVMax);
305 }
306
307 void Set()
308 {
309 UVBoundaries[EIso::IsoU].Set();
310 UVBoundaries[EIso::IsoV].Set();
311 }
312
316 void Set(const TArray<FVector2d>& Points)
317 {
318 Init();
319 for (const FVector2d& Point : Points)
320 {
321 ExtendTo(Point);
322 }
323 }
324
325 const FLinearBoundary& Get(EIso Type) const
326 {
327 return UVBoundaries[Type];
328 }
329
330 bool IsValid() const
331 {
332 return UVBoundaries[EIso::IsoU].IsValid() && UVBoundaries[EIso::IsoV].IsValid();
333 }
334
338 bool IsDegenerated() const
339 {
340 return UVBoundaries[EIso::IsoU].IsDegenerated() || UVBoundaries[EIso::IsoV].IsDegenerated();
341 }
342
344 {
345 int32 Inside = 0;
346 int32 Outside = 0;
347 TFunction<void(double, double, double)> CheckInside = [&](double LeftSide, double RigthSide, double Tolerance)
348 {
349 if (LeftSide + Tolerance < RigthSide)
350 {
351 Inside++;
352 }
353 else if (RigthSide + Tolerance < LeftSide)
354 {
355 Outside++;
356 }
357 };
358
359 CheckInside(OtherBoundary[EIso::IsoU].GetMin(), UVBoundaries[EIso::IsoU].GetMin(), Tolerance2D[EIso::IsoU]);
360 CheckInside(OtherBoundary[EIso::IsoV].GetMin(), UVBoundaries[EIso::IsoV].GetMin(), Tolerance2D[EIso::IsoV]);
361 CheckInside(UVBoundaries[EIso::IsoU].GetMax(), OtherBoundary[EIso::IsoU].GetMax(), Tolerance2D[EIso::IsoU]);
362 CheckInside(UVBoundaries[EIso::IsoV].GetMax(), OtherBoundary[EIso::IsoV].GetMax(), Tolerance2D[EIso::IsoV]);
363
364 if (Inside > 2)
365 {
366 return ESituation::Inside;
367 }
368 if (Outside > 2)
369 {
370 return ESituation::Outside;
371 }
372 return ESituation::Undefined;
373 }
374
378 void Init()
379 {
380 UVBoundaries[EIso::IsoU].Init();
381 UVBoundaries[EIso::IsoV].Init();
382 }
383
384 void TrimAt(const FSurfacicBoundary& MaxLimit)
385 {
386 UVBoundaries[EIso::IsoU].TrimAt(MaxLimit[EIso::IsoU]);
387 UVBoundaries[EIso::IsoV].TrimAt(MaxLimit[EIso::IsoV]);
388 }
389
390 void ExtendTo(const FSurfacicBoundary& MaxLimit)
391 {
392 UVBoundaries[EIso::IsoU].ExtendTo(MaxLimit[EIso::IsoU]);
393 UVBoundaries[EIso::IsoV].ExtendTo(MaxLimit[EIso::IsoV]);
394 }
395
397 {
398 UVBoundaries[EIso::IsoU].ExtendTo(Point.X);
399 UVBoundaries[EIso::IsoV].ExtendTo(Point.Y);
400 }
401
402 void ExtendTo(const FVector& Point)
403 {
404 UVBoundaries[EIso::IsoU].ExtendTo(Point.X);
405 UVBoundaries[EIso::IsoV].ExtendTo(Point.Y);
406 }
407
408 void RestrictTo(const FSurfacicBoundary& MaxBound)
409 {
410 UVBoundaries[EIso::IsoU].RestrictTo(MaxBound.UVBoundaries[EIso::IsoU]);
411 UVBoundaries[EIso::IsoV].RestrictTo(MaxBound.UVBoundaries[EIso::IsoV]);
412 }
413
418 {
419 UVBoundaries[EIso::IsoU].WidenIfDegenerated();
420 UVBoundaries[EIso::IsoV].WidenIfDegenerated();
421 }
422
426 void MoveInsideIfNot(FVector& Point, const double Tolerance = DOUBLE_SMALL_NUMBER) const
427 {
428 UVBoundaries[EIso::IsoU].MoveInsideIfNot(Point.X, Tolerance);
429 UVBoundaries[EIso::IsoV].MoveInsideIfNot(Point.Y, Tolerance);
430 }
431
435 void MoveInsideIfNot(FVector2d& Point, const double Tolerance = DOUBLE_SMALL_NUMBER) const
436 {
437 UVBoundaries[EIso::IsoU].MoveInsideIfNot(Point.X, Tolerance);
438 UVBoundaries[EIso::IsoV].MoveInsideIfNot(Point.Y, Tolerance);
439 }
440
441 double Length(const EIso& Iso) const
442 {
443 return UVBoundaries[Iso].Length();
444 }
445
446 constexpr const FLinearBoundary& operator[](const EIso& Iso) const
447 {
448 return UVBoundaries[Iso];
449 }
450
451 constexpr FLinearBoundary& operator[](const EIso& Iso)
452 {
453 return UVBoundaries[Iso];
454 }
455
456 void Offset(const double Tolerance = DOUBLE_SMALL_NUMBER)
457 {
458 UVBoundaries[EIso::IsoU].Offset(Tolerance);
459 UVBoundaries[EIso::IsoV].Offset(Tolerance);
460 }
461
462};
463}
464
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define MINIMAL_UNIT_LINEAR_TOLERANCE
Definition Boundary.h:15
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 HUGE_VALUE
Definition Types.h:16
void Init()
Definition LockFreeList.h:4
#define DOUBLE_SMALL_NUMBER
Definition UnrealMathUtility.h:72
uint32 Offset
Definition VulkanMemory.cpp:4033
Definition Archive.h:1208
virtual void Serialize(void *V, int64 Length)
Definition Archive.h:1689
Definition Array.h:670
Definition AndroidPlatformMisc.h:14
Definition Boundary.h:248
FSurfacicBoundary(const double InUMin, const double InUMax, const double InVMin, const double InVMax)
Definition Boundary.h:258
bool IsValid() const
Definition Boundary.h:330
static const FSurfacicBoundary DefaultBoundary
Definition Boundary.h:254
void Set(const FLinearBoundary &BoundU, const FLinearBoundary &BoundV)
Definition Boundary.h:295
FSurfacicBoundary(const FVector2d &Point1, const FVector2d &Point2)
Definition Boundary.h:271
void ExtendTo(const FSurfacicBoundary &MaxLimit)
Definition Boundary.h:390
bool IsDegenerated() const
Definition Boundary.h:338
void WidenIfDegenerated()
Definition Boundary.h:417
void MoveInsideIfNot(FVector2d &Point, const double Tolerance=DOUBLE_SMALL_NUMBER) const
Definition Boundary.h:435
void Set(const double InUMin, const double InUMax, const double InVMin, const double InVMax)
Definition Boundary.h:301
double Length(const EIso &Iso) const
Definition Boundary.h:441
void Set(const TArray< FVector2d > &Points)
Definition Boundary.h:316
void ExtendTo(const FVector &Point)
Definition Boundary.h:402
void MoveInsideIfNot(FVector &Point, const double Tolerance=DOUBLE_SMALL_NUMBER) const
Definition Boundary.h:426
const FLinearBoundary & Get(EIso Type) const
Definition Boundary.h:325
void Set()
Definition Boundary.h:307
void RestrictTo(const FSurfacicBoundary &MaxBound)
Definition Boundary.h:408
void Init()
Definition Boundary.h:378
void Set(const FVector2d &Point1, const FVector2d &Point2)
Definition Boundary.h:282
FSurfacicBoundary(const double InUMin, const double InUMax, const double InVMin, const double InVMax, const double OffsetTolerance)
Definition Boundary.h:264
FSurfacicBoundary(const FVector2d &Point1, const FVector2d &Point2, const double OffsetTolerance)
Definition Boundary.h:276
void ExtendTo(const FVector2d &Point)
Definition Boundary.h:396
constexpr FLinearBoundary & operator[](const EIso &Iso)
Definition Boundary.h:451
friend FArchive & operator<<(FArchive &Ar, FSurfacicBoundary &Boundary)
Definition Boundary.h:288
void Offset(const double Tolerance=DOUBLE_SMALL_NUMBER)
Definition Boundary.h:456
ESituation IsInside(const FSurfacicBoundary &OtherBoundary, const FSurfacicTolerance &Tolerance2D)
Definition Boundary.h:343
constexpr const FLinearBoundary & operator[](const EIso &Iso) const
Definition Boundary.h:446
void TrimAt(const FSurfacicBoundary &MaxLimit)
Definition Boundary.h:384
Definition CADEntity.cpp:23
int32 RealCompare(const double Value1, const double Value2, const double Tolerance=DOUBLE_SMALL_NUMBER)
Definition MathConst.h:32
ESituation
Definition GeoEnum.h:88
@ Inside
Definition GeoEnum.h:90
@ Outside
Definition GeoEnum.h:91
EIso
Definition GeoEnum.h:66
@ Iso
Definition Visu.h:20
static UE_FORCEINLINE_HINT bool IsNearlyEqual(float A, float B, float ErrorTolerance=UE_SMALL_NUMBER)
Definition UnrealMathUtility.h:388
Definition Boundary.h:18
void ExtendTo(const FLinearBoundary &MaxBound)
Definition Boundary.h:195
void Set(const TArray< double > &Coordinates)
Definition Boundary.h:101
void ExtendTo(double MinCoordinate, double MaxCoordinate)
Definition Boundary.h:176
void Offset(const double Tolerance=DOUBLE_SMALL_NUMBER)
Definition Boundary.h:161
constexpr double GetAt(const double Coordinate) const
Definition Boundary.h:71
void Set(const double InUMin=0., const double InUMax=1.)
Definition Boundary.h:93
void ExtendTo(const double Coordinate)
Definition Boundary.h:201
constexpr double GetMiddle() const
Definition Boundary.h:76
double Size() const
Definition Boundary.h:81
void RestrictTo(const FLinearBoundary &MaxBound)
Definition Boundary.h:214
void Init()
Definition Boundary.h:170
FLinearBoundary(const FLinearBoundary &Boundary)
Definition Boundary.h:32
FLinearBoundary(const double UMin, const double UMax)
Definition Boundary.h:38
bool IsValid() const
Definition Boundary.h:111
static const FLinearBoundary DefaultBoundary
Definition Boundary.h:21
FLinearBoundary(const double UMin, const double UMax, const double OffsetTolerance)
Definition Boundary.h:49
void TrimAt(const FLinearBoundary &MaxBound)
Definition Boundary.h:183
bool Contains(const double Coordinate) const
Definition Boundary.h:116
void SetMax(const double Coordinates)
Definition Boundary.h:88
bool IsDegenerated() const
Definition Boundary.h:129
double Max
Definition Boundary.h:24
void WidenIfDegenerated()
Definition Boundary.h:229
FLinearBoundary()
Definition Boundary.h:26
void MoveInsideIfNot(double &Coordinate, const double Tolerance=DOUBLE_SMALL_NUMBER) const
Definition Boundary.h:149
constexpr double GetMin() const
Definition Boundary.h:61
void SetMin(const double Coordinates)
Definition Boundary.h:83
friend FArchive & operator<<(FArchive &Ar, FLinearBoundary &Boundary)
Definition Boundary.h:55
double Length() const
Definition Boundary.h:121
constexpr double GetMax() const
Definition Boundary.h:66
double ComputeMinimalTolerance() const
Definition Boundary.h:141
FLinearBoundary(const FLinearBoundary &Boundary, const double OffsetTolerance)
Definition Boundary.h:43
double Min
Definition Boundary.h:23
FLinearBoundary & operator=(const FLinearBoundary &InBounds)
Definition Boundary.h:238
T Y
Definition Vector2D.h:52
T X
Definition Vector2D.h:49