`
happy_zhourong
  • 浏览: 13303 次
  • 性别: Icon_minigender_2
文章分类
社区版块
存档分类
最新评论

科赫曲线

    博客分类:
  • java
 
阅读更多

 分6种情况进行讨论:

分六种情况进行讨论:

 

1、  线与水平线所成角度为0°,在其上方生成一个角:

方法:kochcurve0_up(int x1, int y1, int x2, int y2,int k)

 

 

再分别对线段AB,CD,BE,EC进行递归操作,

kochcurve0_up(x1,y1,x3,y1,k);//AB进行递归操作

kochcurve0_up(x4,y1,x2,y2,k); //CD进行递归操作

kochcurve60_left(x3,y1,x5,y5,k); //BE进行递归操作

kochcurve120_right(x5,y5,x4,y1,k); //EC进行递归操作

最后,画出线段AB,BE,EC,CD

 

2、  线与水平线所成角度为120°,在其右边生成一个角:

方法:kochcurve120_right(int x5, int y5, int x4, int y1, int k)

 

 

再分别对线段EF,GC,FH,GH进行递归操作,

kochcurve0_up(x9,y9,x10,y10,k); //FH进行递归操作

kochcurve60_right(x11,y11,x10,y10,k); //GH进行递归操作

kochcurve120_right(x5,y5,x9,y9,k); //EF进行递归操作

kochcurve120_right(x11,y11,x4,y1,k); //GC进行递归操作

最后,画出线段EF,GC,FH,GH

 

3、  线与水平线所成角度为60°,在其右边生成一个角:

方法:kochcurve60_right(int x11, int y11, int x10, int y10,int k)

4、线与水平线所成角度为0°,在其下方生成一个角:

方法::kochcurve0_down(int x12, int y12, int x14, int y14, int k)

4、  线与水平线所成角度为60°,在其左边生成一个角:

方法:kochcurve60_left(int x3, int y1, int x5, int y5, int k)

5、  线与水平线所成角度为120°,在其左边生成一个角:

方法:kochcurve120_left(int x8, int y8, int x7, int y7, int k)

 

/********科赫曲线方法****************/
	
	//在线(0度)的上方生成图形的函数
	void kochcurve0_up(int x1, int y1, int x2, int y2,int k) {
		if(k==0){
			g.drawLine(x1, y1, x2, y2);
		}else{
			int x3=x1+Math.abs(x2-x1)/3;
			int x4=x1+2*Math.abs(x2-x1)/3;
			int x5=x1+Math.abs(x2-x1)/2;
			int y5=(int) (y1-Math.sqrt(3)*Math.abs(x3-x1)/2);
//			g.drawLine(x3, y1, x5, y5);
//			g.drawLine(x5, y5, x4, y2);
//			g.drawLine(x3, y1, x4, y1);
//			g.setColor(Color.BLACK);
//			g.drawLine(x3, y1, x4, y1);
			g.setColor(Color.GREEN);
			k--;
			if(k>0){
				kochcurve0_up(x1,y1,x3,y1,k);
				kochcurve0_up(x4,y1,x2,y2,k);
				kochcurve60_left(x3,y1,x5,y5,k);
				kochcurve120_right(x5,y5,x4,y1,k);
			} else {
				g.drawLine(x3, y1, x5, y5);
				g.drawLine(x5, y5, x4, y2);
				g.drawLine(x1, y1, x3, y1);
				g.drawLine(x4, y1, x2, y2);

			}
			
		}
		
	}
	
	//在线(120度)的右侧生成图形的函数
	void kochcurve120_right(int x5, int y5, int x4, int y1, int k) {
		int a=mathline(x5,y5,x4,y1);
		int x9=x5+a/6;
		int y9=(int) (y1-Math.sqrt(3)*a/3);
		int x11=x5+a/3;
		int y11=(int) (y1-Math.sqrt(3)*a/6);
		int x10=x9+mathline(x9,y9,x11,y11);
		int y10=y9;
//		g.drawLine(x9, y9, x10, y10);
//		g.drawLine(x11, y11, x10, y10);
//		g.setColor(Color.BLACK);
//		g.drawLine(x9-1, y9, x11-1, y11);
//		g.drawLine(x9+1, y9, x11+1, y11);
		g.setColor(Color.GREEN);
		k--;
		if(k>0){
			kochcurve0_up(x9,y9,x10,y10,k);
			kochcurve60_right(x11,y11,x10,y10,k);
			kochcurve120_right(x5,y5,x9,y9,k);
			kochcurve120_right(x11,y11,x4,y1,k);
		} else {
			g.drawLine(x9, y9, x10, y10);
			g.drawLine(x11, y11, x10, y10);
			g.drawLine(x5, y5, x9, y9);
			g.drawLine(x11, y11, x4, y1);
		}
	}
	
	//在线(60度)的右侧生成图形的函数
	void kochcurve60_right(int x11, int y11, int x10, int y10,
			int k) {
		if(k==0){
			g.drawLine(x10, y10, x11, y11);
		}else{
			int a=mathline(x11,y11,x10,y10);
			int x12=x11+a/6;
			int y12=(int) (y11-Math.sqrt(3)*a/6);
			int x13=x11+a/3;
			int y13=(int) (y11-Math.sqrt(3)*a/3);
			int x14=x12+a/3;
			int y14=y12;
//			g.drawLine(x13, y13, x14, y14);
//			g.drawLine(x12, y12, x14, y14);
//			g.setColor(Color.BLACK);
//			g.drawLine(x13-1,y13,x12-1,y12);
//			g.drawLine(x13+1,y13,x12+1,y12);
			g.setColor(Color.GREEN);
			k--;
			if(k>0){
				kochcurve0_down(x12,y12,x14,y14,k);
				kochcurve120_right(x13,y13,x14,y14,k);
				kochcurve60_right(x11,y11,x12,y12,k);
				kochcurve60_right(x13,y13,x10,y10,k);
			} else {
				g.drawLine(x13, y13, x14, y14);
				g.drawLine(x12, y12, x14, y14);
				g.drawLine(x10,y10,x13,y13);
				g.drawLine(x11, y11, x12, y12);
			}
			
		}
		
	}

	//在线(0度)的下方生成图形的函数
	void kochcurve0_down(int x12, int y12, int x14, int y14, int k) {
		int a=mathline(x12,y12,x14,y14);
		int x18=x12+a/3;
		int y18=y12;
		int x19=x12+2*a/3;
		int y19=y12;
		int x20=(x12+x14)/2;
		int y20=(int) (y12+Math.sqrt(3)*a/6);
//		g.drawLine(x19, y19, x20, y20);
//		g.drawLine(x18, y18, x20, y20); 
//		g.setColor(Color.BLACK);
//		g.drawLine(x18,y18,x19,y19);
		g.setColor(Color.GREEN);
		k--;
		if(k>0){
			kochcurve120_left(x18,y18,x20,y20,k);
			kochcurve60_right(x20,y20,x19,y19,k);
			kochcurve0_down(x12,y12,x18,y18,k);
			kochcurve0_down(x19,y19,x14,y14,k);
			
		} else {
			g.drawLine(x19, y19, x20, y20);
			g.drawLine(x18, y18, x20, y20); 
			g.drawLine(x12, y12, x18, y18);
			g.drawLine(x14,y14,x19,y19);
		}
	}

	//在线(60度)的左侧生成图形的函数
	void kochcurve60_left(int x3, int y1, int x5, int y5, int k) {
		int a=mathline(x3,y1,x5,y5);
		int x7=x3+a/6;
		int y7=(int) (y1-Math.sqrt(3)*a/6);
		int x6=x3+a/3;
		int y6=(int) (y1-Math.sqrt(3)*a/3);
		int x8=x6-mathline(x7,y7,x6,y6);
		int y8=y6;
		System.out.println("x5="+x5);
		System.out.println("x6="+x6);
		System.out.println("x7="+x7);
		System.out.println("x8="+x8);
//		g.drawLine(x7, y7, x8, y8);
//		g.drawLine(x8, y8, x6, y6);
//		g.setColor(Color.BLACK);
//		g.drawLine(x6-1,y6,x7-1,y7);
//		g.drawLine(x6,y6,x7,y7);
//		g.drawLine(x6+1,y6,x7+1,y7);
		g.setColor(Color.GREEN);
		k--;
		if(k>0){
			kochcurve0_up(x8,y8,x6,y6,k);
			kochcurve120_left(x8,y8,x7,y7,k);
			kochcurve60_left(x3,y1,x7,y7,k);
			kochcurve60_left(x6,y6,x5,y5,k);
		} else {
			g.drawLine(x7, y7, x8, y8);
			g.drawLine(x8, y8, x6, y6);
			g.drawLine(x3, y1, x7, y7);
			g.drawLine(x5,y5,x6,y6);
		}
	}

	//在线(120度)的左侧生成图形的函数
	void kochcurve120_left(int x8, int y8, int x7, int y7, int k) {
		if(k==0){
			g.drawLine(x7,y7,x8,y8);
		}else{
			int a=mathline(x8,y8,x7,y7);
			int x15=x7-a/6;
			int y15=(int) (y7-Math.sqrt(3)*a/6);
			int x16=x7-a/3;
			int y16=(int) (y7-Math.sqrt(3)*a/3);
			int x17=x15-a/3;
			int y17=y15;
//			g.drawLine(x16, y16, x17, y17);
//			g.drawLine(x15, y15, x17, y17);
//			g.setColor(Color.BLACK);
//			System.out.println("x15="+x15);
//			System.out.println("y15="+y15);
//			g.drawLine(x15, y15, x16, y16);
//			g.drawLine(x15+1, y15, x16+1, y16);
//			g.drawLine(x15-1, y15, x16-1, y16);
			g.setColor(Color.GREEN);
			k--;
			if(k>0){
				kochcurve60_left(x17,y17,x16,y16,k);
				kochcurve0_down(x17,y17,x15,y15,k);
				kochcurve120_left(x8,y8,x16,y16,k);
				kochcurve120_left(x15,y15,x7,y7,k);
			} else {
				g.drawLine(x16, y16, x17, y17);
				g.drawLine(x15, y15, x17, y17);
				g.drawLine(x8,y8,x16,y16);
				g.drawLine(x7,y7,x15,y15);
			}
		}
		
	}
	/**********科赫曲线方法结束***********/
	
	//计算一条直线的长度的函数
	private int mathline(int x3, int y1, int x5, int y5) {
		int line=(int) Math.sqrt(Math.pow((x5-x3), 2)+Math.pow((y5-y1), 2));
		return line;
	}

 

 
 
  
 

 
 

 

 
 

  • 大小: 38.8 KB
  • 大小: 19.5 KB
  • 大小: 23.5 KB
  • 大小: 29.7 KB
  • 大小: 37.9 KB
  • 大小: 36.8 KB
  • 大小: 42.4 KB
  • 大小: 14.4 KB
  • 大小: 14.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics