我需要一種算法來給我座標到距離2D網格中另一個單元格最近的單元格(按距離順序)。它的搜索算法,然後檢查這些座標適合各種事情。不管怎麼說,到目前爲止,我想出了這個:2D圓形搜索模式
function testy(cx, cy, idx) {
\t var radius = Math.floor(Math.sqrt(idx/Math.PI));
\t var segment = Math.round(idx - (radius * Math.PI));
\t var angle = segment/radius;
\t var x = Math.round(cx + radius * Math.cos(angle));
\t var y = Math.round(cy + radius * Math.sin(angle));
\t return [x, y];
}
addEventListener("load", function() {
\t var canv = document.createElement("canvas");
\t document.body.appendChild(canv);
\t canv.width = 800;
\t canv.height = 600;
\t var ctx = canv.getContext("2d");
\t
\t var scale = 5;
\t var idx = 0;
\t var idx_end = 10000;
\t
\t var func = function() {
\t \t var xy = testy(0,0,idx++);
\t \t var x = xy[0] * scale + canv.width/2;
\t \t var y = xy[1] * scale + canv.height/2;
\t \t ctx.rect(x, y, scale, scale);
\t \t ctx.fill();
\t \t
\t \t if (idx < idx_end) setTimeout(func, 0);
\t }
\t
\t func();
\t
});
但正如你所知道的,它有點廢話,因爲它會跳過一些細胞。我在這裏做了一些假設:
某個半徑的圓的周長對應於該圓的路徑上的單元數。我並不認爲這會有太大的問題,因爲半徑中的實際細胞數應該低於導致重複的周長(少量是可以的),但不排除(不好)。
由於指定的第n個索引的圓的半徑略大於Math.floor(Math.sqrt(idx/Math.PI)),因爲每個增加1到半徑對應於2 * Math.PI被添加到圓的圓周。再次,應該導致輕微的重複,但不排除。
除此之外,我不知道什麼可能是錯的,我的數學考不及格,這所以大概是與任何更復雜。
也許有這樣的另一種算法已經出現在那裏?一個不跳過細胞?語言並不重要,我使用js來創建它,但它可以是任何東西。
你的目標不明確。你想要一個所有網格點的列表(或生成器),使它們距離給定點越來越遠嗎?在上市過程中,距離是否必須增加或稍微減少?從給定點開始採用「螺旋」模式有什麼問題,點是在垂直和水平段中進行的,但基本模式離給定點更遠? (這最後會很容易編程,似乎足以應付大多數搜索。) –
我認爲https://stackoverflow.com/questions/3706219/algorithm-for-iterating-over-an-outward-spiral-on- a-discrete-2d-grid-from-the-or-或者你正在尋找的東西。 – barrycarter