Files
2026-07-13 13:13:17 +08:00

46 lines
1.4 KiB
C#

namespace Lib.numbers.@float.adjust;
[Guid("ae0c87d6-2b1e-4e28-b0d0-8611a2f7e152")]
internal sealed class Round : Instance<Round>
{
[Output(Guid = "a886fa83-a8cc-4022-b4b1-26c134095223")]
public readonly Slot<float> Result = new();
public Round()
{
Result.UpdateAction += Update;
}
private void Update(EvaluationContext context)
{
var v = Value.GetValue(context);
var steps = StepsPerUnit.GetValue(context);
var ratio = RoundRatio.GetValue(context);
Result.Value = RoundValue2(v, steps,ratio);
}
public static float RoundValue2(float i, float stepsPerUnit, float stepRatio)
{
float u = 1 / stepsPerUnit;
float v = stepRatio / (2 * stepsPerUnit);
float m = i % u;
float r = m - (m < v
? 0
: m > u - v
? u
: (m - v) / (1 - 2 * stepsPerUnit * v));
float y = i - r;
return y;
}
[Input(Guid = "e911807f-b3a7-44e9-82d2-f04608b39ec3")]
public readonly InputSlot<float> Value = new();
[Input(Guid = "31a045cf-9892-4d1b-b961-73bf73e58b6a")]
public readonly InputSlot<float> StepsPerUnit = new();
[Input(Guid = "B2D2D730-ED57-4B5F-AA34-2060D86EFB47")]
public readonly InputSlot<float> RoundRatio = new();
}