Я пытаюсь сгенерировать фракталы, используя пять различных преобразований, которые я реализовал из кода скелета, перевода, поворота, масштабирования, неоднородного масштаба и изображения. Все эти преобразования представляют собой матрицы 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? Умножать матрицы до тех пор, пока не получится одна матрица преобразования, и зациклить ее несколько раз, чтобы получить фрактал?
Вы хотите треугольник Серпинского или генератор фракталов, управляемый входным скриптом?
1.triangle
2.generator
Вам придется реализовать игру хаос. То есть вы случайным образом выбираете одно из преобразований и применяете его к точке итерации. Сделайте это число (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 |