feat: add MathUtility.Pulse (resolves #60)

This commit is contained in:
Oliver Booth 2023-04-03 17:26:03 +01:00
parent 1939bbe4ba
commit 514e5b12b0
No known key found for this signature in database
GPG Key ID: 20BEB9DC87961025
2 changed files with 120 additions and 0 deletions

View File

@ -163,6 +163,78 @@ public class MathUtilityTests
Assert.AreEqual(1.0f, floatResult);
}
[TestMethod]
public void Pulse_ShouldReturn1_GivenDoubleValueWithinBounds()
{
const double value = 0.5;
const double lower = 0.0;
const double upper = 1.0;
double result = MathUtility.Pulse(value, lower, upper);
Assert.AreEqual(1.0, result, 1e-6);
}
[TestMethod]
public void Pulse_ShouldReturn0_GivenDoubleValueLessThanLowerBound()
{
const double value = -1.0;
const double lower = 0.0;
const double upper = 1.0;
double result = MathUtility.Pulse(value, lower, upper);
Assert.AreEqual(0.0, result, 1e-6);
}
[TestMethod]
public void Pulse_ShouldReturn0_GivenDoubleValueGreaterThanUpperBound()
{
const double value = 2.0;
const double lower = 0.0;
const double upper = 1.0;
double result = MathUtility.Pulse(value, lower, upper);
Assert.AreEqual(0.0, result, 1e-6);
}
[TestMethod]
public void Pulse_ShouldReturn1_GivenSingleValueWithinBounds()
{
const float value = 0.5f;
const float lower = 0.0f;
const float upper = 1.0f;
float result = MathUtility.Pulse(value, lower, upper);
Assert.AreEqual(1.0f, result, 1e-6f);
}
[TestMethod]
public void Pulse_ShouldReturn0_GivenSingleValueLessThanLowerBound()
{
const float value = -1.0f;
const float lower = 0.0f;
const float upper = 1.0f;
float result = MathUtility.Pulse(value, lower, upper);
Assert.AreEqual(0.0f, result, 1e-6f);
}
[TestMethod]
public void Pulse_ShouldReturn0_GivenSingleValueGreaterThanUpperBound()
{
const float value = 2.0f;
const float lower = 0.0f;
const float upper = 1.0f;
float result = MathUtility.Pulse(value, lower, upper);
Assert.AreEqual(0.0f, result, 1e-6f);
}
[TestMethod]
public void Sawtooth_ShouldReturn0Point5_Given0Point5AsDouble()
{

View File

@ -287,6 +287,54 @@ public static class MathUtility
return System.Math.Pow(value, 1.0 / gamma);
}
/// <summary>
/// Returns the pulse wave for a given value.
/// </summary>
/// <param name="value">The value to calculate.</param>
/// <param name="lowerBound">The inclusive lower bound of the pulse.</param>
/// <param name="upperBound">The inclusive upper bound of the pulse.</param>
/// <returns>
/// 1 if <paramref name="value" /> lies between <paramref name="lowerBound" /> and <paramref name="upperBound" />;
/// otherwise, 0.
/// </returns>
public static float Pulse(float value, float lowerBound, float upperBound)
{
bool result = lowerBound <= value && value <= upperBound;
#if NET6_0_OR_GREATER
return Unsafe.As<bool, int>(ref result);
#else
unsafe
{
var pResult = (int*)&result;
return *pResult;
}
#endif
}
/// <summary>
/// Returns the pulse wave for a given value.
/// </summary>
/// <param name="value">The value to calculate.</param>
/// <param name="lowerBound">The inclusive lower bound of the pulse.</param>
/// <param name="upperBound">The inclusive upper bound of the pulse.</param>
/// <returns>
/// 1 if <paramref name="value" /> lies between <paramref name="lowerBound" /> and <paramref name="upperBound" />;
/// otherwise, 0.
/// </returns>
public static double Pulse(double value, double lowerBound, double upperBound)
{
bool result = lowerBound <= value && value <= upperBound;
#if NET6_0_OR_GREATER
return Unsafe.As<bool, int>(ref result);
#else
unsafe
{
var pResult = (int*)&result;
return *pResult;
}
#endif
}
/// <summary>
/// Returns the incremental sawtooth wave of a given value.
/// </summary>