rokojori_action_library/Runtime/Math/RangeDouble.cs

147 lines
2.9 KiB
C#

using System.Collections;
using System.Collections.Generic;
using Godot;
using Rokojori.Extensions;
namespace Rokojori
{
[System.Serializable]
public class RangeDouble
{
public double min;
public double max;
// public RangeDouble( double min, double max )
// {
// this.min = min;
// this.max = max;
// }
public static RangeDouble Create( double min, double max )
{
var rd = new RangeDouble();
rd.min = min;
rd.max = max;
return rd;
}
public void EnsureCorrectness()
{
if ( max < min )
{
var b = max; max = min; min = b;
}
}
public bool ContainsValue( double value )
{
return min <= value && value <= max;
}
public bool Overlaps( RangeDouble other )
{
if ( other.max < min ) { return false; }
if ( other.min > max ) { return false; }
if ( other.ContainsValue( min ) || other.ContainsValue( max ) )
{
return true;
}
if ( ContainsValue( min ) || ContainsValue( max ) )
{
return true;
}
return false;
}
public bool IsSmaller( RangeDouble other )
{
if ( Overlaps( other ) )
{
return false;
}
return max < other.min;
}
public bool IsBigger( RangeDouble other )
{
if ( Overlaps( other ) )
{
return false;
}
return min > other.max;
}
public double center { get { return 0.5f * ( max + min ); } }
public double range { get { return max - min; } }
public double length { get { return max - min; } }
public double DistanceTo( RangeDouble other )
{
var center = this.center;
var otherCenter = other.center;
var RangeDouble = this.range;
var otherRangeDouble = other.range;
var distance = Mathf.Abs( center - otherCenter );
return Mathf.Max( 0, distance - 0.5f * ( RangeDouble + otherRangeDouble ) );
}
public RangeDouble Copy()
{
return Create( min, max );
}
public double SampleAt( double normalized )
{
return min + ( max - min ) * normalized;
}
public static RangeDouble Of_01
{
get { return Create( 0, 1 ); }
}
public static RangeDouble Of_Zero
{
get { return Create( 0, 0 ); }
}
public static RangeDouble Of_One
{
get { return Create( 1, 1 ); }
}
public static bool ContainsRange( double min, double max, double value )
{
return min <= value && value <= max;
}
public static bool ContainsExclusive( double min, double max, double value )
{
return min < value && value < max;
}
public static bool ContainsExclusiveMax( double min, double max, double value )
{
return min <= value && value < max;
}
public static bool ContainsExclusiveMin( double min, double max, double value )
{
return min < value && value <= max;
}
}
}