(MIT 6.837)迭代函数系统IFS画自相似图形的算法

     自然界中有很多图形具有自相似性:即图形的一部分与整个图形具有一样的形状。如下面几张图:

          

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.csdn.net/detail/qwert1122332211/6567091

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算子迭代与自相似集 出版时间:2013年版 内容简介   《算子迭代与自相似集》主要涉及算子迭代与自相似集两个方面,系统介绍了若干压缩算子通过Picard迭代得到的不动点结果及其在迭代函数系统中的应用,进而介绍了若干新的分形吸引子的生成机制;并用较多的篇幅全面介绍了相似压缩生成的自相似集的Hausdorff测度和上凸密度的若干问题。全书共分七章和一个附录。第1章属预备章节,介绍与测度与维数相关的基本定义、术语、符号和有关的基本命题;第2章讨论各种压缩算子的迭代及其不动点结果;第3章介绍Hutchinson迭代函数系统与自相似集;第4章讨论(L,M,N)-迭代函数系统及其吸引子的存在性问题;第5章讨论n维欧氏空间中的自相似集的Hausdorff测度和有关问题;第6章讨论上凸密度与最好Hs-几乎处处覆盖;第7章介绍相似压缩不动点的若干结果。在附录A中简单介绍必需的集合论、度量空间的基础知识。《算子迭代与自相似集》内容丰富,论述严谨,条理清楚,图文并茂,并具有较好的自封性。《算子迭代与自相似集》不仅介绍算子迭代生成的迭代函数系统和自相似集的Hausdorff测度一般理论,而且还论述了近年来关于迭代函数系统和自相似集的Hausdorff测度的若干新理论与新方法,以及相关的公开问题。《算子迭代与自相似集》可供大学教师和科研工作者学习与研究使用,也可作为高年级本科生、研究生的教材和参考书。 目录 前言 符号表 第1章 测度与维数 1.1 测度论基础 1.2 Hausdorff测度与Hausdorff维数 1.3 Hausdorff容度与Hausdorff测度 1.4 覆盖定理 1.5 上(下)局部维数 1.6 分形的例子 第2章 算子迭代与不动点 2.1 压缩算子 2.1.1 压缩算子的定义 2.1.2 注记 2.2 压缩算子的不动点定理 2.2.1 几个经典的不动点定理 2.2.2 (a,b,c,e,f)一压缩算子的不动点结果 第3章 Hutchinson迭代函数系统与自相似集 3.1 分形空间 3.2 Hutchinson迭代函数系统 3.2.1 Hutchinson迭代函数系统与自相似集 3.2.2 相似压缩函数系统与Rn中的自相似集 第4章 (L,M,N)迭代函数系统与自相似集 4.1 迭代函数系统与一个公开问题 4.2 (L,M,N)-迭代函数系统与一个公开问题的回答 4.3 由(L,M,N)-迭代函数系统导出的新迭代函数系统 4.3.1 (L,O,L)迭代函数系统 4.3.2 (L,O,N)迭代函数系统 4.3.3 (O,O,N)迭代函数系统 第5章 自相似集的Hausdorff测度 5.1 自相似集的Hausdorff维数和Hausdorff测度 5.2 部分估计原理 5.3 自相似集的质量分布原理 5.3.1 几个引理 5.3.2 自相似集的质量分布原理 5.3.3 自相似集的Hausdorff测度的一个判据 5.4 满足强分离开集条件的自相似集的Hausdorff测度 5.4.1 几个引理 5.4.2 等式Hs(E∩U)=|U|s成立的充分条件 5.5 自相似集的Hausdoreff测度的计算 5.5.1 计算直线上的自相似集的Hausdorff测度的准确值例子 5.5.2 平面上的自相似集的Hausdorff测度的计算 5.6 关于Koch曲线的Hausdorff测度的近似值的计算 5.6.1 Koch曲线的Hausdorff测度 5.6.2 关于Hs(K)的近似值的算法及其计算机实现 5.7 关于自相似集的Hausdorff测度的公开问题及其研究 5.7.1 关于自相似集的Hausdorff测度的公开问题 5.7.2 最好覆盖的存在性不能蕴含自然覆盖是最好覆盖 5.7.3 强分离的自相似集在相似压缩不动点的最好形状的存在性 第6章 自相似集的上凸密度 6.1 s-集的一个覆盖性质 6.2 自相似集的最好几乎处处覆盖的存在性 6.3 自相似集的上凸密度与上球密度 6.3.1 s-集的上凸密度与上球密度 6.3.2 密度的基本性质 6.3.3 s-集的上凸密度的等价定义 6.3.4 自相似集的上凸密度 6.3.5 估计自相似集的上凸密度的下限的方法 6.3.6 自相似集的基本密度界 6.3.7 相似压缩不动点处的上凸密度 6.3.8 相似压缩不动点处的上凸密度的刻画 6.3.9 相似压缩不动点处的上凸密度小于1的充分必要条件 6.3.10 一些经典的自相似集的上凸密度的基本密度界 6.4 一类由自相似集的上凸密度的值所构成的集合的基数 6.5 估计自相似集的上凸密度的若干例子 6.6 关于Sierpmski垫片的上凸密度的最小值的存在性 第7章 自相似集的相似压缩不动点 7.1 相似压缩不动点的定义 7.2 一类线性Ca
好的,以下是一个简单的画图程序的实现: ```cpp #include <graphics.h> #include <conio.h> int main() { // 初始化图形界面 initgraph(640, 480); // 创建菜单 int menu = 0; char* menuItems[] = {"中点画线算法", "Bresenham画线算法", "中点画圆算法", "区域填充算法", "二维线段裁剪算法", "分形算法", "退出"}; int numMenuItems = sizeof(menuItems) / sizeof(char*); while (menu != numMenuItems - 1) { // 显示菜单 cleardevice(); settextstyle(20, 0, "Arial"); outtextxy(100, 50, "请选择:"); for (int i = 0; i < numMenuItems; i++) { if (i == menu) { settextcolor(YELLOW); } else { settextcolor(WHITE); } outtextxy(100, 100 + i * 30, menuItems[i]); } // 处理菜单选择 int key = getch(); switch (key) { case 72: // 上箭头 menu--; if (menu < 0) { menu = numMenuItems - 1; } break; case 80: // 下箭头 menu++; if (menu >= numMenuItems) { menu = 0; } break; case 13: // 回车键 switch (menu) { case 0: // 中点画线算法 // TODO: 实现中点画线算法 break; case 1: // Bresenham画线算法 // TODO: 实现Bresenham画线算法 break; case 2: // 中点画圆算法 // TODO: 实现中点画圆算法 break; case 3: // 区域填充算法 // TODO: 实现区域填充算法 break; case 4: // 二维线段裁剪算法 // TODO: 实现二维线段裁剪算法 break; case 5: // 分形算法 // TODO: 实现分形算法 break; } break; } } // 关闭图形界面 closegraph(); return 0; } ``` 在菜单选择对应的功能时,你需要自己实现中点画线算法、Bresenham画线算法、中点画圆算法、区域填充算法、二维线段裁剪算法和分形算法。以下是一些参考实现: 中点画线算法: ```cpp void lineMidpoint(int x1, int y1, int x2, int y2, int color) { int dx = x2 - x1; int dy = y2 - y1; int d = 2 * dy - dx; int y = y1; for (int x = x1; x <= x2; x++) { putpixel(x, y, color); if (d > 0) { y++; d -= 2 * dx; } d += 2 * dy; } } ``` Bresenham画线算法: ```cpp void lineBresenham(int x1, int y1, int x2, int y2, int color) { int dx = abs(x2 - x1); int dy = abs(y2 - y1); int sx = x1 < x2 ? 1 : -1; int sy = y1 < y2 ? 1 : -1; int err = dx - dy; while (true) { putpixel(x1, y1, color); if (x1 == x2 && y1 == y2) { break; } int e2 = 2 * err; if (e2 > -dy) { err -= dy; x1 += sx; } if (e2 < dx) { err += dx; y1 += sy; } } } ``` 中点画圆算法: ```cpp void circleMidpoint(int x0, int y0, int r, int color) { int x = 0; int y = r; int d = 1 - r; while (x <= y) { putpixel(x0 + x, y0 + y, color); putpixel(x0 + y, y0 + x, color); putpixel(x0 - x, y0 + y, color); putpixel(x0 - y, y0 + x, color); putpixel(x0 + x, y0 - y, color); putpixel(x0 + y, y0 - x, color); putpixel(x0 - x, y0 - y, color); putpixel(x0 - y, y0 - x, color); if (d < 0) { d += 2 * x + 3; } else { d += 2 * (x - y) + 5; y--; } x++; } } ``` 区域填充算法: ```cpp void floodFill(int x, int y, int color) { if (getpixel(x, y) != color) { putpixel(x, y, color); floodFill(x - 1, y, color); floodFill(x + 1, y, color); floodFill(x, y - 1, color); floodFill(x, y + 1, color); } } ``` 二维线段裁剪算法: ```cpp const int LEFT = 1 << 0; const int RIGHT = 1 << 1; const int BOTTOM = 1 << 2; const int TOP = 1 << 3; int computeOutCode(int x, int y, int xmin, int xmax, int ymin, int ymax) { int code = 0; if (x < xmin) { code |= LEFT; } else if (x > xmax) { code |= RIGHT; } if (y < ymin) { code |= BOTTOM; } else if (y > ymax) { code |= TOP; } return code; } bool clipLine(int& x1, int& y1, int& x2, int& y2, int xmin, int xmax, int ymin, int ymax) { int outcode1 = computeOutCode(x1, y1, xmin, xmax, ymin, ymax); int outcode2 = computeOutCode(x2, y2, xmin, xmax, ymin, ymax); while (true) { if (outcode1 == 0 && outcode2 == 0) // 全部在视口内 { return true; } else if (outcode1 & outcode2) // 全部在视口外,不可见 { return false; } else // 部分在视口内,裁剪 { int x, y; int outcode = outcode1 ? outcode1 : outcode2; if (outcode & TOP) { x = x1 + (x2 - x1) * (ymax - y1) / (y2 - y1); y = ymax; } else if (outcode & BOTTOM) { x = x1 + (x2 - x1) * (ymin - y1) / (y2 - y1); y = ymin; } else if (outcode & RIGHT) { y = y1 + (y2 - y1) * (xmax - x1) / (x2 - x1); x = xmax; } else if (outcode & LEFT) { y = y1 + (y2 - y1) * (xmin - x1) / (x2 - x1); x = xmin; } if (outcode == outcode1) { x1 = x; y1 = y; outcode1 = computeOutCode(x1, y1, xmin, xmax, ymin, ymax); } else { x2 = x; y2 = y; outcode2 = computeOutCode(x2, y2, xmin, xmax, ymin, ymax); } } } } ``` 分形算法: ```cpp void fern(int x, int y, int n, double len, double alpha) { if (n == 0) { putpixel(x, y, GREEN); } else { double theta = alpha * 3.1415926 / 180.0; double x1 = x + len * cos(theta); double y1 = y - len * sin(theta); fern(x1, y1, n - 1, len / 2, alpha + 15); fern(x1, y1, n - 1, len / 2, alpha - 75); theta = (alpha + 180) * 3.1415926 / 180.0; x1 = x + len * cos(theta); y1 = y - len * sin(theta); fern(x1, y1, n - 1, len / 2, alpha - 15); fern(x1, y1, n - 1, len / 2, alpha + 75); } } ``` 以上是一些参考实现,你可以根据需要自行修改和完善。祝成功!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值