這裏的基本點是能見度檢查。如果行(px, py) - (x, y)
上沒有對象,則某個點(x, y)
對(px, py)
可見。對象只能位於整數位置。所以我們必須檢查這條線上的每一點。
..................
. o
. x
. x
. x
. x
. p
假設我們想從p
檢查o
知名度。起初我們應該計算差異。在這種情況下,o
是dx=15
單位右側和dy=5
單位以上p
。對象只能在某些位置。可能的位置以等距分佈在線上。點的數量由dx
和dy
的最大公約數定義(因爲dx
和dy
都需要是整數)。 5和15的gcd是5.所以我們必須檢查5個可能的位置(標記爲x
)。 stepX = dx/gcd = 15/5 = 3
和stepY = dy/gcd = 5/5 = 1
。最後一點是o
,所以我們不需要檢查這一點。
我們可以定義清晰視野檢查,做類似如下(假設有一個gcd
功能)功能:
bool isVisible(int** matrix /*or any other appropriate declaration */, int px, int py, int ox, int oy)
{
int dx = ox - px;
int dy = oy - py;
int div = gcd(abs(dx), abs(dy));
int stepX = dx/div;
int stepY = dy/div;
for(int i = 1; i < div; ++i)
{
int checkX = px + i * stepX; //these could be computed incrementally
int checkY = py + i * stepY;
if (matrix[checkX][checkY] == 2) //blocked
return false;
}
return true;
}
注意,此功能的說明,可能無法發揮作用。
如果你已經建立了矩陣並且你知道p
的座標,那麼你所要做的就是迭代每個位置。調用帶有位置的上述函數來檢查它是否可見,如果是這種情況,則增加計數器。在此過程中跳過p
。
下面是另一個更明顯需要gcd的例子。 dx = 16
,dy = 12
..................
. o
.
.
. x
.
.
. x
.
.
. x
.
.
.p
我不明白。你能解釋一下問題的具體情況:你期望看到什麼,看到了什麼,取而代之的是什麼樣的錯誤等等。你使用調試器嗎? – Drop
你可以看看其他物體嗎?你可以看到哪些方向(只有水平,垂直,對角線,任意)? –
不,這是關鍵,你不能看透物體,你可以看任何方向 – Bogdan