因此,我正在為統一創建一個捕捉工具包,并且我想通過特定值來約束旋轉的捕捉增量。
您可以按 2.5、5、10、15、30、45 和 90 的增量捕捉旋轉(這樣當用戶旋轉物件時,它只會旋轉該增量值)。
我有一個帶有滑塊的工具列,滑塊有 7 個步驟(0-6),每個步驟代表一個旋轉。所以我需要將旋轉轉換為步驟。

代碼和功能已經完成,但是將旋轉轉換為步數以及反之亦然的函式又長又丑。是否可以簡化/縮短它?
步驟和旋轉:
| 步 | 回轉 |
|---|---|
| 0 | 2.5 |
| 1 | 5 |
| 2 | 10 |
| 3 | 15 |
| 4 | 30 |
| 5 | 45 |
| 6 | 90 |
代碼:
private float ConvertFromStepToRotation(int step)
{
switch (step)
{
case 0:
return 2.5f;
case 1:
return 5;
case 2:
return 10;
case 3:
return 15;
case 4:
return 30;
case 5:
return 45;
case 6:
return 90;
}
return 15;
}
private int ConvertFromRotationToStep(float rotation)
{
if (rotation >= 90)
{
return 6;
}
if (rotation >= 45)
{
return 5;
}
if (rotation >= 30)
{
return 4;
}
if (rotation >= 15)
{
return 3;
}
if (rotation >= 10)
{
return 2;
}
if (rotation >= 5)
{
return 1;
}
if (rotation >= 2.5f)
{
return 0;
}
return 2;
}
沒什么大不了的,只是讓我覺得應該有更好的方法
編輯:試圖讓桌子作業
uj5u.com熱心網友回復:
看起來我們可以用陣列讓這個更漂亮。
ConvertFromStepToRotation是一個明顯的候選者:我們只是將索引轉換為相應的值,因此我們可以使用它來索引值陣列。
ConvertFromRotationToStep稍微復雜一些,但我們可以向后回圈遍歷陣列,并回傳第一個索引rotation >= steps[i]。
private static readonly float[] steps = new[] { 2.5f, 5f, 10f, 15f, 30f, 45f, 90f };
private float ConvertFromStepToRotation(int step)
{
if (step < steps.Length)
{
return steps[step];
}
return 15f;
}
private int ConvertFromRotationToStep(float rotation)
{
for (int i = steps.Length - 1; i >= 0; i )
{
if (rotation >= steps[i])
{
return i;
}
}
return 2;
}
uj5u.com熱心網友回復:
對于一個很好的偏執解決方案,s可以通過單線從角度獲得a步驟
s = floor(log(a)/log(√3)-1.5).
uj5u.com熱心網友回復:
在您不能依賴陣列索引的情況下(或者您希望更好地控制哪個步驟參考哪個旋轉),您也可以將關系存盤在字典中:
//using System.Collections.Generic;
private Dictionary<int, float> rotationForStep = new()
{
[0] = 2.5f,
//...
[6] = 90
};
并實作您的方法,例如如下:
//using System.Linq;
private float ConvertFromStepToRotation(int step)
{
if (rotationForStep.TryGetValue(step, out float rotation))
{
return rotation;
}
return 15;
}
private int ConvertFromRotationToStep(float rotation)
{
if (rotationForStep.Values.Any(v => v <= rotation))
{
return rotationForStep
.Where(r => r.Value <= rotation)
.MaxBy(r => r.Value)
.Key;
}
return 2;
}
或者對于最后一種方法:
//using System.Linq;
private int ConvertFromRotationToStep(float rotation)
{
var possibleRotations = rotationForStep.Where(r => r.Value <= rotation);
if (possibleRotations.Any())
{
return possibleRotations.MaxBy(r => r.Value).Key;
}
return 2;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/464872.html
下一篇:獲得球體上均勻分布點的區域
