2013-03-03 30 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

相关问题