对于分形,我的理解就是:由小元件组成整体,然后再用另一或相同整体替换元件形成的循环迭代图形。
下面以谢尔平斯基三角形为例,介绍下最简单的分形思路。
第一步,先构造一个正三角形,取正三角形三边中点并连线,形成一个内置倒三角形,然后把周围3个三角形又分别作为一个基元重复上述操作,多迭代几次就成了第三个图的样子。
界面初始代码如下:
import java.awt.Graphics; import javax.swing.JFrame; //谢尔宾斯基三角形 public class DrawPanel extends JFrame{ /** * 程序的入口主函数 */ public static void main(String[] args) { //实例化DrawPanel类 DrawPanel dp = new DrawPanel(); //调用初始化界面的方法 dp.initUI(); } private void initUI() { // 设置界面基础属性 this.setName("分形"); this.setSize(500, 500); this.setDefaultCloseOperation(3); this.setLocationRelativeTo(null); this.setVisible(true); Graphics g = this.getGraphics(); MListener ml = new MListener(g); this.addMouseListener(ml); } }
实现画谢尔宾斯基的鼠标监听器类:
import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.Random; //谢尔宾斯基三角形 public class MListener implements MouseListener { int x1, y1, x2, y2, x3, y3, length; int count = 6; //控制递归次数 int c1,c2,c3; Graphics g; /** * 覆写构造方法,传递画布 * @param g 传递的画布 */ public MListener(Graphics g) { this.g = g; } /** * 按下鼠标,求出第三个顶点坐标,画出初始三角形,并调用draw方法 */ public void mousePressed(MouseEvent e) { g.clearRect(0, 0,1024, 1024); // 单击鼠标时,获得三点坐标,并完成递归调用 System.out.println("单击"); // 实例化一个随机数对象 Random rd = new Random(); //随机确定第一个顶点坐标和边长 x1 = rd.nextInt(500); y1 = rd.nextInt(500); length=rd.nextInt(600); //确定颜色变量 c1=rd.nextInt(256); c2=rd.nextInt(256); c3=rd.nextInt(256); // 计算第二、三个点坐标 x2 = x1 + length; y2 = y1; x3 = (x1 + x2) / 2; y3 = (int) (y1 - length * Math.sqrt(3.0) / 2); //设置颜色 g.setColor(new Color(c1,c2,c3)); //画三角形三边 g.drawLine(x1, y1, x2, y2); g.drawLine(x1, y1, x3, y3); g.drawLine(x3, y3, x2, y2); //将三个顶点传入draw方法 this.draw(count, x1, y1, x2, y2, x3, y3); } /** * 递归在三角形中画三角形的方法,取三边中点连线画出新三角形,又把周围三个三角形作为迭代变量 * @param count 递归次数控制变量 * @param x1 * @param y1 * @param x2 * @param y2 * @param x3 * @param y3 进行递归的三角形三个顶点的纵横坐标 */ public void draw(int count, int x1, int y1, int x2, int y2, int x3, int y3) { int x4, y4, x5, y5, x6, y6; if (count > 0) { count--; x4 = (x1 + x2) / 2; y4 = (y1 + y2) / 2; x5 = (x1 + x3) / 2; y5 = (y1 + y3) / 2; x6 = (x3 + x2) / 2; y6 = (y3 + y2) / 2; g.drawLine(x4, y4, x5, y5); g.drawLine(x4, y4, x6, y6); g.drawLine(x6, y6, x5, y5); this.draw(count, x1, y1, x4, y4, x5, y5); this.draw(count, x4, y4, x2, y2, x6, y6); this.draw(count, x5, y5, x6, y6, x3, y3); } else return; } public void mouseClicked(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } }
在此基础上还可以进行扩展:
扩展一:初始三角形可以是由随机的三个点连接而成的。只需将三个顶点的坐标设成随机数就好。
扩展二:谢尔宾斯基地毯与谢尔宾斯基三角形类似,先在大正方形中心画一个小正方形,再画中心正方形旁边八个正方形的中心正方形,如下图所示:
修改鼠标监听器类代码:
import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.Random; //谢尔宾斯基地毯 public class MListener implements MouseListener{ int x1,y1,length; int count =6;//递归控制变量 int c1,c2,c3; Graphics g; /** * 覆写构造方法,传递画布 * @param g 传递的画布 */ public MListener(Graphics g){ this.g=g; } /** * 按下鼠标,获得随机左上顶点坐标和最外层正方形边长,并调用draw方法 */ public void mousePressed(MouseEvent e) { g.clearRect(0, 0, 1000, 1000); //单击鼠标时,获得三点坐标,并完成递归调用 System.out.println("单击"); //实例化一个随机数对象 Random rd = new Random(); x1=rd.nextInt(500); y1=rd.nextInt(500); length=rd.nextInt(600); c1=rd.nextInt(256); c2=rd.nextInt(256); c3=rd.nextInt(256); this.draw(count, x1, y1, length); } /** * 每次迭代要实现的过程,画正中间的实心正方形,取周边8个正方形的顶点,进行迭代 * @param count 控制迭代次数 * @param x1 迭代单位正方形的左上顶点横坐标 * @param y1 迭代单位正方形的左上顶点纵坐标 * @param length正方形边长 */ public void draw(int count,int x1,int y1,int length){ int x2,y2,x3,y3,length2; int x4,y4,x5,y5,x6,y6; int x7,y7,x8,y8,x9,y9; if(count>0){ count--; //画中间实心正方形 length2=length/3; x2=x1+length2; y2=y1+length2; g.setColor(new Color(c1,c2,c3)); g.fillRect(x2, y2, length2, length2); //获得要迭代的其余八个正方形的起点坐标 x3=x1+length2; y3=y1; x4=x1+2*length2; y4=y1; x5=x1; y5=y1+length2; x6=x1+2*length2; y6=y1+length2; x7=x1; y7=y1+2*length2; x8=x1+length2; y8=y1+2*length2; x9=x1+2*length2; y9=y1+2*length2; //对周边的八个正方形进行迭代操作 this.draw(count, x1, y1, length2); this.draw(count, x3, y3, length2); this.draw(count, x4, y4, length2); this.draw(count, x5, y5, length2); this.draw(count, x6, y6, length2); this.draw(count, x7, y7, length2); this.draw(count, x8, y8, length2); this.draw(count, x9, y9, length2); } else return; } public void mouseClicked(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } }
同谢尔宾斯基三角形类似,地毯也可以是长方形的。增加代表长和宽的参数即可。
相关推荐
在探索谢尔宾斯基三角形的过程中,还可以进一步研究和扩展到其他分形结构,如谢尔宾斯基地毯或Mandelbrot集,以及研究它们在物理、生物、信息科学等领域的应用。这不仅是对数学理论的深入探究,也是对计算机图形学和...
`sierpinski.m`脚本很可能是用于生成和绘制谢尔宾斯基三角形的代码,用户可以调整迭代次数以观察不同阶段的形态。 3. **Sierpinski地毯与分形维数** (fd_sierp.m) `fd_sierp.m`可能用于计算另一种分形——...
2. **迭代函数系统(IFS)**:IFS是一种构建分形图形的方法,通过一系列的线性或非线性映射迭代生成复杂的自相似结构,如科赫曲线、谢尔宾斯基三角形等。 3. **曼德勃罗集(Mandelbrot Set)和朱利亚集(Julia Set...
Menger-Sponge
Sierpinski地毯,也称为谢尔宾斯基地毯,是分形几何中的一个经典例子,由波兰数学家Wacław Sierpiński在1916年提出。它是一种无限递归构造,常用于计算机图形学领域,用以展示自相似性和分形的特性。在计算机图形...
在这个“Java分形程序”中,我们主要关注三个方面的内容:雪花图形、Sierpinski地毯和一元二次方程的解空间。 1. **雪花图形**: 雪花图形是一种典型的分形几何体,通过迭代算法生成。在Java程序中,我们可以利用...
"谢尔宾斯基式分形"则是指以数学家谢尔宾斯基的名字命名的一种经典分形,通常指的是谢尔宾斯基三角形或谢尔宾斯基地毯。这些分形通过将大形状不断分割成更小的相同形状来构建,呈现出无穷的细节和自相似性。在本项目...
2. **谢尔宾斯基三角形**:同样是一个二维分形,它的构造方法是将一个等边三角形划分为4个较小的等边三角形,然后删除中间的一个,对剩下的三角形重复这个过程。谢尔宾斯基三角形也是自相似的,并且其内部没有边界,...
3. `ifs_sierpinski_gasket.mq5` 和 `ifs_sierpinski_carpet.mq5`:这两个文件分别对应于著名的谢尔宾斯基三角形(Sierpinski Gasket)和谢尔宾斯基地毯(Sierpinski Carpet)。这两个都是典型的分形结构,通过迭代...
这个文件名没有明确指示它实现的是哪种分形,但它可能是另一种经典分形,比如科赫曲线、谢尔宾斯基三角形或者Sierpinski地毯。这些分形通过简单的迭代规则生成,每次迭代都将图形的每个线段替换为更复杂的结构,从而...
3. **其他Sierpinski变体**:sierpinsky2.caml和sierpinsky3.caml可能是对谢尔宾斯基三角形不同变体的实现,或者可能是对谢尔宾斯基地毯或其他类似分形的建模。 4. **IP.caml**:这个文件名没有明显的直观含义,但...
它是一种无限递归构造,类似于谢尔宾斯基三角形,但其基本单元是正方形而不是三角形。在计算机图形学和编程领域,实现谢尔宾斯基地毯通常涉及到递归算法和图像处理技术。 在HTML中,虽然原生不支持复杂的图形绘制,...
Sierpinski三角形,又称为谢尔宾斯基三角,是一种经典的分形几何形状,以其无限自相似性而闻名。在MATLAB中实现Sierpinski三角形,可以通过递归算法或者图形对象的迭代删除来完成。下面我们将详细介绍这两种方法,并...
9. 谢尔宾斯基地毯问题涉及到分形几何,每次操作面积减少为原来的1/4,根据操作次数计算阴影三角形的面积之和。 10. 这个问题是关于火柴棒构成的“H”形状,需要找出每增加一个“H”所需火柴棒数量的变化规律。 11...
4. **分形生成算法**:详细讲解生成各种经典分形的数学算法,如科赫曲线、谢尔宾斯基三角形、Sierpinski地毯等。 5. **交互式图形**:如果包含HTML文件,可能涉及到使用WebAppBuilder或其他工具将MATLAB图形嵌入...