`
lazyee
  • 浏览: 15538 次
社区版块
存档分类
最新评论

简单分形(谢尔宾斯基三角形和地毯)

    博客分类:
  • java
阅读更多

对于分形,我的理解就是:由小元件组成整体,然后再用另一或相同整体替换元件形成的循环迭代图形。
下面以谢尔平斯基三角形为例,介绍下最简单的分形思路。
第一步,先构造一个正三角形,取正三角形三边中点并连线,形成一个内置倒三角形,然后把周围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) {
		
	}

}

同谢尔宾斯基三角形类似,地毯也可以是长方形的。增加代表长和宽的参数即可。

 

  • 大小: 3.3 KB
  • 大小: 3.9 KB
  • 大小: 5.3 KB
  • 大小: 2.3 KB
  • 大小: 3.2 KB
  • 大小: 6.7 KB
分享到:
评论

相关推荐

    谢尔宾斯基三角形:分形谢尔宾斯基-matlab开发

    在探索谢尔宾斯基三角形的过程中,还可以进一步研究和扩展到其他分形结构,如谢尔宾斯基地毯或Mandelbrot集,以及研究它们在物理、生物、信息科学等领域的应用。这不仅是对数学理论的深入探究,也是对计算机图形学和...

    很好用的分形计算,里面还有验证的程序。我一直在用,推荐给大家

    `sierpinski.m`脚本很可能是用于生成和绘制谢尔宾斯基三角形的代码,用户可以调整迭代次数以观察不同阶段的形态。 3. **Sierpinski地毯与分形维数** (fd_sierp.m) `fd_sierp.m`可能用于计算另一种分形——...

    fenxing.rar_matlab分形_分形_分形 matlab_分形分析_分形计算 matlab

    2. **迭代函数系统(IFS)**:IFS是一种构建分形图形的方法,通过一系列的线性或非线性映射迭代生成复杂的自相似结构,如科赫曲线、谢尔宾斯基三角形等。 3. **曼德勃罗集(Mandelbrot Set)和朱利亚集(Julia Set...

    Menger-Sponge

    Menger-Sponge

    Sierpinski地毯算法

    Sierpinski地毯,也称为谢尔宾斯基地毯,是分形几何中的一个经典例子,由波兰数学家Wacław Sierpiński在1916年提出。它是一种无限递归构造,常用于计算机图形学领域,用以展示自相似性和分形的特性。在计算机图形...

    Java分形程序--雪花&&Sierpinski地毯&&一元二次方程的解空间

    在这个“Java分形程序”中,我们主要关注三个方面的内容:雪花图形、Sierpinski地毯和一元二次方程的解空间。 1. **雪花图形**: 雪花图形是一种典型的分形几何体,通过迭代算法生成。在Java程序中,我们可以利用...

    Icosahedral fractal IFS:Icosahedral fractal IFS 谢尔宾斯基式分形-matlab开发

    "谢尔宾斯基式分形"则是指以数学家谢尔宾斯基的名字命名的一种经典分形,通常指的是谢尔宾斯基三角形或谢尔宾斯基地毯。这些分形通过将大形状不断分割成更小的相同形状来构建,呈现出无穷的细节和自相似性。在本项目...

    简单分形

    2. **谢尔宾斯基三角形**:同样是一个二维分形,它的构造方法是将一个等边三角形划分为4个较小的等边三角形,然后删除中间的一个,对剩下的三角形重复这个过程。谢尔宾斯基三角形也是自相似的,并且其内部没有边界,...

    在 MQL5 中使用 Iterated Function Systems (IFS - 迭代函数系统) 创建分形 - MetaTrader 5EA.zip

    3. `ifs_sierpinski_gasket.mq5` 和 `ifs_sierpinski_carpet.mq5`:这两个文件分别对应于著名的谢尔宾斯基三角形(Sierpinski Gasket)和谢尔宾斯基地毯(Sierpinski Carpet)。这两个都是典型的分形结构,通过迭代...

    MATLAB.rar_分形几何_matlab_

    这个文件名没有明确指示它实现的是哪种分形,但它可能是另一种经典分形,比如科赫曲线、谢尔宾斯基三角形或者Sierpinski地毯。这些分形通过简单的迭代规则生成,每次迭代都将图形的每个线段替换为更复杂的结构,从而...

    CAML-开源

    3. **其他Sierpinski变体**:sierpinsky2.caml和sierpinsky3.caml可能是对谢尔宾斯基三角形不同变体的实现,或者可能是对谢尔宾斯基地毯或其他类似分形的建模。 4. **IP.caml**:这个文件名没有明显的直观含义,但...

    sierpinski:Sierpinski地毯在画布上

    它是一种无限递归构造,类似于谢尔宾斯基三角形,但其基本单元是正方形而不是三角形。在计算机图形学和编程领域,实现谢尔宾斯基地毯通常涉及到递归算法和图像处理技术。 在HTML中,虽然原生不支持复杂的图形绘制,...

    Sierpinski matlab实现

    Sierpinski三角形,又称为谢尔宾斯基三角,是一种经典的分形几何形状,以其无限自相似性而闻名。在MATLAB中实现Sierpinski三角形,可以通过递归算法或者图形对象的迭代删除来完成。下面我们将详细介绍这两种方法,并...

    中考数学试卷分类汇编:规律型图形的变化类2精选.doc

    9. 谢尔宾斯基地毯问题涉及到分形几何,每次操作面积减少为原来的1/4,根据操作次数计算阴影三角形的面积之和。 10. 这个问题是关于火柴棒构成的“H”形状,需要找出每增加一个“H”所需火柴棒数量的变化规律。 11...

    Fractals:MATLAB项目

    4. **分形生成算法**:详细讲解生成各种经典分形的数学算法,如科赫曲线、谢尔宾斯基三角形、Sierpinski地毯等。 5. **交互式图形**:如果包含HTML文件,可能涉及到使用WebAppBuilder或其他工具将MATLAB图形嵌入...

Global site tag (gtag.js) - Google Analytics