mirror of
https://github.com/sinbad/StevesUEHelpers.git
synced 2025-02-23 17:45:23 +00:00
Support negative results from GetDistanceToConvex2D
This commit is contained in:
parent
8d0fb472f2
commit
dad1fde054
@ -50,6 +50,7 @@ float StevesMathHelpers::GetDistanceToConvex2D(const TArray<FVector2f>& ConvexPo
|
|||||||
// Assume inside until 1 or more tests show it's outside
|
// Assume inside until 1 or more tests show it's outside
|
||||||
bool bInside = true;
|
bool bInside = true;
|
||||||
float ClosestOutside = 1e30f;
|
float ClosestOutside = 1e30f;
|
||||||
|
float ClosestInside = 1e30f;
|
||||||
const int N = ConvexPoints.Num();
|
const int N = ConvexPoints.Num();
|
||||||
for (int i = 0; i < N; ++i)
|
for (int i = 0; i < N; ++i)
|
||||||
{
|
{
|
||||||
@ -66,13 +67,11 @@ float StevesMathHelpers::GetDistanceToConvex2D(const TArray<FVector2f>& ConvexPo
|
|||||||
const FVector2f ToPoint = P - ConvexPoints[i];
|
const FVector2f ToPoint = P - ConvexPoints[i];
|
||||||
const float DotNormal = Normal.Dot(ToPoint);
|
const float DotNormal = Normal.Dot(ToPoint);
|
||||||
|
|
||||||
if (DotNormal < 0)
|
if (DotNormal > 0)
|
||||||
{
|
{
|
||||||
// Inside
|
// If >0 result is outside, point must be outside
|
||||||
continue;
|
bInside = false;
|
||||||
}
|
}
|
||||||
// If >0 result is outside, point must be outside
|
|
||||||
bInside = false;
|
|
||||||
|
|
||||||
// Do a perpendicular projection onto the line segment to see if we're within the limits of it
|
// Do a perpendicular projection onto the line segment to see if we're within the limits of it
|
||||||
const float DotLine = Line.Dot(ToPoint);
|
const float DotLine = Line.Dot(ToPoint);
|
||||||
@ -95,8 +94,15 @@ float StevesMathHelpers::GetDistanceToConvex2D(const TArray<FVector2f>& ConvexPo
|
|||||||
Dist = FMath::Sqrt(ToPoint.SquaredLength() - FMath::Square(T * Line.Length()));
|
Dist = FMath::Sqrt(ToPoint.SquaredLength() - FMath::Square(T * Line.Length()));
|
||||||
}
|
}
|
||||||
|
|
||||||
ClosestOutside = FMath::Min(ClosestOutside, Dist);
|
if (DotNormal > 0)
|
||||||
|
{
|
||||||
|
ClosestOutside = FMath::Min(ClosestOutside, Dist);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ClosestInside = FMath::Min(ClosestInside, Dist);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return bInside ? 0 : ClosestOutside;
|
return bInside ? -ClosestInside : ClosestOutside;
|
||||||
}
|
}
|
||||||
|
@ -103,7 +103,7 @@ public:
|
|||||||
* Return the distance to a convex polygon in 2D where points are in the same space
|
* Return the distance to a convex polygon in 2D where points are in the same space
|
||||||
* @param ConvexPoints Points on the convex polygon, anti-clockwise order, in a chosen space
|
* @param ConvexPoints Points on the convex polygon, anti-clockwise order, in a chosen space
|
||||||
* @param LocalPoint Point to test, in same space as convex points
|
* @param LocalPoint Point to test, in same space as convex points
|
||||||
* @return The distance to this convex polygon in 2D space. == 0 if inside
|
* @return The distance to this convex polygon in 2D space. <= 0 if inside
|
||||||
*/
|
*/
|
||||||
static float GetDistanceToConvex2D(const TArray<FVector2f>& ConvexPoints,
|
static float GetDistanceToConvex2D(const TArray<FVector2f>& ConvexPoints,
|
||||||
const FVector& LocalPoint);
|
const FVector& LocalPoint);
|
||||||
@ -112,7 +112,7 @@ public:
|
|||||||
* @param ConvexPoints Points on the convex polygon, anti-clockwise order, in local space
|
* @param ConvexPoints Points on the convex polygon, anti-clockwise order, in local space
|
||||||
* @param ConvexTransform World transform for convex polygon
|
* @param ConvexTransform World transform for convex polygon
|
||||||
* @param WorldPoint Point in world space
|
* @param WorldPoint Point in world space
|
||||||
* @return The distance to this convex polygon in 2D space. == 0 if inside
|
* @return The distance to this convex polygon in 2D space. <= 0 if inside
|
||||||
*/
|
*/
|
||||||
static float GetDistanceToConvex2D(const TArray<FVector2f>& ConvexPoints,
|
static float GetDistanceToConvex2D(const TArray<FVector2f>& ConvexPoints,
|
||||||
const FTransform& ConvexTransform,
|
const FTransform& ConvexTransform,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user