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

自己编写的谢冰尔斯基三角形虽然不似别人般简单,但是能出自于自己的自己的脑袋和双手,感觉还是很不错的,O(∩_∩)O~
[size=medium][color=blue]我的代码:[/color][/size]
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);
}
}

[size=medium][color=blue]别人的代码:[/color][/size]
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);
}
}
[color=blue][size=medium]编写**地毯(有很多正方形的)(递归调用)[/size][/color]
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);
}
}
[size=medium][color=blue]利用数学函数编写的一些漂亮的图形:[/color][/size]
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+" ");

}

}
}
[size=medium][color=blue]图四函数:[/color][/size]
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+" ");

}
}
[size=medium][color=blue]图五函数:[/color][/size]
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;
}

}
[size=medium][color=blue]图六函数:[/color][/size]
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;
}
}
[size=medium][color=blue]图七函数:[/color][/size]
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;
}
}
上面的这些图形是不是很漂亮呢,有了方法,我们可以做出更多更漂亮的哦!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值