У меня есть математическая головоломка / вопрос
В случае с 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
Теперь с сеткой 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 x5 сетка (розовая).Находясь в ячейке, я также должен учитывать любые пересекающиеся линии, проведенные между соседними ячейками (зеленый).
Я мог бы просто перебрать все ячейкии линии в ячейке (серые), но это было бы неэффективно.
В идеале я бы рисовал / вычислял только те линии, которые потенциально пересекают ячейку.
часть фрагмента шейдера:
#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);
}
}