簡體   English   中英

從源頭開始,在C ++中找到網格上最接近目標的下一個點

[英]Starting from a source, find the next point closest to an objective on a grid in C++

我有一個2x點的NxN網格,即源和目標。 我需要一步一步地從源移動到目的地(也在移動)。 我如何確定下一步要轉到什么位置?

一種方法是評估所有8個點,並使用歐幾里得距離查看哪一個距離最小。 但是,我希望有一個很酷的(數學)技巧可以產生更優雅的結果。

您的問題語句允許對角線移動,這是更快的(因為它可以在一個步驟中水平垂直移動):除非它的x或y坐標與目標相同,否則此解決方案將始終這樣做。

using Position = pair<int,int>;

Position move(Position const &current, Position const &target) {
    // horizontal and vertical distances
    const int dx = target.first - current.first;
    const int dy = target.second - current.second;
    // horizontal and vertical steps [-1,+1]
    const int sx = dx ? dx/abs(dx) : 0;
    const int sy = dy ? dy/abs(dy) : 0;
    return { current.first + sx, current.second + sy };
}

我不確定這是否算是一個很酷的數學技巧,它僅取決於是否知道:

  • dx = target.x-current.x如果應沿正x方向移動,則為正;如果應沿負方向移動,則為負;如果應沿上/下直線移動,則為零
  • dx/abs(dx)保留符號並刪除幅度,因此它始終是-1,0,+1 (但請注意除以零)

我想您問題的答案是布雷森納姆的線路算法。 它允許在網格的起點和終點之間構建整數點序列。 無論如何,您都可以將想法從中適應您的問題

有關更多信息,請參見https://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html

我將簡單地使用一些矢量數學運算,將dest減源作為矢量,然后使用標准方法計算該矢量與某些參考矢量(例如<1、0>)之間的角度。

然后,您可以將圓簡單地分成8個(如果需要,則分為4個)部分,並從獲得的角度確定向量位於哪個部分中。

有關如何計算兩個向量之間的角度,請參見歐式空間

暫無
暫無

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

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