Как определить, какие ячейки сетки будут пересекать центральную ячейку, если две случайные точки между любыми двумя ячейками соединены - PullRequest
0 голосов
/ 21 июня 2019

У меня есть математическая головоломка / вопрос

В случае с 3 х 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 все становится сложнее.Сосед считается в 2 шагах от центральной ячейки, поскольку (grid_size - 1) / 2 = 2, где размер гирды равен 5 или sqrt (количество ячеек).Линии из следующих ячеек будут пересекать центральную ячейку:

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 x5 сетка (розовая).Находясь в ячейке, я также должен учитывать любые пересекающиеся линии, проведенные между соседними ячейками (зеленый).

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 Ответ

1 голос
/ 21 июня 2019

Просто короткая мысль: если координаты x ваших двух точек лежат в левой части центрального квадрата, линия не пересекает ее. Если обе x-координаты лежат на правой стороне, они тоже этого не делают, равно как и их, если обе y-координаты находятся сверху или ниже дна. Во всех остальных случаях они пересекаются (?).

...