`
Sunshineminyan
  • 浏览: 17713 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

分形:java编写谢冰尔斯基三角形(递归调用)和其他图形

 
阅读更多
自己编写的谢冰尔斯基三角形虽然不似别人般简单,但是能出自于自己的自己的脑袋和双手,感觉还是很不错的,O(∩_∩)O~
我的代码:
package Fractal;
//递归调用
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Triang extends JPanel{
private Graphics g;
private int x1,x2,x3,y1,y2,y3;

private int x11;
private int x22;
private int x33;
private int y11;
private int y22;
private int y33;
public static void main(String[] args) {
Triang t=new Triang();
t.initUI();
}

public void initUI(){
//实例化一个JFrame类的对象
JFrame jf=new JFrame("谢冰尔斯基三角形");
jf.setDefaultCloseOperation(3);//关闭程序并退出
jf.setLocation(200,20);//设置对象的位置
jf.setSize(new Dimension(760, 600));
jf.add(this,BorderLayout.CENTER);

jf.setVisible(true);
g=this.getGraphics();

}
//重绘操作,重写重绘方法
    public void paint(Graphics g){
super.paint(g);//调用父类的重绘方法
x1=380;x2=50;x3=710;y1=30;y2=550;y3=550;
x11=(x1+x2)/2;x22=(x3+x2)/2;x33=(x1+x3)/2;
    y11=(y1+y2)/2;y22=(y3+y2)/2;y33=(y1+y3)/2;
    triang(g);
triang(g,x1,x2,x3,y1,y2,y3,x11,x22,x33,y11,y22,y33,7);

    }
    //画出最大的外围三角形
    public void triang(Graphics g){
    g.setColor(Color.RED);
    g.drawLine(x1, y1, x2, y2);
    g.drawLine(x1, y1, x3, y3);
    g.drawLine(x3, y3, x2, y2);
    }
    //递归方法
    public void triang(Graphics g,int x1,int x2,int x3,int y1,int y2,int y3,
    int x11,int x22,int x33,int y11,int y22,int y33 ,int t){
t--;
    if(t==0){
    return ;
    }
    //中间三角形
    Color c=new Color(x11%225,y11%225,x22%225);
    g.setColor(c);
    g.drawLine(x11, y11, x22, y22);
    g.drawLine(x11, y11, x33, y33);
    g.drawLine(x33, y33, x22, y22);
    int xa1=(x1+x11)/2;
    int xc1=(x1+x33)/2;
    int xb1=(x11+x33)/2;
    int ya1=(y1+y11)/2;
    int yc1=(y1+y33)/2;
    int yb1=(y11+y33)/2;
    //上面三角形
    g.setColor(c);
    g.drawLine(xa1, ya1, xb1, yb1);
    g.drawLine(xb1, yb1, xc1, yc1);
    g.drawLine(xa1, ya1, xc1, yc1);
    int xa2=(x2+x22)/2;
    int xb2=(x11+x22)/2;
    int xc2=(x11+x2)/2;
    int ya2=(y2+y22)/2;
    int yb2=(y11+y22)/2;
    int yc2=(y11+y2)/2;
    //左边三角形
    g.setColor(c);
    g.drawLine(xa2, ya2, xb2, yb2);
    g.drawLine(xb2, yb2, xc2, yc2);
    g.drawLine(xa2, ya2, xc2, yc2);
    int xa3=(x3+x22)/2;
    int xc3=(x22+x33)/2;
    int xb3=(x33+x3)/2;
    int ya3=(y3+y22)/2;
    int yc3=(y22+y33)/2;
    int yb3=(y33+y3)/2;
    //右边三角形
    g.setColor(c);
    g.drawLine(xa3, ya3, xb3, yb3);
    g.drawLine(xb3, yb3, xc3, yc3);
    g.drawLine(xa3, ya3, xc3, yc3);
    //变量的顺序一定不能错(顺时针或逆时针)
    triang(g,x1, x11, x33,y1,y11,y33,xa1,xb1,xc1,ya1,yb1,yc1,t);
    triang(g,x2, x22, x11,y2,y22,y11,xa2,xb2,xc2,ya2,yb2,yc2,t);
    triang(g,x22, x3, x33,y22,y3,y33,xa3,xb3,xc3,ya3,yb3,yc3,t);
    }
}

别人的代码:
import java.awt.Graphics;  
import java.awt.event.ActionEvent;  
import java.awt.event.ActionListener;  
import java.awt.event.MouseEvent;  
import java.awt.event.MouseListener;  
 
public class AListener implements ActionListener {  
    private Graphics g;  
    int x1,y1,x2,y2,x3,y3;  
    //int count=10;  
      
    public AListener (Graphics g){  
        this.g=g;  
        }  
     public void actionPerformed(ActionEvent e){  
          
         draw(e);  
     }  
     public void draw(ActionEvent e){  
         x1=100;  
         y1=500;  
         x2=400;  
         y2=500;  
         drawDiGui(x1,y1,x2,y2,10);  
           
     }  
     public void drawDiGui(int x1,int y1,int x2,int y2,int t){  
         t--;  
         if(t>0){  
            x3=(int)Math.abs(x1+x2)/2;  
            y3=(int)Math.abs(y2-Math.sqrt(3)*(x2-x1)/2);  
            g.drawLine(x1, y1, x2, y2);  
            g.drawLine(x1, y1, x3, y3);  
            g.drawLine(x2, y2, x3, y3);  
              
             int x11=(x1+x2)/2;  
             int y11=(y1+y2)/2;  
             int x22=(x3+x2)/2;  
             int y22=(y3+y2)/2;  
             int x33=(x1+x3)/2;  
             int y33=(y1+y3)/2;  
             g.drawLine(x11, y11, x33, y33);  
             g.drawLine(x11, y11, x22, y22);  
             g.drawLine(x22, y22, x33, y33);  
             drawDiGui(x1,y1,x11,y11,t);  
            drawDiGui(x11,y11,x2,y2,t);  
            drawDiGui(x33,y33,x22,y22,t);  
        }      
        }  
        
}       
主函数:
import java.awt.FlowLayout;  
import java.awt.Graphics;  
 
import javax.swing.JButton;  
import javax.swing.JFrame;  
 
public class DrawingSan extends JFrame{  
    /* 
     * 创建对象并调用初始化函数 
     */ 
      
    public static void main(String []  args){  
        DrawingSan ds=new DrawingSan();  
        ds.initUI();  
    }  
    /** 
     * 定义初始化函数 
     */ 
    public void initUI(){  
        this.setSize(500,600);  
        this.setTitle("三角分形");  
        this.setDefaultCloseOperation(3);  
        this.setLocationRelativeTo(null);  
        this.setLayout(new FlowLayout());  
        this.setResizable(false);  
        this.setVisible(true);  
        JButton jbsanjiao=new JButton("三角");  
        this.add(jbsanjiao);  
        Graphics g=this.getGraphics();  
        AListener a2=new AListener(g);  
        jbsanjiao.addActionListener(a2);  
    }  

编写**地毯(有很多正方形的)(递归调用)
package Fractal;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Square extends JPanel{

private Graphics g;
public static void main(String[] args) {
Square s=new Square();
s.initUI();
}
private int x1=100;
private int y1=100;
private int x2=500;
private int y2=100;
private int x3=500;
private int y3=500;
private int x4=100;
private int y4=500;
private int w;
private int x11;
private int y11;

public void initUI(){
JFrame jf=new JFrame("直线");
jf.setDefaultCloseOperation(3);
jf.setLocation(200,20);//设置对象的位置
jf.setSize(new Dimension(760, 600));
jf.add(this,BorderLayout.CENTER);

jf.setVisible(true);
g=this.getGraphics();
}
//重绘操作,重写重绘方法
    public void paint(Graphics g){
super.paint(g);//调用父类的重绘方法
square(g);
square(g,x11,y11,w,5);

    }
public void square(Graphics g) {
//画出外围正方形边框
g.drawLine(x1, y1, x2, y2);
g.drawLine(x1, y1, x4, y4);
g.drawLine(x2, y2, x3, y3);
g.drawLine(x3, y3, x4, y4);
  x11=x1+(x2-x1)/3;
  y11=x1+(y4-y1)/3;
  w=(x2-x1)/3;
  g.setColor(Color.PINK);
  //画出中心正方形
g.fillRect(x11, y11, w, w);
}
public void square(Graphics g,int x11,int y11,int w,int t) {
t--;
if(t==0){
return;
}
   //逆时针写出中心正方形周围的8个小正方形
int xa1=x11-2*(w/3);
int ya1=y11-2*(w/3);
int wa=w/3;
Color c1=new Color(0,ya1%225,0);//添加颜色
g.setColor(c1);
g.fillRect(xa1, ya1, wa, wa);
int xa2=x11+w/3;
int ya2=ya1;
Color c2=new Color(0,ya2%225,0);
g.setColor(c2);
g.fillRect(xa2, ya2, wa, wa);
int xa3=x11+w+w/3;
int ya3=ya1;
Color c3=new Color(0,ya3%225,0);
g.setColor(c3);
g.fillRect(xa3, ya3, wa, wa);

int xa4=xa3;
int ya4=y11+w/3;
Color c4=new Color(0,ya4%225,0);
g.setColor(c4);
g.fillRect(xa4, ya4, wa, wa);
int xa5=xa3;
int ya5=y11+w+w/3;
Color c5=new Color(0,ya5%225,0);
g.setColor(c5);
g.fillRect(xa5, ya5, wa, wa);

int xa6=xa2;
int ya6=ya5;
Color c6=new Color(0,ya6%225,0);
g.setColor(c6);
g.fillRect(xa6, ya6, wa, wa);
int xa7=xa1;
int ya7=ya5;
Color c7=new Color(0,ya7%225,0);
g.setColor(c7);
g.fillRect(xa7, ya7, wa, wa);

int xa8=xa1;
int ya8=ya4;
Color c8=new Color(0,ya8%225,0);
g.setColor(c8);
g.fillRect(xa8, ya8, wa, wa);
//递归调用
square(g,xa1,ya1,wa,t);
square(g,xa2,ya2,wa,t);
square(g,xa3,ya3,wa,t);
square(g,xa4,ya4,wa,t);
square(g,xa5,ya5,wa,t);
square(g,xa6,ya6,wa,t);
    square(g,xa7,ya7,wa,t);
square(g,xa8,ya8,wa,t);
}
}
利用数学函数编写的一些漂亮的图形:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Homework extends JPanel {

private Graphics g;
public static void main(String[] args) {
Homework h=new Homework();
h.initUI();

}
public void initUI(){
//实例化一个JFrame类的对象
JFrame jf=new JFrame("3D效果");
jf.setDefaultCloseOperation(3);//关闭程序并退出
jf.setLocation(200,20);//设置对象的位置
jf.setSize(new Dimension(850, 730));
jf.add(this,BorderLayout.CENTER);
this.setBackground(Color.BLACK);

jf.setVisible(true);
g=this.getGraphics();

}
//重绘操作,重写重绘方法
    public void paint(Graphics g){
super.paint(g);//调用父类的重绘方法
Graphics2D g2=(Graphics2D) g;
   image(g2);
}
public void image(Graphics2D g2){
int tempx,tempy;
double a=1.5,b=-1.8,c= 1.6,d=0.9;
double nextx,nexty,x=0,y=0;
for(int i = 0;i<50000;i++){
Color cl1=new Color(220-(i/500)*2,(i/500)*2,(i/500)*2);
Color cl2=new Color((i/500)*2,(i/500)*2,220-(i/500)*2);
GradientPaint pa = new GradientPaint(0,20,
cl1,100,80,cl2,true);
g2.setPaint(pa);
nextx=Math.sin(a*y)+c*Math.cos(a*x);
nexty=Math.sin(b*x)+d*Math.cos(b*y);
tempx=(int)(nextx*150)+400;
tempy=(int)(nexty*150)+380;
g2.drawLine(tempx,tempy,tempx,tempy);

x=nextx;
y=nexty;

System.out.print(x+"   "+y+"   ");

}

}
}
图四函数:
public void image1(Graphics g){
int a=-2,b=-2,d=2,tempx,tempy;
double c= -1.2;
double nextx,nexty,x=0,y=0;
for(int i = 0;i<10000;i++){

nextx=Math.sin(a*y)-Math.cos(b*x);
nexty=Math.sin(c*x)-Math.cos(d*y);
tempx=(int)(nextx*100)+300;
tempy=(int)(nexty*100)+300;
g.drawLine(tempx,tempy,tempx,tempy);
x=nextx;
y=nexty;
System.out.print(x+"   "+y+"   ");

}
}
图五函数:
public void image2(Graphics g){
double a=1.40,b=1.56,c = 1.40,d=-6.56;
int tempx,tempy;
double nextx,nexty,x=0,y=0;
for(int i = 0;i<10000;i++){

nextx=d*Math.sin(a*x)-Math.sin(b*y);
nexty=c*Math.cos(a*x)+Math.cos(b*y);
tempx=(int)(nextx*30)+350;
tempy=(int)(nexty*30)+200;
g.drawLine(tempx,tempy,tempx,tempy);
x=nextx;
y=nexty;
}

}
图六函数:
public void image1(Graphics g){
double a = 0.4,nextx,nexty,x=0,y=0;
int b =1,c =0,tempx,tempy;
for(int i = 0;i<50000;i++){

nextx=y-Math.signum(x)*Math.sqrt(Math.abs(b*x-c));
nexty=a-x;
tempx=(int)(nextx*150)+350;
tempy=(int)(nexty*150)+180;
g.setColor(Color.BLUE);
g.drawLine(tempx,tempy,tempx,tempy);
x=nextx;
y=nexty;
}
}
图七函数:
public void image2(Graphics g){
double nextx,nexty,x=0,y=0;
int a = 1,b =4,c =60,tempx,tempy;
for(int i = 0;i<50000;i++){

nextx=y-Math.signum(x)*Math.sqrt(Math.abs(b*x-c));
nexty=a-x;
tempx=(int)(nextx*2)+350;
tempy=(int)(nexty*2)+250;
Random rand=new Random();
Color cl=new Color(rand.nextInt(255), rand.nextInt(255),rand.nextInt(255));
g.setColor(cl);
g.drawLine(tempx,tempy,tempx,tempy);
x=nextx;
y=nexty;
}
}
上面的这些图形是不是很漂亮呢,有了方法,我们可以做出更多更漂亮的哦!
  • 大小: 40.6 KB
  • 大小: 6.4 KB
  • 大小: 152.8 KB
  • 大小: 16.6 KB
  • 大小: 12.1 KB
  • 大小: 23.9 KB
  • 大小: 129.4 KB
分享到:
评论

相关推荐

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

    分形(Fractal)是一种在数学、艺术以及...通过阅读和运行这些文件,你可以更深入地理解和学习如何使用递归实现分形图形的绘制。同时,这也是一个很好的实践项目,可以帮助你将理论知识转化为实际操作,提升编程能力。

    python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)

    在本文中,我们将探讨如何使用turtle模块来绘制三种递归图形:螺旋、二叉树和谢尔宾斯基三角形。 1. **递归绘制螺旋** 螺旋图案是通过不断调整乌龟的前进距离和方向来实现的。在`draw_spiral`函数中,我们首先让...

    分形对象——形、机遇和维数.pdf

    分形对象——形、机遇和维数. 分形创始人的力作

    Java 分形几何图形源代码实例

    总之,Java 分形几何图形源代码实例是学习和探索分形几何的宝贵资源,它能帮助开发者掌握复数运算、迭代算法和图形绘制,同时也提供了一个观察数学美和自然界复杂性的窗口。通过深入研究和实践,你可以进一步提升...

    递归的应用:最简单分形图形实现

    本示例通过创建一个最简单的分形图形来阐述递归的概念和实现方式。 分形,简单来说,是一种自相似的几何形状,即无论放大多少倍,局部细节都与整体保持相似性。在分形图形的绘制中,递归是核心思想,因为每个小部分...

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

    在计算机科学领域,...通过这个实例,开发者不仅可以学习到递归算法的概念和应用,还可以掌握如何在C++中使用类和图形库来实现分形图形的绘制。这将有助于提高编程技能,并对计算机图形学和算法设计有更深入的理解。

    几种分形图形的制作,主要是用递归实现的

    在学习和分析这些源代码时,你可以深入理解递归算法如何应用于分形图形的创建,同时还可以了解如何在C++环境中组织和管理代码。通过调试和修改代码,你还可以探索不同的参数对最终分形图形的影响,进一步增强对分形...

    Java图形分形实例源码.rar

    因此,学习这部分源码可以帮助开发者提升在Java环境中进行图形界面设计和图形算法实现的能力。 文件名称"codesc.net"可能是项目或者代码仓库的名称,通常在解压后会包含一系列的Java源文件(.java),类文件(....

    分形算法JAVA实现

    在Java编程语言中实现分形算法,可以帮助开发者创建出复杂的自相似图形,这些图形在视觉上具有强烈的美感和结构规律。本资料包提供了丰富的学习资源,覆盖了从基础知识到高级应用的多个章节。 1. **分形理论基础**...

    递归出来的美丽分形世界

    递归是编程中的一个重要技巧,它允许函数调用自身来解决复杂问题,而分形则是一种通过迭代和递归过程构建出的几何形状。 这篇博客可能详细介绍了如何使用编程语言(如Python、Java或C++)来实现递归算法,生成著名...

    分形递归算法实现分叉树

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

    递归分形java

    本文档通过对给定的“递归分形java”程序的分析,详细解释了如何使用Java实现递归分形的绘制,包括程序结构、图形绘制逻辑以及用户交互的设计思路。递归分形不仅是一个有趣的编程实践项目,也是学习递归算法、图形...

    vc++实现分形三角形

    根据提供的信息,我们可以总结出以下关于“vc++实现分形三角形”的相关知识点: ...这种方法不仅适用于分形三角形,也可以扩展到其他类型的分形图案。此外,通过调整变换规则或参数,还可以探索更多不同的分形图形。

    分形算法与程序设计——Java实现

    分形(Fractal)是一种在自然界中广泛存在的几何形态,具有自相似性和复杂性,它在计算机图形学、图像处理、艺术创作等领域有着广泛应用。在编程中,分形算法是利用数学公式或迭代过程来生成这些图案的关键。本篇...

    FractalTree分形树java

    绘制一个简单的分形树: 如下图所示,先垂直绘制一根线段,然后在线段长度的三分之一处和三分之二处分别以固定夹角绘制另外两根线段,长度分别为原线段的2/3. 如此反复,直至线段长度小于某个较小的值。其中,线条...

    分形图案 奇妙的递归

    随着迭代次数的增加,图形内部会出现越来越多的小三角形空洞,形成一种无限递归的图案,展示了分形的自相似性。 分形图的自相似性意味着无论放大多少倍,局部的细节都与整体的形状相似。这种特性在自然界中无处不在...

    Java实现美丽的分形

    结合提供的标题"Java实现美丽的分形"和描述中的博客链接,我们可以推测这是一个关于利用Java创建分形图形的教程。 首先,我们需要理解分形的基本概念。分形是自然界中广泛存在的几何形状,如海岸线、云朵、雪花等。...

    Java实现的分形算法与程序设计

    通过Java实现分形算法不仅可以帮助我们更好地理解和探索分形的奇妙世界,还能为学习图形编程提供一个有趣且实用的切入点。随着技术的发展,未来还会有更多创新的方法和工具出现,使得分形技术在更多领域得到应用。

    经典的分形入门程序-Koch曲线的递归算法

    通过理解和实现Koch曲线的递归算法,不仅可以掌握分形的基础知识,也能对递归思想有更深的理解,这对于学习计算机图形学、算法设计等高级主题非常有益。 总之,Koch曲线的递归算法是理解分形概念的绝佳途径。通过...

    分形设计—java,html,c。100个实例

    1. **Java分形设计**:Java作为一种强大的面向对象编程语言,提供了丰富的图形库,如Java AWT和Swing,使得创建分形图形变得容易。例如,著名的曼德布罗集(Mandelbrot Set)和朱利亚集(Julia Set)可以通过复数...

Global site tag (gtag.js) - Google Analytics