如果任何两个像元之间有两个随机点相连,如何确定哪些网格像元将与中心像元相交

时间:2019-06-21 04:33:38

标签: algorithm math cell intersection line-segment

我有一个数学难题/问题

在3 x 3网格的情况下,如果我们将两个相邻单元中的两个随机点连接起来,如何确定哪些线将与中心单元相交。邻居由(grid_size-1)/ 2 = 1定义,其中围栏大小为3或sqrt(单元格计数)。 例如,像元1和3是邻居,并且该线将与中心像元相交。距离0和8的像元不在2个像元的地方。

因此,在3 x 3的情况下,以下单元格在点之间绘制的线将与中心单元格相交:1-3、1-5、7-3、7-5

3 x 3 grid

现在使用5x5网格变得更加复杂。因为(grid_size-1)/ 2 = 2,其中围栏大小为5或sqrt(单元格计数),所以邻居被视为距离中心单元格2步。 来自以下单元格的行将与中心单元格相交:

2-11、2-13、7-10、7-11、7-13、7-14、17-10、17-11、17-13、17-14、22,11、22-13 ,6-13、6-17、6-18、7-16、7-17、7-18、8-11、8-16、8-17、11-13、11-18、16-13、1 -13、3-11、5-17、7-15、7-19、9-17、11-23、13-21

5 x 5 grid

为澄清而进行的编辑:

在一个单元格中,我正在画一条从当前单元格中的点到周围相邻的5 x 5网格(粉红色)的点的线。在单元格中,我还需要考虑相邻单元格之间绘制的任何相交线(绿色)。

enter image description here

我可以在一个单元格(灰色)中遍历所有单元格和行,但这效率不高。

enter image description here

理想情况下,我只会绘制/计算可能与单元格相交的线。

片段着色器的一部分:

#define C 25 // cells in 5x5 grid
#define T 2  // shift size sqrt(C)-1
#define X 12 // center cell (C-1)/2
#define NP (2,11, 2,13, 7,10, 7,11, 7,13, 7,14, 17,10, 17,11, 17,13, 17,14, 22,11, 22,13, 6,13, 6,17, 6,18, 7,16, 7,17, 7,18, 8,11, 8,16, 8,17, 11,13, 11,18, 16,13, 1,13, 3,11, 5,17, 7,15, 7,19,  9,17, 11,23, 13,21)

// Cells
vec2 id = floor(st)+n;
st = fract(st)-.5;
vec2 p[C];
int i=0;
for(float y=-T; y<=T; y++) {
    for(float x=-T; x<=T; x++) {
        p[i++] = GetPos(id, vec2(x,y));
    }
}

// Lines
const int[] np = int[]NP;
for(int i=0; i<(C+np.length()); i++) {
    // draw grid center to neigboring cells
    if( i < C){
        m += line(p[X], p[i], st);
    // intersecting lines
    }else{
        int e = (i - C) * 2;
        m += line(p[np[e]], p[np[e+1]], st);
    }

}

1 个答案:

答案 0 :(得分:1)

很快想一想:如果两个点的x坐标都位于中心正方形的左侧,则该线不会相交。如果两个x坐标都在右侧,则它们也不是,如果两个y坐标都在顶部之上或之下,则它们也不是。在所有其他情况下,它们相交(?)。