不知道如何使標題更具描述性,所以我只是從一個例子開始。我正在使用下面的代碼位來選擇一個枚舉的方向,這取決於與給定方向相比,四個軸中的哪一個形成了最小的角度。根據N值中的哪一個返回不同的結果
static Direction VectorToDirection(Vector2 direction)
{
double upDiff = System.Math.Acos(Vector2.Dot(direction, -Vector2.UnitY));
double downDiff = System.Math.Acos(Vector2.Dot(direction, Vector2.UnitY));
double leftDiff = System.Math.Acos(Vector2.Dot(direction, -Vector2.UnitX));
double rightDiff = System.Math.Acos(Vector2.Dot(direction, Vector2.UnitX));
double smallest = System.Math.Min(System.Math.Min(upDiff, downDiff), System.Math.Min(leftDiff, rightDiff));
// This is the part I'm unsure about i.e.
// Comparing smallest with each value in turn
// To find out which of the four was "selected"
if (smallest == upDiff) return Direction.Up;
if (smallest == downDiff) return Direction.Down;
if (smallest == leftDiff) return Direction.Left;
return Direction.Right;
}
但我在最後得到關於浮點相等的resharper警告。我猜這不應該是一個問題,因爲執行Min
,但想知道是否有更好的方式來解決這種問題除了比較smallest
與每個原始值。
謝謝你所有的答案,我有點不確定選擇哪一個。對於像這樣的一小部分值來說,像布蘭登一樣手動比較它們似乎是比我所做的更好的選擇。對於一般情況,我喜歡阿列克謝的方法,通過索引找到最小值,並將其標記爲更廣泛的答案。 – 2012-08-06 18:55:16