分形

几何图形应用中有一种十分重要的应用——分形,分形图形虽然整体上看十分不规则,在小尺度上,图形又有一些规则性,整体看上去非常漂亮(像Koch曲线整体看上去就好像是雪花)! 在Java中,可以通过运用递归或迭代等的的思想实现分形。

Koch曲线(雪花)的绘制:

设想一个等边三角形,取每边中间的三分之一,接上去一个形状完全相似的但边长为其三分之一的三角形,结果是一个六角形。现在取六角形的每个边做同样的变换,即在中间三分之一接上更小的三角形,以此重复,直至无穷。外界的变得原来越细微曲折,形状接近理想化的雪花。

代码如下:

//界面类

package fengxing;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
 
public  class MainUI extends JFrame{
 private Graphics g;
 private int depth=1;
 public void showUI(){
  
  this.setTitle("分形");
  this.setSize(600,600);
  this.setLocationRelativeTo(null);
  this.setDefaultCloseOperation(3);
  
        this.setVisible(true);
  g=this.getGraphics();
  this.addMouseListener(mouse_listener);
   }
  public void change(double x1,double y1,double x2,double y2,int depth){
 
   if(depth<=1)
    g.drawLine((int)x1, (int)y1, (int)x2, (int)y2);
   else {
   
    double x3=2*x1/3+x2/3;
    double y3=2*y1/3+y2/3;
   
    double x4=x1/3+2*x2/3;
    double y4=y1/3+2*y2/3;
    
   double  x5=(x4+x3)/2+(y3-y4)*Math.sqrt (3)/2;
    double  y5=(y4+y3)/2+(x4-x3)*Math.sqrt (3)/2;

  
    change(x1,y1,x3,y3,depth-1);
    change(x3,y3,x5,y5,depth-1);
    change(x5,y5,x4,y4,depth-1);
    change(x4,y4,x2,y2,depth-1);
   
   }
 }
 
  public void paint(Graphics g){
   super.paint(g);
   change(300, 400-300*Math.sqrt (3)/2,150, 400,depth);
   change(150, 400,450, 400,depth);
   change(450,400,300, 400-300*Math.sqrt (3)/2,depth);
 }
  MouseAdapter mouse_listener=new MouseAdapter(){
  
   public void mouseClicked(MouseEvent e){
   
    int action=e.getButton();
   switch (action){
   case 1: depth++;
           repaint();
    break;
   case 3: depth--;
           repaint();
    break;
   }
   }
      };
 
}

//测试类

package fengxing;

public class Test{
 
 public static void main(String[] args){
  
      MainUI  ui =new MainUI();
      ui.showUI();
  
 }

}

 

运行结果:

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值