N = 12 * n + 1;
где n - число слоев вокруг базового тр-ка
в игре жизнь стандартом идет квадратная решетка, как мне сделать эту же игру но в треугольной решетке? я новичек.. уже все что знал перепробовал, искал в инете ничего...
я новичек.. уже все что знал перепробовал, искал в инете ничего...
1) Конфигурацию (число) соседних клеток обеспечивающую перенаселенность (гибель центральной клетки);
2) Конфигурацию (число) соседних клеток обеспечивающую рождение центральной клетки;
3) Конфигурацию (число) соседних клеток обеспечивающую одиночество (гибель центральной клетки);
В общем случае эти правила произвольны и задаются аксиоматически.
Надо определить, какие из желтых, зеленых и синих клеток считать соседними.
Есть еще проблема с формулой по которой задается расположение решетки. Т. Е. Треугольники должны переворачиваться
Выделим один (базовый) треугольник в центре экрана для определенности.
Код:
//Зададим координаты вершины базового треугольника в экранных координатах
double x0 = 200.0, y0 = 200.0;//pixels
//Зададим длину ребра базового тр-ка
double l = 4.0;//pixels
//Вычислим высоту базового тр-ка
double h = 2.0*1.732050807568880*l/3.0;//Длинное число это корень квадратный из трех
//Пусть координаты вершин тр-ков хранятся в структурах
struct Triangle {
double x1, y1,
x2, y2,
x3, y3;
};
//Создадим базовый тр-к
Triangle *base = new Triangle();
base->x1 = x0; base->y1 = y0;
base->x2 = x0 - 0.5*l; base->y2 = y0 + h;
base->x3 = x0 + 0.5*l; base->y3 = y0 + h;
//Остальные треугольники задаются через уже известные координаты
//Тр-к справа от базового
Triangle *tr = new Triangle();
tr->x1 = base->x1; tr->y1 = base->y1;
tr->x2 = base->x1 + l; tr->y2 = base->y1;
tr->x3 = base->x3; tr->y3 = base->y3;
double x0 = 200.0, y0 = 200.0;//pixels
//Зададим длину ребра базового тр-ка
double l = 4.0;//pixels
//Вычислим высоту базового тр-ка
double h = 2.0*1.732050807568880*l/3.0;//Длинное число это корень квадратный из трех
//Пусть координаты вершин тр-ков хранятся в структурах
struct Triangle {
double x1, y1,
x2, y2,
x3, y3;
};
//Создадим базовый тр-к
Triangle *base = new Triangle();
base->x1 = x0; base->y1 = y0;
base->x2 = x0 - 0.5*l; base->y2 = y0 + h;
base->x3 = x0 + 0.5*l; base->y3 = y0 + h;
//Остальные треугольники задаются через уже известные координаты
//Тр-к справа от базового
Triangle *tr = new Triangle();
tr->x1 = base->x1; tr->y1 = base->y1;
tr->x2 = base->x1 + l; tr->y2 = base->y1;
tr->x3 = base->x3; tr->y3 = base->y3;
Заполнять плоскость можно построчно или кольцами вокруг базового тр-ка.
Если заполнять кольцами, то общее число тр-ков вычисляется по формуле:
Код:
У меня так получилось:
Исходники программы для клеточного автомата на трехмерной решетке я выложил. Если интересно, посмотри мои исходники.
Спасибо
Имей ввиду, в структуре программы есть ошибка. Самая большая функция, которая формирует указатели на соседние ячейки, выполняется в предположении, что вся область пространства укладывается в ромб. Визуализация осуществлена в виде укладки в прямоугольник. Поэтому следует, либо переписать функцию инициализирующую координаты вершин треугольников (так, чтобы пространство выглядело как ромб), либо переписать функцию инициализации указателей на соседей. Ясно, что прямоугольная структура на много круче ромбовидной, но там несколько больше случаев расположения групп соседних ячеек.