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