递归分形!
递归分形递归的基础递归是一种编程思想核心是函数/方法调用自身并且通过一下这两个关键条件控制执行递归的终止条件当满足某个条件时停止调用自身避免无限循环递归递推关系:将复杂问题拆解为规模更小逻辑相同的子问题理解要解决大问题先解决和它逻辑一样的小问题知道小问题简单到不用再拆终止条件。分形的特征分形时将具有自相似性的几何图形——整体和局部的形状完全或者近似相同比如雪花等嵌套都属于分形。谢尔宾斯基地毯方块分形1、核心构造规则基础划分将一个大正方形按 3×3 的九宫格均匀划分为 9 个小正方形。保留中心保留正中心的 1 个小正方形主要图形递归迭代对周围剩余的 8 个 小正方形重复上述保留中心的操作直到正方形尺寸小到无法分辨触发递归终止条件。代码执行流程drawfang步骤1、设定终止条件if(w5){return;}步骤2、绘制当前层级的中心图形g.fillRect(xw/3,yh/3,w/3,h/3);步骤3、递归绘制周边的八个方块自相似这是分形的关键连续调用八次drawfang方法分别对应除了中心外的8个方位。每一个周边的小方块都会独立进入流程再次执行“画中心”逻辑从而形成层层嵌套的视觉效果。drawfang(g,x,y,w/3,h/3);drawfang(g,xw/3,y,w/3,h/3);drawfang(g,x2*w/3,y,w/3,h/3);drawfang(g,x,yh/3,w/3,h/3);drawfang(g,x,y2*h/3,w/3,h/3);drawfang(g,x2*w/3,y2*h/3,w/3,h/3);drawfang(g,x2*w/3,yh/3,w/3,h/3);drawfang(g,xw/3,y2*h/3,w/3,h/3);packageljc_0307;importjava.awt.*;importjavax.swing.*;publicclassdrawextendsJFrame{publicdraw(){setTitle(画图);setSize(800,800);setLocationRelativeTo(null);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLayout(newFlowLayout());setVisible(true);}Overridepublicvoidpaint(Graphicsg){super.paint(g);g.setColor(Color.black);drawfang(g,200,200,400,400);}publicvoiddrawfang(Graphicsg,intx,inty,intw,inth){if(w5){return;}g.fillRect(xw/3,yh/3,w/3,h/3);drawfang(g,x,y,w/3,h/3);drawfang(g,xw/3,y,w/3,h/3);drawfang(g,x2*w/3,y,w/3,h/3);drawfang(g,x,yh/3,w/3,h/3);drawfang(g,x,y2*h/3,w/3,h/3);drawfang(g,x2*w/3,y2*h/3,w/3,h/3);drawfang(g,x2*w/3,yh/3,w/3,h/3);drawfang(g,xw/3,y2*h/3,w/3,h/3);}staticvoidmain(String[]args){newdraw();}}谢尔宾斯基三角形与上一个图形完成相似不过这个将正方形变成了三角形。步骤1、设定终止条件if(w5){return;}步骤2、绘制当前层级的图形g.drawLine(xw/2,y,x,yh);g.drawLine(xw/2,y,xw,yh);g.drawLine(x,yh,xw,yh);步骤3、递归绘制9个三角形自相似这是分形的关键连续调用9次drawsan方法每一个周边的三角形都会独立进入流程再次执行逻辑从而形成层层嵌套的视觉效果。drawsan(g,xw/3,y,w/3,h/3);drawsan(g,xw/6,yh/3,w/3,h/3);drawsan(g,x,y2*h/3,w/3,h/3);drawsan(g,xw/2,yh/3,w/3,h/3);drawsan(g,x2*w/3,y2*h/3,w/3,h/3);drawsan(g,xw/3,y2*h/3,w/3,h/3);drawsan(g,xw/4,y2*h/3,w/6,h/6);drawsan(g,x7*w/12,y2*h/3,w/6,h/6);drawsan(g,x5*w/12,yh/3,w/6,h/6);packageljc_0307;importjava.awt.*;importjavax.swing.*;publicclassdraw2extendsJFrame{publicdraw2(){setTitle(画图);setSize(800,800);setLocationRelativeTo(null);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLayout(newFlowLayout());setVisible(true);}Overridepublicvoidpaint(Graphicsg){super.paint(g);g.setColor(Color.black);drawsan(g,200,200,350,300);}publicvoiddrawsan(Graphicsg,intx,inty,intw,inth){if(w5){return;}g.drawLine(xw/2,y,x,yh);g.drawLine(xw/2,y,xw,yh);g.drawLine(x,yh,xw,yh);drawsan(g,xw/3,y,w/3,h/3);drawsan(g,xw/6,yh/3,w/3,h/3);drawsan(g,x,y2*h/3,w/3,h/3);drawsan(g,xw/2,yh/3,w/3,h/3);drawsan(g,x2*w/3,y2*h/3,w/3,h/3);drawsan(g,xw/3,y2*h/3,w/3,h/3);drawsan(g,xw/4,y2*h/3,w/6,h/6);drawsan(g,x7*w/12,y2*h/3,w/6,h/6);drawsan(g,x5*w/12,yh/3,w/6,h/6);}staticvoidmain(String[]args){newdraw2();}}混沌游戏这个图形是谢尔宾斯基三角形的另一种生成方式——混沌游戏算法也叫“随机选择算法”是分型图形的非递归实现方式核心特征得到的方法有三个不在统一直线上的顶点A,B,C.另有一点p点p随机与ABC其中的一点连线取得中点这个新的中点是新的p点再重复以上过程随机找到一点与p相连得中点。无数个中点最后得到图形这个图形就是谢尔宾斯三角形。代码分析定义基础顶点Pointp1newPoint(200,100);Pointp2newPoint(100,300);Pointp3newPoint(300,300);PointpnewPoint(350,200);//p点绘制初始顶点可视化锚点intr5;for(inti0;ipoints.length;i){Pointpppoints[i];ColorcnewColor(0,0,0);g.setColor(c);g.fillOval(pp.x-r,pp.y-r,r,r);}核心迭代逻辑Colorc2newColor(193,27,27);g.setColor(c2);RandomrandomnewRandom();intXp.x;//初始点x坐标种子点intYp.y;//初始点y坐标 (种子点//迭代10000次次数越多图形越密集for(inti0;i10000;i){//步骤一随机选择一个顶点intchoicerandom.nextInt(3);intx00;inty00;if(choice0){x0p1.x;y0p1.y;}elseif(choice1){x0p2.x;y0p2.y;}elseif(choice2){x0p3.x;y0p3.y;}//步骤二计算当前点与选中顶点的中点坐标X(Xx0)/2;Y(Yy0)/2;//步骤三再中点位置绘制1*1的像素点g.fillOval(X,Y,1,1);}//完整代码packageljc_0307;importjava.awt.*;importjava.util.Random;importjavax.swing.*;publicclassdraw3extendsJFrame{Pointp1newPoint(200,100);Pointp2newPoint(100,300);Pointp3newPoint(300,300);PointpnewPoint(350,200);publicdraw3(){setTitle(画图);setSize(800,800);setLocationRelativeTo(null);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLayout(newFlowLayout());setVisible(true);}Overridepublicvoidpaint(Graphicsg){super.paint(g);g.setColor(Color.black);Point[]points{p1,p2,p3};intr5;for(inti0;ipoints.length;i){Pointpppoints[i];ColorcnewColor(0,0,0);g.setColor(c);g.fillOval(pp.x-r,pp.y-r,r,r);}Colorc2newColor(193,27,27);g.setColor(c2);RandomrandomnewRandom();intXp.x;intYp.y;for(inti0;i10000;i){intchoicerandom.nextInt(3);intx00;inty00;if(choice0){x0p1.x;y0p1.y;}elseif(choice1){x0p2.x;y0p2.y;}elseif(choice2){x0p3.x;y0p3.y;}X(Xx0)/2;Y(Yy0)/2;g.fillOval(X,Y,1,1);}}staticvoidmain(String[]args){newdraw3();}}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2412474.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!