照样废话不说,看代码看注释
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); //递归画出左边中间那一个矩形 } } }
。。。嘿嘿
相关推荐
在探索谢尔宾斯基三角形的过程中,还可以进一步研究和扩展到其他分形结构,如谢尔宾斯基地毯或Mandelbrot集,以及研究它们在物理、生物、信息科学等领域的应用。这不仅是对数学理论的深入探究,也是对计算机图形学和...
通常,雪花图形基于 Koch 曲线构建,每次迭代时将直线段分成三等份,中间一段替换为45度角的两个等边三角形。通过多次迭代,可以创建出具有自相似性的复杂图案,表现出分形的特性。 2. **Sierpinski地毯**: ...
Menger-Sponge
【谢尔宾斯基地毯在画布上的实现】 谢尔宾斯基地毯是数学中一个著名的分形几何图形,由波兰数学家瓦茨瓦夫·谢尔宾斯基在20世纪初提出。它是一种无限递归构造,类似于谢尔宾斯基三角形,但其基本单元是正方形而不是...
Sierpinski地毯,也称为谢尔宾斯基地毯,是分形几何中的一个经典例子,由波兰数学家Wacław Sierpiński在1916年提出。它是一种无限递归构造,常用于计算机图形学领域,用以展示自相似性和分形的特性。在计算机图形...
Sierpinski三角形,又称为谢尔宾斯基三角,是一种经典的分形几何形状,以其无限自相似性而闻名。在MATLAB中实现Sierpinski三角形,可以通过递归算法或者图形对象的迭代删除来完成。下面我们将详细介绍这两种方法,并...
谢尔宾斯基地毯类似于三角形,但它是基于正方形的。在这个过程中,将一个正方形划分为9个相同的小正方形,移除中间的一个,然后对剩下的8个小正方形进行相同的操作。同样,通过Box Counting算法计算其分形维数,以...
"谢尔宾斯基式分形"则是指以数学家谢尔宾斯基的名字命名的一种经典分形,通常指的是谢尔宾斯基三角形或谢尔宾斯基地毯。这些分形通过将大形状不断分割成更小的相同形状来构建,呈现出无穷的细节和自相似性。在本项目...
9. 谢尔宾斯基地毯问题涉及到分形几何,每次操作面积减少为原来的1/4,根据操作次数计算阴影三角形的面积之和。 10. 这个问题是关于火柴棒构成的“H”形状,需要找出每增加一个“H”所需火柴棒数量的变化规律。 11...
3. **其他Sierpinski变体**:sierpinsky2.caml和sierpinsky3.caml可能是对谢尔宾斯基三角形不同变体的实现,或者可能是对谢尔宾斯基地毯或其他类似分形的建模。 4. **IP.caml**:这个文件名没有明显的直观含义,但...
2. **谢尔宾斯基三角形**:同样是一个二维分形,它的构造方法是将一个等边三角形划分为4个较小的等边三角形,然后删除中间的一个,对剩下的三角形重复这个过程。谢尔宾斯基三角形也是自相似的,并且其内部没有边界,...
3. `ifs_sierpinski_gasket.mq5` 和 `ifs_sierpinski_carpet.mq5`:这两个文件分别对应于著名的谢尔宾斯基三角形(Sierpinski Gasket)和谢尔宾斯基地毯(Sierpinski Carpet)。这两个都是典型的分形结构,通过迭代...
2. **迭代函数系统(IFS)**:IFS是一种构建分形图形的方法,通过一系列的线性或非线性映射迭代生成复杂的自相似结构,如科赫曲线、谢尔宾斯基三角形等。 3. **曼德勃罗集(Mandelbrot Set)和朱利亚集(Julia Set...
这个文件名没有明确指示它实现的是哪种分形,但它可能是另一种经典分形,比如科赫曲线、谢尔宾斯基三角形或者Sierpinski地毯。这些分形通过简单的迭代规则生成,每次迭代都将图形的每个线段替换为更复杂的结构,从而...
4. **分形生成算法**:详细讲解生成各种经典分形的数学算法,如科赫曲线、谢尔宾斯基三角形、Sierpinski地毯等。 5. **交互式图形**:如果包含HTML文件,可能涉及到使用WebAppBuilder或其他工具将MATLAB图形嵌入...