rj-action-library/Runtime/Math/Geometry/SAT2.cs

65 lines
1.5 KiB
C#

using System.Collections;
using System.Collections.Generic;
using Godot;
namespace Rokojori
{
public class SAT2
{
public static void Project( Vector2 normal, List<Vector2> points, Range outputProjectionRange )
{
var min = float.MaxValue;
var max = - float.MaxValue;
for ( var i = 0; i < points.Count; i++ )
{
var dot = Math2D.Dot( normal, points[ i ] );
min = Mathf.Min( min, dot );
max = Mathf.Max( max, dot );
}
outputProjectionRange.min = min;
outputProjectionRange.max = max;
}
public static bool IsIntersecting(
List<Vector2> normalsA, List<Vector2> pointsA,
List<Vector2> normalsB, List<Vector2> pointsB )
{
var projectionRangeA = new Range( 0, 1 );
var projectionRangeB = new Range( 0, 1 );
for ( var i = 0; i < normalsA.Count; i++ )
{
var axis = normalsA[ i ];
Project( axis, pointsA, projectionRangeA );
Project( axis, pointsB, projectionRangeB );
if ( ! projectionRangeA.Overlaps( projectionRangeB ) )
{
return false;
}
}
for ( var i = 0; i < normalsB.Count; i++ )
{
var axis = normalsB[ i ];
Project( axis, pointsA, projectionRangeA );
Project( axis, pointsB, projectionRangeB );
if ( ! projectionRangeA.Overlaps( projectionRangeB ) )
{
return false;
}
}
return true;
}
}
}