我正在尝试使用五种不同的变换生成分形,这些变换是我从骨架代码,平移,旋转,缩放,非均匀缩放和图像实现的。这些转换都是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?将矩阵乘以有一个变换矩阵并将其循环多次以生成分形?
答案 0 :(得分:0)
你想要输入脚本驱动的sierpinski三角形或分形生成器吗?
1.triangle
2.generator
答案 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 |