`

分形递归画图案图片DIY

    博客分类:
  • JAVA
阅读更多

                                    递归,用最少的代码量完成最大的工作量,初步对递归开始上心是因为机试老师给了一道题,看到后开始着急忙慌就开始做,最后那个代码量,就不忍吐槽了,自己还觉得挺自豪的,写了那么多行代码,也打印出了正确图形,蠢话,结果老师一公布他的答案,和我几百行的代码相比老师只用了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);
 	}



        
     }

 

 

  • 大小: 31.7 KB
  • 大小: 32.9 KB
2
0
分享到:
评论

相关推荐

    分形递归算法实现分叉树

    分形递归算法是一种在计算机科学中广泛应用的数学方法,特别是在图形生成、图像处理和复杂系统建模等领域。分形,简单来说,是指那些在不同尺度上具有自相似性的几何形状或模式。它们通常展现出无穷的细节,即使放大...

    分形图案 奇妙的递归

    分形图案,是一种在自然界和...无论是Koch曲线还是Sierpinski三角形,它们都展示了分形图案的无限魅力和递归构造的强大能力。在现代科技中,分形理论已深入到各个领域,从艺术设计到科学研究,无一不彰显其深远的影响。

    分形递归树的森林景观实时模拟方法

    ### 分形递归树的森林景观实时模拟方法 #### 一、引言 随着计算机图形学的发展,如何高效地模拟大规模自然场景成为了该领域的重要课题之一。这些场景不仅包括简单的地形地貌,更涉及复杂的森林景观。森林景观由...

    递归分形树之动画实现

    递归分形树的实现是基于数学和编程技术,特别是递归算法的应用。递归是一种解决问题的方法,它通过将问题分解为更小的子问题来解决原问题。在分形树的上下文中,递归意味着每个树干会分成若干个更细的分支,这些分支...

    通过递归实现分形图形绘制

    本项目标题“通过递归实现分形图形绘制”旨在教给初学者如何利用递归方法创建出美丽的分形图形。在VS2015环境下,你可以通过这个项目学习到如何设置和编译C++项目,并了解递归在实际编程中的应用。 首先,我们需要...

    递归画分形(cantor,kock,siepinski)

    在计算机图形学中,这种算法可以用来生成复杂的图形,并且随着迭代次数增加,细节会越来越丰富,形成美丽的分形图案。这些分形不仅在理论上引人入胜,也常被用于艺术创作和视觉设计中,展示了数学与美学的完美结合。

    分形动画,分形技术,分形

    分形,源自希腊语“fraktal”,是一个数学概念,由数学家曼德勃罗(Benoit Mandelbrot)在20世纪70年代提出。它描述了一种具有自相似性的几何形状,无论在宏观还是微观层面上,都呈现出相同的结构模式。这种无限重复...

    VB6.0采用分形算法生成图案.rar

    VB6.0采用分形算法生成图案,本分形生成图形的程序可生成叶、树、雪花和三角图案。所谓分形,在数学上是指具有如下性质的一类图形:  1.具有无限的细节。具有无限的细节的意思是指这个图形无论如何放大,都无法...

    分形盒子递归法cpp

    用递归法求分形盒子使得输入一个n出先一个有规律的盒子,不断得扩大

    摇曳的递归分形树

    递归是实现分形的一种常见方法,通过重复应用相同的过程或函数,但每次应用时都对输入进行缩小或变换,从而创建复杂的结构。在计算机图形学中,递归分形树是一种用以模拟自然界中复杂树形结构的有效方式,尤其适用于...

    turtle-递归美学-分形树-draw_branch.rar

    在这个名为“turtle-递归美学-分形树-draw_branch.rar”的压缩包中,我们找到了一个名为`draw_branch.py`的文件,它展示了如何利用递归技术来创建美丽的分形树。分形是一种具有自相似性的几何形状,即无论在大尺度...

    (C#)分形动画应用程序

    毕达哥拉斯树是一种著名的分形图案,源于古希腊数学家毕达哥拉斯对比例和对称性的研究。在C#程序中,我们可以利用递归算法来生成这种分形。首先,我们需要定义一个基本的三角形结构,然后在每个小三角形的基础上,...

    HTML5 Canvas 实现鼠标响应式分形水杉树叶图案动画效果源码.zip

    在这个“HTML5 Canvas实现鼠标响应式分形水杉树叶图案动画效果源码.zip”压缩包中,我们可以预见到一个利用Canvas API创建的、能够根据鼠标位置动态变化的分形水杉树叶动画。 分形(Fractal)是一种具有自相似性的...

    e语言-易语言画分形图案简化版

    《易语言画分形图案简化版》是一款基于易语言编程的源码实例,它通过集成易语言的位图操作支持库以及调用操作系统API函数,实现了绘制分形图案的功能。这个程序旨在帮助初学者理解分形图形的生成原理,并提供了一个...

    递归分形树源码

    **递归分形树源码解析** 分形树是一种基于分形几何理论的图形,它通过重复应用相同或相似的规则来创建具有自相似性的树形结构。在计算机图形学中,递归算法常用于实现分形树的生成,因为它能够以简洁的方式描述复杂...

    VC 递归法图形分形算法.rar

    递归法是实现分形图形的一种常用方法,通过重复执行相同或相似的过程来生成复杂的结构。本实例是使用VC++(Visual C++)编程环境,通过递归算法来绘制分形图形。 在"VC 递归法图形分形算法.rar"这个压缩包中,我们...

    递归出来的美丽分形世界

    "递归出来的美丽分形世界"这一标题,暗示我们将探讨通过递归算法创建的分形图形。递归是编程中的一个重要技巧,它允许函数调用自身来解决复杂问题,而分形则是一种通过迭代和递归过程构建出的几何形状。 这篇博客...

    基于Matlab牛顿分形在丝绸图案设计中的应用.pdf

    牛顿分形是一种利用迭代函数系统根据牛顿迭代法生成的分形图案,该方法在图像艺术和设计领域具有广泛的应用价值。Matlab是一种功能强大的数学软件,特别适合进行算法开发和数据分析。本文探讨了如何利用Matlab软件...

Global site tag (gtag.js) - Google Analytics