Генерация фракталов с матрицами преобразования

Я пытаюсь сгенерировать фракталы, используя пять различных преобразований, которые я реализовал из кода скелета, перевода, поворота, масштабирования, неоднородного масштаба и изображения. Все эти преобразования представляют собой матрицы 3х3, например:

Matrix rotate ( Pt p, float theta )
{
Matrix rvalue;
rvalue.data[0][0] = cos(theta);
rvalue.data[0][1] = -sin(theta);
rvalue.data[0][2] = p.x + p.y*sin(theta) - p.x*cos(theta);
rvalue.data[1][0] = sin(theta);
rvalue.data[1][1] = cos(theta);
rvalue.data[1][2] = p.y - p.y*cos(theta) - p.x*sin(theta);
rvalue.data[2][0] = 0;
rvalue.data[2][1] = 0;
rvalue.data[2][2] = 1;
return rvalue;
}

где матрица определяется как

class Matrix
{
public:
float data [ 3 ] [ 3 ];

Matrix ( void )
{
int i, j;

for ( i = 0; i < 3; i++ )
{
for ( j = 0; j < 3; j++ )
{
data [ i ] [ j ] = 0;
}
}
}
};

В тестовом файле есть следующий код, который должен генерировать Треугольник Серпинского

vector<Matrix> iat;
iat.push_back ( scale ( Pt ( -.9, -.9 ), 0.5 ) );
iat.push_back ( scale ( Pt ( .9, -.9 ), 0.5 ) );
iat.push_back ( scale ( Pt ( 0, .56 ), 0.5 ) );

setIATTransformations ( iat );

Где Pt определяется как:

class Pt
{
public:
float x, y;

Pt ( float newX, float newY )
{
x = newX;
y = newY;
}

Pt ( void )
{
x = y = 0;
}
};

Как мне реализовать setIATTransformations? Умножать матрицы до тех пор, пока не получится одна матрица преобразования, и зациклить ее несколько раз, чтобы получить фрактал?

0

Решение

Вы хотите треугольник Серпинского или генератор фракталов, управляемый входным скриптом?

1.triangle

  • достаточно легко
  • не нужны ротационные переводы или что-либо еще
  • просто создать точки в соответствии с правилом Серпинского http://en.wikipedia.org/wiki/Sierpinski_triangle
  • все стороны треугольников делятся на половину
  • так что новые точки — это просто среднее из начальной и конечной точек каждой линии
  • а затем заполните под треугольники
  • если вы хотите просто каркас, то даже список точек не нужен

2.generator

  • вы не предоставили никаких правил, команд для скрипта управления
  • единственное, что я вижу в вашем скрипте — это ввод 3-х вершин треугольника
  • и это все
  • Я не вижу никаких правил для деления треугольника
  • или какая часть заполнена или нет
  • сколько рекурсий используется
  • единственное, что вы упомянули, это то, что вы используете 5 матриц преобразования 3х3 для вращения, масштабирования и перемещения
  • но не уточнил когда и почему
0

Другие решения

Вам придется реализовать игру хаос. То есть вы случайным образом выбираете одно из преобразований и применяете его к точке итерации. Сделайте это число (30, 50 или 100), не рисуя точку, и после этого отметьте все точки. Результирующее облако точек со временем заполнит фрактал.

Ваша рабочая шкала (Pt (a, b), s) должна реализовывать операцию

(x ‘, y’) = s * (x, y) + (1-s) * (a, b), то есть в матричных терминах

| x' |   |  s  0  (1-s)*a|   | x |
| y' | = |  0  s  (1-s)*b| * | y |
| 1  |   |  0  0    1    |   | y |
0

По вопросам рекламы [email protected]