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