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

0

Я пытаюсь создать фракталы, используя пять различных преобразований, которые я реализовал из кода скелета, перевел, повернул, масштабировал, неравномерный масштаб и изображение. Эти преобразования представляют собой все матрицы 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? Умножьте матрицы до тех пор, пока не будет одна матрица преобразования, и не зацикливайте ее несколько раз, чтобы создать фрактал?

Теги:
opengl
matrix
fractals

2 ответа

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

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

1.triangle

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

2.generator

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню