案例二十八Sierpinski海绵.ppt
45页本案例知识要点Ø使用MFC框架提供的View类进行函数定义和声明Ø递归算法的设计和使用Ø图形的着色和输出案例二十八 Sierpinski海绵案例二十八Sierpinski海绵一、案例需求Ø案例描述l在1915年~1916年期间,波兰数学家Sierpinski构造出一个千疮百孔的Sierpinski海绵其形成原理是将一个如图(a)所示的立方体沿其各个面等分为9个小立方体,舍弃位于立方体中心的一个小立方体以及位于立方体六个面中心的各个小立方体,如图(b)所示将20个小立方体继续按相同的方法分割并舍弃位于立方体中心和平面中心处的更小的立方体,就能得到中间有大量空隙的Sierpinski海绵,分别如图(c)、(d)、(e)所示l试编程实现案例二十八Sierpinski海绵Ø案例效果图(a)n=0 (b)n=1 (c)n=2 (d)n=3 (e)n=4案例二十八Sierpinski海绵Ø功能说明l不需要定义新类,利用MFC已有的View类,实现递归算法l根据输入的不同递归深度,绘制相应的海绵l将完成的图形正面显示为红色,顶面显示为绿色,右面显示为蓝色案例二十八Sierpinski海绵二、案例分析Ø本案例主要讲解如何使用MFC已有的SpongeView类,在扩展名为.h的文件中进行函数和变量的声明,在.cpp文件中进行函数的定义。
另外本案例讲解了图形绘制方法ØSierpinski海绵是分形立体,具有自相似性其生成元是将立方体分成27个小立方体,挖去立方体六个面中心的小立方体以及位于立方体中心的一个小立方体,共挖去7个小立方体,如图所示Sierpinski海绵图形的递归是通过反复用生成元来取代每一个小正方形而建立起来的案例二十八Sierpinski海绵海绵生成元 案例二十八Sierpinski海绵Ø每个立方体在图形显示上是由前面、顶面和右面3个面构成的设前面的正方形的左上角点为(x, y),边长为d,对于顶面和右面,由于其为平行四边形,其夹角为45°的斜边的水平投影DXdcos( /4),垂直投影DYdsin( /4)因为DXDY,所以可全部以DX代替案例二十八Sierpinski海绵Ø对于前面,顺时针方向的4个顶点为:(x, y),( ),( ),( )Ø对于顶面,顺时针方向的4个顶点为:(x, y),( ),( ),( )Ø对于右面,顺时针方向的4个顶点为:( ),( ),( ),( )。
案例二十八Sierpinski海绵Ø为了进行递归,需要计算20个小立方体的左上角坐标Ø对于上层的8个小立方体,按照画家算法对小立方体进行编号案例二十八Sierpinski海绵案例二十八Sierpinski海绵Ø对中层的4个小立方体进行编号案例二十八Sierpinski海绵Ø对下层的8个小立方体进行编号案例二十八Sierpinski海绵三、案例设计 1.SpongeView类的设计 (1)数据成员 double x,y,d; 正方形的左上角点为(x,y),正方形边长为d int n; 递归深度 (2)函数成员 void Cubicf(double x,double y,double d); 绘制立方体前面 void Cubict(double x,double y,double d); 绘制立方体顶面 void Cubicr(double x,double y,double d); 绘制立方体右面案例二十八Sierpinski海绵l在文件视图的Source Files目录下找到SpongeView.h文件并双击打开,添加变量成员和成员函数的声明,如图所示。
l在文件视图的Source Files目录下找到SpongeView.cpp文件并双击打开,添加成员函数的定义案例二十八Sierpinski海绵添加变量成员和成员函数的声明 案例二十八Sierpinski海绵2.对话框的设计l在资源视图Resource View中右击Dialog选项,选择Insert Dialog命令,在对话框内添加静态文本框Static Text和文本框Edit Box控件并修改属性,Edit控件的ID为IDC_EDIT1,对话框的设计结果如图所示案例二十八Sierpinski海绵对话框的设计结果 案例二十八Sierpinski海绵l双击对话框,弹出Adding a class对话框,保持默认值添加一个新类Creat a new class,单击【OK】按钮在弹出的对话框中填写对话框类名CInputDlg,单击【OK】按钮在“查看”菜单下选择Class Wizard命令,单击Member Variable标签修改成员变量的名称和类型其中IDC_EDIT1的成员变量名为m_n,类型为int,代表递归深度,单击【确定】按钮退出设计结果如图所示案例二十八Sierpinski海绵对话框类成员变量的设计结果 案例二十八Sierpinski海绵 3.菜单设计l在资源视图Resource View中单击Menu目录,双击IDR_MAINFRAME选项,修改命令,设置菜单Sponge的ID为ID_MENUSponge。
从“查看”菜单中打开类向导MFC ClassWizard,在Object IDs列表框中选择ID_MENUSponge选项,在Class name下拉列表框中选择CSpongeView选项,在Message列表框中选择COMMAND选项后,单击【Add Function】按钮,弹出对话框,默认菜单成员函数的名称为OnMENUSponge(),单击【OK】按钮,则在Member functions列表框中添加了成员函数,该函数是CSponge View类的成员函数,单击【Edit Code】按钮可以对函数进行编辑案例二十八Sierpinski海绵菜单调用流程案例二十八Sierpinski海绵四、案例实现案例二十八Sierpinski海绵案例二十八Sierpinski海绵案例二十八Sierpinski海绵案例二十八Sierpinski海绵案例二十八Sierpinski海绵案例二十八Sierpinski海绵案例二十八Sierpinski海绵案例二十八Sierpinski海绵案例二十八Sierpinski海绵案例二十八Sierpinski海绵案例二十八Sierpinski海绵案例二十八Sierpinski海绵案例二十八Sierpinski海绵案例二十八Sierpinski海绵案例二十八Sierpinski海绵案例二十八Sierpinski海绵案例二十八Sierpinski海绵案例二十八Sierpinski海绵案例二十八Sierpinski海绵案例二十八Sierpinski海绵案例二十八Sierpinski海绵案例二十八Sierpinski海绵五、案例总结与提高Ø案例总结lExample2View.cpp文件中定义的菜单成员函数OnMENUTax()的功能非常简单,只是进行Sponge()函数的调用。
在Sponge()函数中,先绘制立方体前面,再绘制顶面和右面,并分别用不同的颜色进行填充l颜色填充是本例的难点,这里按照路径来填充请认真体会以下语句:udc.BeginPath();udc.Polygon(right,4);udc.EndPath();udc.FillPath();u其中FillPath 函数使用现有的多边形填充模式填充多边形内部案例二十八Sierpinski海绵Ø案例提高l绘制Sierpinski地毯其生成规则为:取一正方形,将其每条边三等分,正方形被等分为9个面积相等的小正方形,舍弃其中央的一个正方形;将剩下的8个小正方形按上面同样的方法继续分割,并同样舍弃位于中间的那个小正方形,如此不断地分割与舍弃,就能得到中间有大量空隙的Sierpinski地毯要求程序的运行结果如图所示案例二十八Sierpinski海绵。





