递归,用最少的代码量完成最大的工作量,初步对递归开始上心是因为机试老师给了一道题,看到后开始着急忙慌就开始做,最后那个代码量,就不忍吐槽了,自己还觉得挺自豪的,写了那么多行代码,也打印出了正确图形,,结果老师一公布他的答案,和我几百行的代码相比老师只用了7行,完败。。。。。。。。。
于是觉得与其拿到题就开始做不如先找规律,本来思想就比代码重要,分形就是用递归画出美丽的图案,那些平时在我们眼中单调无趣的线条以及点,就能在不断递归中画出自然界之美。
我随意挑了两个比较有代表性的图案
画出的图如下所示:
以下是代码实现:
import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Graphics; import java.util.Random; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; public class Main extends JFrame { private Color color; double a,b,c,d; double x1=0; double y1=0; double x2,y2; public static void main(String[] args) { // TODO Auto-generated method stub Main a = new Main(); a.draw(); } public void draw(){//绘制界面,建立画布 this.setSize(1000,800);// this.setLocationRelativeTo(null); this.setDefaultCloseOperation(3); this.setLayout(new FlowLayout()); //设置可见 this.setVisible(true); Graphics g = this.getGraphics(); //调用·手镯图形 this.magic(g); } //手镯图形,公式已经得知 public void magic(Graphics g){ double a = 1.40,b = 1.56,c = 1.40, d = -6.56; for(int i=0;i<12133;i++){ for(int t=0;t<80;t++){ Color co = new Color(t++,t*2,t*3); g.setColor(co); } double x2=d*Math.sin(a*x1)-Math.sin(b*y1); double y2=c*Math.cos(a*x1)+Math.cos(b*y1); int x22= (int) (x2*30)+300; int y22=(int) (y2*30)+200; System.out.println(x22+","+y22); g.drawLine(x22,y22,x22,y22); x1=x2; y1=y2;} } public void paint(Graphics g){ super.paint(g); this.magic2(500,550,100, Math.PI/2,0,Math.PI/6,25,g); //(Math.PI为180°) } public void magic2(double x0,double y0,double l,double a,double b,double c,double count,Graphics g){ ImageIcon cat=new ImageIcon("image//$R7U8UGI.gif"); ImageIcon dog=new ImageIcon("image//$RJT225K.gif"); ImageIcon panda=new ImageIcon("image//$RM069VP.gif"); double x2; double y2; double x3; double y3; double x4; double y4; double x5; double y5; Random r=new Random(); //颜色随机变化 color = new Color(r.nextInt(256),r.nextInt(256),r.nextInt(256)); g.setColor(color); if(count<1) { return; }//判断是否继续进行递归调用,注意:判断一定要放在递归调用之前,否则这段代码将永远不会被执行 x2 = x0 - l*Math.cos(a); y2 = y0 - l*Math.sin(a); x3 = x2 - l*Math.cos(b); y3 = y2 - l*Math.sin(b); x4 = x0 - l*Math.cos(b); y4 = y0 - l*Math.sin(b); x5 = x2 - l*Math.cos(Math.PI/6)*Math.cos(c); y5 = y2 - l*Math.cos(Math.PI/6)*Math.sin(c); //可画图形,计算五个点的位置,以右下点为(X0,Y0) //g.drawImage(cat.getImage(),(int)x0-300,(int)y0-300, null); //g.drawImage(panda.getImage(),(int)x2-300,(int)y2+300, null); //g.drawImage(dog.getImage(),(int)x3,(int)y3, null); //g.drawImage(cat.getImage(),(int)x4,(int)y4, null); //g.drawImage(panda.getImage(),(int)x5,(int)y5, null); g.drawLine((int)x0, (int)y0, (int)x2, (int)y2); g.drawLine((int)x2, (int)y2, (int)x3, (int)y3); g.drawLine((int)x3, (int)y3, (int)x4, (int)y4); g.drawLine((int)x4, (int)y4, (int)x0, (int)y0); g.drawLine((int)x2, (int)y2, (int)x5, (int)y5); g.drawLine((int)x5, (int)y5, (int)x3, (int)y3); //递归调用 magic2(x2,y2,l*Math.cos(Math.PI/6),a+Math.PI/6,b+Math.PI/6,c+Math.PI/6,count-1,g); magic2(x5,y5,l*Math.sin(Math.PI/6),a-Math.PI/3,b-Math.PI/3,c-Math.PI/3,count-1,g); } private Color getColor(int inc){ int red = color.getRed(); int green = color.getGreen(); int blue = color.getBlue(); red += inc; green += inc; blue += inc; if(red > 255) red = 255; if(green > 255) green = 255; if(blue > 255) blue = 255; return new Color(red,green,blue); } }
相关推荐
分形递归算法是一种在计算机科学中广泛应用的数学方法,特别是在图形生成、图像处理和复杂系统建模等领域。分形,简单来说,是指那些在不同尺度上具有自相似性的几何形状或模式。它们通常展现出无穷的细节,即使放大...
分形图案,是一种在自然界和...无论是Koch曲线还是Sierpinski三角形,它们都展示了分形图案的无限魅力和递归构造的强大能力。在现代科技中,分形理论已深入到各个领域,从艺术设计到科学研究,无一不彰显其深远的影响。
### 分形递归树的森林景观实时模拟方法 #### 一、引言 随着计算机图形学的发展,如何高效地模拟大规模自然场景成为了该领域的重要课题之一。这些场景不仅包括简单的地形地貌,更涉及复杂的森林景观。森林景观由...
递归分形树的实现是基于数学和编程技术,特别是递归算法的应用。递归是一种解决问题的方法,它通过将问题分解为更小的子问题来解决原问题。在分形树的上下文中,递归意味着每个树干会分成若干个更细的分支,这些分支...
本项目标题“通过递归实现分形图形绘制”旨在教给初学者如何利用递归方法创建出美丽的分形图形。在VS2015环境下,你可以通过这个项目学习到如何设置和编译C++项目,并了解递归在实际编程中的应用。 首先,我们需要...
在计算机图形学中,这种算法可以用来生成复杂的图形,并且随着迭代次数增加,细节会越来越丰富,形成美丽的分形图案。这些分形不仅在理论上引人入胜,也常被用于艺术创作和视觉设计中,展示了数学与美学的完美结合。
分形,源自希腊语“fraktal”,是一个数学概念,由数学家曼德勃罗(Benoit Mandelbrot)在20世纪70年代提出。它描述了一种具有自相似性的几何形状,无论在宏观还是微观层面上,都呈现出相同的结构模式。这种无限重复...
VB6.0采用分形算法生成图案,本分形生成图形的程序可生成叶、树、雪花和三角图案。所谓分形,在数学上是指具有如下性质的一类图形: 1.具有无限的细节。具有无限的细节的意思是指这个图形无论如何放大,都无法...
用递归法求分形盒子使得输入一个n出先一个有规律的盒子,不断得扩大
递归是实现分形的一种常见方法,通过重复应用相同的过程或函数,但每次应用时都对输入进行缩小或变换,从而创建复杂的结构。在计算机图形学中,递归分形树是一种用以模拟自然界中复杂树形结构的有效方式,尤其适用于...
在这个名为“turtle-递归美学-分形树-draw_branch.rar”的压缩包中,我们找到了一个名为`draw_branch.py`的文件,它展示了如何利用递归技术来创建美丽的分形树。分形是一种具有自相似性的几何形状,即无论在大尺度...
毕达哥拉斯树是一种著名的分形图案,源于古希腊数学家毕达哥拉斯对比例和对称性的研究。在C#程序中,我们可以利用递归算法来生成这种分形。首先,我们需要定义一个基本的三角形结构,然后在每个小三角形的基础上,...
在这个“HTML5 Canvas实现鼠标响应式分形水杉树叶图案动画效果源码.zip”压缩包中,我们可以预见到一个利用Canvas API创建的、能够根据鼠标位置动态变化的分形水杉树叶动画。 分形(Fractal)是一种具有自相似性的...
《易语言画分形图案简化版》是一款基于易语言编程的源码实例,它通过集成易语言的位图操作支持库以及调用操作系统API函数,实现了绘制分形图案的功能。这个程序旨在帮助初学者理解分形图形的生成原理,并提供了一个...
**递归分形树源码解析** 分形树是一种基于分形几何理论的图形,它通过重复应用相同或相似的规则来创建具有自相似性的树形结构。在计算机图形学中,递归算法常用于实现分形树的生成,因为它能够以简洁的方式描述复杂...
递归法是实现分形图形的一种常用方法,通过重复执行相同或相似的过程来生成复杂的结构。本实例是使用VC++(Visual C++)编程环境,通过递归算法来绘制分形图形。 在"VC 递归法图形分形算法.rar"这个压缩包中,我们...
"递归出来的美丽分形世界"这一标题,暗示我们将探讨通过递归算法创建的分形图形。递归是编程中的一个重要技巧,它允许函数调用自身来解决复杂问题,而分形则是一种通过迭代和递归过程构建出的几何形状。 这篇博客...
牛顿分形是一种利用迭代函数系统根据牛顿迭代法生成的分形图案,该方法在图像艺术和设计领域具有广泛的应用价值。Matlab是一种功能强大的数学软件,特别适合进行算法开发和数据分析。本文探讨了如何利用Matlab软件...