[英]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 ¤t, 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.