混沌与分形(一):谢尔宾斯基三角形与门格海绵

研究混沌运动,少不了对分形理论的探讨。分形:通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。

本篇将从一维过度到三维介绍分形图案的产生,一维类比康托尔集直线三等分的生成,此处比较简单我们不过多讨论,我们重点分析如何通过使用Java语言,实现Sierpinski和Menger sponge分形图案的过程(多图)。

谢尔宾斯基(Sierpinski)三角形

谢尔宾斯基三角形和它本身的一部分完全相似,它是自相似集的经典例子。

构造特点

  1. 取一个三角形边框(常用等边三角形)
  2. 沿三边中点的连线,将它分成四个小三角形
  3. 去掉中间的那一个小三角形
  4. 对其余三个小三角形都重复1~3的操作

代码实现

UI界面鼠标监听器获取鼠标点击处的坐标,再由此坐标和等腰三角的边长关系,得到三角形其余两点坐标:

int x = (int)e.getX();
int y = (int)e.getY();
int length = 120;//设定三角形边长为2*length
int x2 = x+length;//以下为坐标变换
int x3 = x-length;
int y2 = (int)(y-length*Math.sqrt(3));
int y3 = (int)(y-length*Math.sqrt(3));
int count =6;//迭代次数初始值

方法一:

此方法是绘制Sierpinski三角形的典型思路,与构造特点思路对应。

public void triangle_1(int x1,int y1,int x2,int y2,int x3,int y3,int count){
   
  //将三角形三顶点坐标存入数组中
  int m[]={
   x1,x2,x3};
  int n[]={
   y1,y2,y3};
  //绘制三角形边框
  g.drawPolygon(m, n, 3);
  //迭代次数减1,再判断
  count--;
  if(count>0){
   
   //计算三边中点坐标
   int x4=(x1+x2)/2;
   int x5=(x1+x3)/2;
   int x6=(x2+x3)/2;
   int y4=(y1+y2)/2;
   int y5=(y1+y3)/2;
   int y6=(y2+y3)/2;
   //迭代到不包括最中间的其余三个小三角形中
   triangle_1(x1,y1,x4,y4,x5,y5,count);
   triangle_1(x2,y2,x4,y4,x6,y6,count);
   triangle_1(x3,y3,x5,y5,x6,y6,count);
  }
 }
绘制结果(1)


此结果是迭代6次的效果,三顶点变换方向不同,效果会有区别,但大同小异。

方法二:

与方法一的思路略有不同,我们不排除中间的三角形,而是以它为主,先绘制最中间的实心三角形,再对三边的三个不同方向作迭代,变化过程中只改变三角形边长大小为之前的1/2,并朝此方向作平移,重复上述过程。

public void triangle_2(int length,int x1,int y1,int x2,int y2,int x3,int y3,int l){
   
  /*此处代码作用是将三角形三顶点坐标转换,并保存至数组中
   由于与上述重复,不再赘述*/
   
  //判断断边长大小决定是否继续递归
  if(length>4){
   
   g.setColor(new Color(length,l/4,length+l/4));
   g.fillPolygon(m,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值