public interface ICurve
{
float Evaluate(float t);
}
public struct NormalCurve : ICurve
{
readonly float width;
readonly float maxValue;
readonly float minValue;
public NormalCurve(float width, float min, float max)
{
this.width = width;
maxValue = max;
minValue = min;
}
public float Evaluate(float value)
{
return Mathf.Max(
Mathf.Exp(-Mathf.Pow(value, 2f) / width) * (maxValue - minValue) +
minValue - 0.01f,
minValue);
}
}
public struct PropulsionCurve : ICurve
{
public float maxVelocity;
public float maxForce;
private readonly float coefficient;
public PropulsionCurve(float v_max = 100f, float f_max = 5f)
{
maxVelocity = v_max;
maxForce = f_max;
coefficient = f_max / (v_max * v_max);
}
public float Evaluate(float x) => Mathf.Min(coefficient * x * x, maxForce);
}
public interface ICurve
{
float Evaluate(float t);
}
public struct NormalCurve : ICurve
{
readonly float width;
readonly float maxValue;
readonly float minValue;
public NormalCurve(float width, float min, float max)
{
this.width = width;
maxValue = max;
minValue = min;
}
public float Evaluate(float value)
{
return Mathf.Max(
Mathf.Exp(-Mathf.Pow(value, 2f) / width) * (maxValue - minValue) +
minValue - 0.01f,
minValue);
}
}
public struct PropulsionCurve : ICurve
{
public float maxVelocity;
public float maxForce;
private readonly float coefficient;
public PropulsionCurve(float v_max = 100f, float f_max = 5f)
{
maxVelocity = v_max;
maxForce = f_max;
coefficient = f_max / (v_max * v_max);
}
public float Evaluate(float x) => Mathf.Min(coefficient * x * x, maxForce);
}