照样废话不说,看代码看注释
import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Toolkit; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JPanel; /** *通过递归画出谢尔宾斯基地毯 * @author LONG * */ public class Retc extends JFrame { /** * */ private Dimension di = null; //声明Dimension类型的变量,来储存屏幕的尺寸 private Graphics gr = null; //声明画布类型变量,来储存面板的画布对象 private boolean isSuccessful = true; //用来判断最外面的边框是否已经连接 private static final long serialVersionUID = 1L; /** * 程序主函数 * @param args */ public static void main(String[] args){ Retc ke = new Retc(); ke.showFrame(); } /** * 展示窗体,设置窗体的函数,包括得到画布和添加监听器等 */ public void showFrame(){ this.setTitle("谢尔宾斯基地毯"); Toolkit tl = Toolkit.getDefaultToolkit(); //得到工具箱 di = tl.getScreenSize(); //得到屏幕尺寸 this.setSize(di.width,di.height); //设置窗体大小,和屏幕大小一样 this.setDefaultCloseOperation(3); //设置窗体退出时关闭 JPanel jp_draw = new JPanel(); //创建绘画时会用到的面板 jp_draw.setPreferredSize(new Dimension(di.width,di.height)); //设置面板的大小和窗体的大小一样 jp_draw.setBackground(Color.WHITE); //将背景色设为白色 this.setResizable(false); //不可改变窗体的大小 this.add(jp_draw); //将面板添加到窗体上 this.setVisible(true); //将窗体可视化,然后再得到画布 gr = jp_draw.getGraphics(); //得到面板上的画布对象 jp_draw.addMouseListener(new MouseAdapter(){ //给面板添加鼠标监听器 public void mousePressed(MouseEvent e){ doSomething(); //调用初始化的函数 } }); } /** * 初始化整个窗体,因为在调用递归时有差别,所以单独列出来 */ public void doSomething(){ draw(0,0,di.width,di.height); } /** * 用于实现递归的函数 * @param x1 矩形块的左上角x坐标 * @param y1 矩形块的左上角y坐标 * @param x2 矩形块的右下角x坐标 * @param y2 矩形块的右下角y坐标 */ public void draw(int x1,int y1,int x2,int y2){ //为了清楚看见进行的过程,使用线程控制 try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } //判断语句,来判断是否已经将最外面的边框连接起来,如果已经连接,则让isSuccessful为false if(isSuccessful){ gr.drawLine(x1, y1, x1, y2); gr.drawLine(x1, y1, x2, y1); gr.drawLine(x1, y2, x2, y2); gr.drawLine(x2, y1, x2, y2); isSuccessful = false; } //用来终止递归的判断条件,通过判断矩形两个对角的横坐标之差是否大于10个像素,如果小于等于,则终止 //如果不进行终止,则会出现栈溢错误 if(Math.abs(x2 - x1) > 10){ int p_x1 = (x2 - x1)/3 + x1; //计算得到矩形上边三分之一处的x坐标 int p_y1 = y1; //计算得到矩形上边三分之一处的y坐标 int p_x2 = (x2 - x1)*2/3 + x1; //计算得到矩形上边三分之二处的x坐标 int p_y2 = y1; //计算得到矩形上边三分之二处的y坐标 int p_x3 = x2; //计算得到矩形右边三分之一处的x坐标,和x2的x坐标相同 int p_y3 = (y2 - y1)/3 + y1; //计算得到矩形右边三分之一处的y坐标 int p_x4 = x2; //计算得到矩形右边三分之二处的x坐标 int p_y4 = (y2 - y1)*2/3 + y1; //计算得到矩形右边三分之二处的y坐标 //连接上面得到和可以推出的点,将原来的矩形分为九块 gr.drawLine(p_x1, p_y1, p_x1, y2); gr.drawLine(p_x2, p_y2, p_x2, y2); gr.drawLine(p_x3, p_y3, x1, p_y3); gr.drawLine(p_x4, p_y4, x1, p_y4); //将中心处的矩形填充起来,为了绚烂用随机颜色 gr.setColor(new Color((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255))); gr.fillRect(p_x1, p_y3, Math.abs(p_x2 - p_x1), Math.abs(p_y4 - p_y3)); draw(x1,y1,p_x1,p_y3); //递归画出左上角第一个 draw(p_x1,p_y1,p_x2,p_y3); //递归画出上边中间那个矩型 draw(p_x2,p_y2,p_x3,p_y3); //递归画出右上角的那个矩形 draw(p_x2,p_y3,p_x4,p_y4); //递归画出右边中间那一个 draw(p_x2,p_y4,x2,y2); //递归画出右下角那一个矩形 draw(p_x1,p_y4,p_x2,y2); //递归画出下面中间那一个 draw(x1,p_y4,p_x1,y2); //递归画出左下角那一个矩形 draw(x1,p_y3,p_x1,p_y4); //递归画出左边中间那一个矩形 } } }
。。。嘿嘿
相关推荐
谢尔宾斯基三角形,别的写的,和大家分享下哈!
代码是基于VS2015编写的,如果你的IDE高于此版本双击.sln文件...代码编译成功运行之后:先用鼠标在界面里面左键单击选择三个点作为三角形的顶点,然后双击界面即可迭代生成一次分形,再次双击即可迭代两次,以此类推
谢尔宾斯基分形发生器
谢尔宾斯基三角形(英语:Sierpinski triangle)是一种分形,由波兰数学家谢尔宾斯基在1915年提出。它是自相似集的例子。它的豪斯多夫维是log(3)/log(2) ≈ 1.585
我们没有使用经典的康托迭代算法,而是引入了一种细胞自动化方法来构建谢尔宾斯基三角形,它简单、直接、神奇。
L系统_重写系统_希尔伯特曲线_谢尔宾斯基三角形_科赫曲线_雪花曲线
主要介绍了python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形) ,需要的朋友可以参考下
其中包含了两种Sierpinski地毯的画法,递归法和IFS法
绘制谢尔宾斯基三角形(1).py
谢尔宾斯基-p5js 递归绘制谢尔宾斯基三角形分形。 (一个 C++ 项目的 p5.js 重构)
该站点使用 JQuery 滑块来获得所需的谢尔宾斯基三角形复杂度级别,从 1(只有一个等边三角形)到 9 级深。 然后递归函数绘制分形图案。 基本情况是单个等边三角形,函数调用自身在这些三角形内绘制更多三角形。 ...
分形图-谢尔宾斯基三角形-彩色
绘制谢尔宾斯基三角形 import turtle # 绘制单个三角形 # [[x1,y1], [x2,y2], [x3,y3]] def draw_triangle(points, color, t): t.fillcolor(color) t.up() # 将画笔移动到第一个点 t.goto(points[0][0], points...
计算机图形学 WebGL 课程作业-扭曲的三角形,谢尔宾斯基三角形随机,递归,四面体,球面,俄罗斯方块+源代码+文档说明 - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是...
opengl实现分形三角形,可以输入三角形的长度
Menger-Sponge
谢尔宾斯基的三角区: : 建立目录 光盘进入 克隆: git clone https://github.com/patrickstocklin/sierpinski-fractal-triangle 将Sierpinski.html的路径粘贴到您首选的Web浏览器中 分形! 您可以通过打开...
这是一个用Java写的分形程序,包括雪花图形、Sierpinski地毯还有一元二次方程的实数根和复数跟的解空间四个图形。
谢尔宾斯基像这样创建谢尔宾斯基三角形(▲)
如果采用具有 2^n^ 行的帕斯卡三角形并将偶数着色为白色,奇数为黑色,则结果是谢尔宾斯基三角形的近似值。 更准确地说,当 n 接近这个奇偶色 2^n^ 行帕斯卡三角形的无穷大时,极限是谢尔宾斯基三角形。 当然,这为...