2013-03-03 28 views
0

(我會將它標記爲Java和語言無關的,因爲我認爲這個想法並不真的需要Java,但這是我的特定應用程序,所以IDK中的哪一個兩個標籤是合適的)。在與給定矩形相交的網格中查找單元格

比方說,我有一個任意數量的行和列以及任意單元大小的網格。

此網格代表2d空間。現在假設我在這個2D空間中有一個矩形 - 過去,我記得能夠找回所有與矩形相交的單元格,(無需循環),但此時數學正在逃避我。

爲了鞏固這個例子,假設有12行和10列。單元格是256平方(所以256行高,列寬256)。如果在x:400,y:300是200x200的矩形,我知道它會與第二行中的第二列和第三列相交。

因此,如果細胞結構,像這樣定義:

// reference[rows][columns]  
SomeCellClass[][] cells = SomeCellClass[12][10] 

然後交叉將SomeCellClass[1][1]SomeCellClass[1][2]

,理想的回報會像

private SomeCellClass[] blah(){ 
    // do work 
    SomeCellClass[] product = new SomeCellClass[total]; 
    SomeCellClass[0] = // first one that intersects... 
    SomeCellClass[1] = // second one that intersects... 
    // etc... 
} 

東西,我記得將矩形的位置和尺寸除以單元格大小和地板/天花板以獲得索引bu,有些事情要做我無法理解這些細節。再次,我得到如何用循環做到這一點,但希望能夠只使用數學和數組索引。

任何幫助,將不勝感激。

TYIA。

+0

如果你想弄清楚數學,我建議在紙上畫出來...... – 2013-03-03 01:36:33

+0

@OliCharlesworth我試過了。我想我可以得到邊緣,但是如何讓中間的細胞逃脫我(例如,想象一個跨越4或5列的非常長的矩形)。 – momo 2013-03-03 01:38:40

+0

如果你想要一個所有單元格索引的數組,那麼你將需要一個循環。 – 2013-03-03 01:39:28

回答

1

看起來像它基本上是這樣的:

int startingColumn = Math.floor(rect.left/columnWidth); 
int endingColumn = Math.ceil(rect.right/columnWidth); 
int startingRow = Math.floor(rect.top/rowHeight); 
int endingRow = Math.ceil(rect.bottom/rowHeight); 

那麼顯然從startingColunn環/通過endingColumn /行排。

+0

你需要小心你的上限,這取決於它們是包含性還是獨家性的。 – 2013-03-03 02:13:43

+0

@OliCharlesworth再次感謝您的幫助,但我不清楚。如果有任何重疊,那麼「符合」 - 是你的意思? – momo 2013-03-03 02:18:47

+0

@OliCharlesworth呃也許你的意思是否定的 - 如果矩形在網格上方或下方? – momo 2013-03-03 02:19:37

相關問題