用变换矩阵生成分形

时间:2014-02-25 16:59:04

标签: c++ opengl matrix fractals

我正在尝试使用五种不同的变换生成分形,这些变换是我从骨架代码,平移,旋转,缩放,非均匀缩放和图像实现的。这些转换都是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;
}

其中Matrix定义为

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's 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?将矩阵乘以有一个变换矩阵并将其循环多次以生成分形?

2 个答案:

答案 0 :(得分:0)

你想要输入脚本驱动的sierpinski三角形或分形生成器吗?

1.triangle

  • 很容易
  • 没有旋转翻译或者需要什么
  • 根据sierpinski规则http://en.wikipedia.org/wiki/Sierpinski_triangle
  • 创建点数
  • 三角形的所有边都被分成一半
  • 所以新点只是每行的起点和终点的平均值
  • 然后填充子三角形
  • 如果你只想要线框,那么即使是点名单也不需要

2.generator

  • 您未提供任何规则,控制脚本命令
  • 我在脚本中唯一看到的是输入三角形的3个顶点
  • 这就是
  • 我没有看到任何三角形划分规则
  • 或哪个部分已填充
  • 使用了多少次递归
  • 你唯一提到的是你使用5个转换矩阵3x3进行旋转,缩放和翻译
  • 但没有说明何时以及为何

答案 1 :(得分: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 |