`
wojiaolongyinong
  • 浏览: 74539 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

编写程序实现谢尔宾斯基三角形

    博客分类:
  • Java
阅读更多

废话不说,只看代码!嘻嘻。。。。

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 SanJiao extends JFrame {
	private static final long serialVersionUID = 1L;
	Dimension di = null;
	Graphics gr = null;
	JPanel jp = null;
	
	/**
	 * 主函数,程序的入口
	 * @param args
	 */
	public static void main(String[] args){
		SanJiao sj = new SanJiao();
		sj.showFrame();
	}
	
	/**
	 * 设置用来画出图形的面板
	 */
	public void showFrame(){
		
		this.setTitle("画图");
		Toolkit tl = Toolkit.getDefaultToolkit();
		di = tl.getScreenSize();
		this.setSize(di.width,di.height);
		this.setDefaultCloseOperation(3);
		
		jp = new JPanel();
		jp.setPreferredSize(new Dimension(600,400));
		this.add(jp);
		
		this.setResizable(false);
		jp.setBackground(Color.BLACK);
		
		this.setVisible(true);
		
		gr = jp.getGraphics();
		jp.addMouseListener(new MouseAdapter(){
			public void mousePressed(MouseEvent e){
				
			}
			public void mouseReleased(MouseEvent e){
				draw(e);
			}
		});
		
		/**
		 * 画出一个谢尔宾斯基三角形的准备工作,设置好显示的位置
		 */
	}
	public void draw(MouseEvent e){
		
		int x1 = di.width/4;
		int y1 = di.height*4/5;
		int x2 = di.width*3/4;
		int y2 = di.height*4/5;
		doSomething(x1,y1,x2,y2);
	}
	
	/**
	 * 最终用来递归的函数,来递归画出三角形
	 * @param x1	传入的左x坐标
	 * @param y1	传入的左y坐标
	 * @param x2	传入的右x坐标
	 * @param y2	传入的右y坐标
	 */
	public void doSomething(int x1,int y1,int x2,int y2){
		
		//控制线程,可以更清楚的看见递归执行的过程
		try {
			Thread.sleep(10);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		//设置控制条件为,最终画的三角形两底边的x坐标值之差大于10个像素
		if(Math.max(x2, x1) - Math.min(x2, x1) > 10){
			int x3 = (x1 + x2)/2;		//用来计算顶点坐标x值
			int y3 = (int)((y1 + y2)/2 - (Math.max(x2, x1) - Math.min(x2, x1))*Math.sqrt(3)/2);	//用来计算定点坐标的y值
			
			//为了绚丽一点,设置画笔颜色为随机色
			gr.setColor(new Color((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255)));
			
			//将三条边连接起来
			gr.drawLine(x1,y1,x2,y2);
			gr.drawLine(x1,y1,x3,y3);
			gr.drawLine(x2,y2,x3,y3);
			
			//得到三条边的中点坐标
			int c_x1 = (x1 + x2)/2;
			int c_y1 = (y1 + y2)/2;
			int c_x2 = (x1 + x3)/2;
			int c_y2 = (y1 + y3)/2;
			int c_x3 = (x2 + x3)/2;
			int c_y3 = (y2 + y3)/2;
			
			
			//在此处,递归时,先把一个画完,然后才会执行另外的一个,所以关键步骤是要明确终止递归的条件
			gr.drawLine(c_x1, c_y1, c_x2, c_y2);
			gr.drawLine(c_x1, c_y1, c_x3, c_y3);
			gr.drawLine(c_x2, c_y2, c_x3, c_y3);
			doSomething(x1,y1,c_x1,c_y1);
			doSomething(c_x1,c_y1,x2,y2);
			doSomething(c_x2,c_y2,c_x3,c_y3);
		}
		
	}
	

}

 

分享到:
评论
2 楼 wojiaolongyinong 2013-03-30  
jiranjiran 写道

。。。首评呀。。。这感动的。。。。啥话都不说了。。哈哈
1 楼 jiranjiran 2013-03-30  

相关推荐

    谢尔宾斯基三角形[分享]

    例如,给定的文件"1.cpp"可能是使用C++语言编写的一个程序,用于生成谢尔宾斯基三角形的图形。递归函数通常定义为接受一个表示当前三角形的参数,然后根据迭代次数对每个子三角形进行相同的操作。"1.exe"则可能是一...

    使用MFC实现的三角形分形(谢尔宾斯基三角形)

    代码是基于VS2015编写的,如果你的IDE高于此版本双击.sln文件即可打开 代码编译成功运行之后:先用鼠标在界面里面左键单击选择三个点作为三角形的顶点,然后双击界面即可迭代生成一次分形,再次双击即可迭代两次,...

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

    谢尔宾斯基三角形,又称为谢尔宾斯基海绵或Sierpinski三角,是一种经典的分形几何形状,由波兰数学家瓦茨瓦夫·谢尔宾斯基在1915年提出。分形是数学中一个独特的概念,它描述了一类具有自相似性的几何结构,即使放大...

    Sierpinski's Triangle-开源

    2. 编程语言:C++可能用于编写程序的核心算法,因为有msvcr80.dll和msvcp80.dll的引用。 3. 跨平台开发:使用wxWidgets库实现跨平台的用户界面,可以在不同操作系统上运行。 4. 图形库:SDL库用于图形渲染,帮助在...

    分形算法与程序设计——Visual Basic实现--光盘文件

    1. **分形基础**:首先,我们需要理解分形的基本概念,包括曼德勃罗集、 Julia集、科赫雪花、谢尔宾斯基三角形等经典分形。了解它们的几何特征和自相似性,以及如何通过数学公式来描述它们。 2. **Visual Basic ...

    Sierpinski:在浏览器中绘制Sierpinski三角形的简单脚本

    谢尔宾斯基javascript文件实现了一种简单的算法来生成Sierpinski三角形。 在浏览器中打开html文件,然后应显示三角形。 该算法基于以下事实:生成的三角形是一个以三角形顶点为中心的3个收缩映射族(Lipschitz常数...

    Sierpinski垫片IFS图形算法

    在C++中使用MFC(Microsoft Foundation Classes)框架来实现这一算法,可以提供一个直观的用户界面,并结合VC6.0这样的开发环境,使得程序的编写和调试更为便捷。 首先,IFS的核心在于一系列的迭代变换规则。对于...

    图形学 分形图

    在MFC中编写分形图的代码,可以让我们更好地理解Windows应用程序的架构,并学习如何利用C++进行图形绘制。 在创建分形图时,常见的算法包括曼德勃罗集、朱利亚集、科赫曲线和谢尔宾斯基三角形等。这些算法通过迭代...

    作业及解答1

    测试中,要求编写一个使用5000个随机点来绘制2D谢尔宾斯基三角形(Sierpinski gasket)的程序。谢尔宾斯基三角形是一种典型的分形图形,通过迭代递归的过程,从一个大的等边三角形不断分割生成。这个任务要求编程...

    一个分形曲线程序代码

    对于初学者,可以从简单的分形曲线开始,比如科赫曲线或谢尔宾斯基三角形,这些更容易理解和实现。随着技能的提升,可以尝试更复杂的分形,如曼德勃罗集或朱利亚集。 文件"2_01"可能包含了分形曲线的源代码实现。...

    sierpinski-triangle.zip_Sierpinski_triangle_triangle code

    3. **迭代过程**:在主程序中,调用迭代函数,每次迭代将三角形分割成四个新的三角形,去除中心的三角形,并将剩余的三个三角形继续迭代。 4. **绘图**:在每次迭代后,记录下所有的三角形顶点,最后用`plot`函数把...

    CAML-开源

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

    VC分形源码实例,很详细

    根据提供的文件名列表(2_10、2_09、2_11、2_14、2_12、2_16、2_13、2_15),这些实例可能涵盖不同的分形类型,如曼德勃罗集、朱利亚集、科赫曲线、谢尔宾斯基三角形等。每个文件可能对应一个具体的分形算法实现,...

    matlab开发-5基本特征目标脚本

    在这些脚本中,可能包含了生成不同类型的分形,如曼德勃罗集、科赫曲线、谢尔宾斯基三角形等。通过这些脚本,用户可以学习到如何用MATLAB实现分形算法,进一步探索分形的性质和应用。 第三个知识点:数据导入与分析...

    vb写的关于分形的一些举例

    常见的分形包括曼德勃罗集、朱利亚集、科赫曲线、谢尔宾斯基三角形等。例如,曼德勃罗集的生成通常涉及复数运算,通过对复数点进行迭代函数计算,判断是否超出特定范围来决定颜色分配。朱利亚集则是基于另一个复数...

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

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

    fractal-geometry:分形几何程序

    分形几何中的经典例子包括曼德勃罗集、科赫曲线、谢尔宾斯基三角形等。这些形状的生成往往涉及到复数运算、迭代过程以及递归算法。例如,曼德勃罗集的生成是通过对每个复数点进行迭代函数计算,如果在一定次数内不...

    Sierpinski地毯算法

    编写程序时,可以定义一个函数来处理一个正方形,然后在每次迭代中调用这个函数处理新的8个小正方形。 6. **像素操作**:在实际编程中,使用像素数组来表示地毯,每个元素代表一个像素。通过遍历这个数组并根据迭代...

Global site tag (gtag.js) - Google Analytics