自然界中有很多图形具有自相似性:即图形的一部分与整个图形具有一样的形状。如下面几张图:
IFS算法的主要思想是随机生成很多个点,对每一个点,随机在所有可能的transform(用一个矩阵表示)中取一个,对点进行变换(其实是一个伸缩+平移变换之和)。
如下:
for "lots" of random points (x0, y0)
for k=0 to num_iters
pick a random transform fi
(xk+1, yk+1) = fi(xk, yk)
display a dot at (xk, yk)
下面贴出其核心代码:
void IFS::RenderIFS(Image *image, const int &num_points, const int &num_iters)
{
int width = image->Width(), height = image->Height();
for(int i=1; i<=num_points; i++)
{
Vec2f V = Vec2f(rand()/(RAND_MAX+0.0), rand()/(RAND_MAX+0.0));
for(int k=0;k<num_iters;k++)
{
float p = rand()/(RAND_MAX+0.0);
float sum = 0;
int j = 0;
for(j=0;j< n;j++)
{
sum += probability[j];
if( p <= sum)
break;
}
m[j].Transform(V);
}
if(V.x()>=0 && V.x()<=1 && V.y()>=0 &&V.y()<=1)
image->SetPixel(V.x()*width, V.y()*height, Vec3f(0,1,0));
}
}
链接为完整程序的下载:(该程序也是MIT6.837计算机图形学公开课assignment0的答案)
http://download.youkuaiyun.com/detail/qwert1122332211/6567091