簡體   English   中英

如何計算網格上兩個方塊之間的距離,包括目標方塊

[英]How do I calculate the distance between two squares on a grid, including the target square

我一直在嘗試對以下代碼進行變體...

public int Distance2D(int x1, int y1, int x2, int y2)
{
    //     ______________________
    //d = √ (x2-x1)^2 + (y2-y1)^2
    //

    //Our end result
    int result = 0;
    //Take x2-x1, then square it
    double part1 = Math.Pow((x2 - x1), 2);
    //Take y2-y1, then sqaure it
    double part2 = Math.Pow((y2 - y1), 2);
    //Add both of the parts together
    double underRadical = part1 + part2;
    //Get the square root of the parts
    result = (int)Math.Sqrt(underRadical);
    //Return our result
    return result;
}

下面的例子是為了清楚起見,但由於我的錯誤而錯誤

Distance2D(1, 1, 1, 2) // 返回 1 - 正確
Distance2D(1, 1, 2, 1) // 返回 1 - 正確
Distance2D(1, 1, 2, 2) // 返回 1 - 正確
Distance2D(1, 1, 5, 5) // 返回 5 - 正確

Distance2D(0, 2, 5, 8) // 返回 7 - 不正確,應該是 8
Distance2D(1, 1, 5, 3) // 返回 4 - 不正確,應該是 5
Distance2D(10, 112, 15, 118) // 返回 7 - 不正確,應該是 8

有沒有更好的公式?

更新

由於錯誤地從第一個坐標的位置取第二個坐標的原點,我的一些預期值不正確。

我試圖獲得一個游戲塊在方形網格上從一個坐標移動到另一個坐標所需的移動次數。 一次移動一格,對角線也算作 1 次移動。

因此 ...

  • 從 1,1 到 5,5 需要 4 次對角線移動和 1 次水平/垂直移動,總共 5 次移動。 這正確返回
  • 從 1,1 到 5,3 需要 3 次對角線和 1 次水平/垂直移動,總共 4 次移動。 這現在正確返回
  • 從 1,1 到 1,2/2,1/2,2 中的任何一個都是一個移動。 這些都正確返回
  • 從 0,2 到 5,8 是 5 次對角線移動和 1 次垂直移動,總共 6 次移動。 這會錯誤地返回 7

如果我在結果上使用Math.Round()那么我會得到以下錯誤......

  • 從 0,2 到 5,8 返回 8 而不是 6
  • 1,1 到 5,5 返回 6 而不是 5

如果我使用Math.Ceiling()我會收到以下錯誤...

  • 0,2 到 5,8 返回 8 而不是 6
  • 1,1 到 2,2 返回 2 而不是 1
  • 1,1 到 5,3 返回 4 而不是 5

問題是執行.99999 ( (int) ) 有效地對您的數字執行“地板”操作,切斷任何十進制值,即使這些十進制值是.99999 聽起來您希望將值四舍五入到最接近的整數,這可以使用Math.Round()函數來完成。

嘗試這個:

result = (int)Math.Round(Math.Sqrt(underRadical));

更新

您采用的基於勾股定理的方法不適用於您要計算的內容。 這是一個完全不同的用例。 好消息是,您的用例要簡單得多。 只需計算出您必須在每個軸上行駛的距離,然后減去您可以通過對角移動來走的任何捷徑。 像這樣的事情,我認為:

var yDist = Math.Abs(y2 - y1);
var xDist = Math.Abs(x2 - x1);
var diagShortcut = Math.Min(yDist, xDist);
return yDist + xDist - diagShortcut;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM