65 lines
1.5 KiB
C#
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;
|
|
}
|
|
|
|
}
|
|
}
|
|
|