時間「t」で評価され、パスの種類に基づいて方向と位置を返すパスがあります。
時間の値は、パスの種類によって影響を受けます。
switch (type)
{
case PathType.Closed:
time = ToolBox.Wrap(time, StartTime, EndTime);
break; // Wrap time around the path time to loop
case PathType.Open:
time = ToolBox.Min(time, EndTime);
break; // Clamp the time value to the max path time range
case PathType.Oscillating:
break;
}
ミッシングリンクは振動しています。
私の質問は、2 つの値の間で振動するための効果的で効率的な方法は何ですか?
たとえば (2, 7)。時間が 7 に達すると反転して 2 に向かって減少し、2 に達すると反転して 7 に向かって増加します。
アルゴリズムは、元の値に基づいて値を増減するかどうかを知る必要があるため、値が 9 の場合、答えは 7 - (Abs(7 - 9) であることがわかります。値が 14 の場合、値は折り返されているため、 1の増加をもたらします。
値を大きくすると、元の範囲をラップする回数に応じて値が増減します。
説明するのが難しいと思うので、それが理にかなっていることを願っています。
編集:
浮動小数点値では振動しません:
for (float i = 0; i < 100; i += 0.1f)
{
Console.WriteLine("{0} {1}", i, Oscillate(2.5f, 7.5f, i));
}
private float Oscillate(float min, float max, float value)
{
float range = max - min;
float multiple = value / range;
bool ascending = multiple % 2 == 0;
float modulus = value % range;
return ascending ? modulus + min : max - modulus;
}