`
菜刀兔兔兔
  • 浏览: 16767 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

关于科赫曲线

 
阅读更多

  

         学了挺久的分型了,一直没有画科赫曲线,昨天准备画画科赫曲线。

 

         我觉得我把画图想得太简单了。画了挺久的科赫曲线,开始时有些地方一直想不明白,比如说,第一次画完画第二次的时候,第一次画过的线要怎么擦掉。后来发现,我的方向错了。

 

       这个感觉有点像一笔画,先把所有的点找出来,然后最后一次性画完。

 

       我在代码里面判断了直线的斜率,开始我直接用==号判断是否等于cos60和cos120,后来发现这个方法行不通,因为cos的值为double ,而斜率除出来是一个int型的,在强制转换的过程中可能会有点问题。

 

       还有些问题是关于坐标点计算的,可能加减乘除很容易搞错,一不小心三角形就变形了,或者三角形往里凹了。但是这些还是小问题,只要把坐标打印出来,一点一点慢慢检查就好。

 

        再说说我判断斜率时候出现的问题,我在解决了其他所有的问题之后,我开始试循环的次数,开始时挺正常的,后来我试了8,然后他就开始报错了。他报了一个这样的错Exception in thread "AWT-EventQueue-0" java.lang.ArithmeticException     后来我询问了度娘,度娘告诉我这是除数为0时才会报的错,然后我定位到了我写的那行代码,发现是判断斜率的那个地方,后来我想到了一个解决办法,就是先判断y1y2的大小,再判断x1x2的大小,分步进行,而且这样画的三角形也不出错。这也说明一个问题,循环次数多了之后,因为画的点都是int型,所以会重合在一起。对于初始长度为900的来说,循环到8次就差不多了,在循环下去也是在画重合的点。

 

下面是我写的科赫曲线的代码:

public class kehe extends JFrame{
	
	private static final long serialVersionUID = 1L;
	public Graphics g;

	public static void main(String[] args) {
	
		kehe kh = new kehe();
		kh.line();
	}
	
	public void line(){
		
		//设置窗体的属性
		this.setTitle("科赫曲线");
		this.setSize(1000, 700);
		this.setDefaultCloseOperation(3);
		this.setLocationRelativeTo(null);
	
		//设置窗体可见
		this.setVisible(true);
		
		Graphics g = this.getGraphics();
		this.g =g;
		
	}
		//重写父类的重绘方法
	public void paint(Graphics g){
		//调用父类的重绘方法
		int x1,x2,y1,y2;
		x1=50;
		x2=950;
		y1=y2=500;
		super.paint(g);
		draw(x1,y1,x2,y2,11);

	}
	public void draw(int x1,int y1,int x2,int y2,int count){
		int a1,a2,a3=0,b1,b2,b3=0;
		
		//如果计数器大于1,则递归
		if(count>1){
			count--;
			//第一个三等份点
			a1=(x2-x1)/3+x1;
			b1=y1+(y2-y1)/3;
			//第二个三等份点
			a2=2*(x2-x1)/3+x1;
			b2=y1+2*(y2-y1)/3;
			//第三个突起的点
			
			//如果为一直线
			if((y2-y1==0)){
				a3=(a1+a2)/2;
				b3=b1-(int)((a2-a1)*Math.sqrt(3)/2);
			}
			//如果与水平夹角120度
			if((y2-y1)<0){
				if(x2>x1){
				a3=x1;
				b3=b2;
				}else{
					a3=x2;
					b3=b1;
				}
				
			}
			//如果与水平夹角60度
			if((y2-y1)>0){
				if(x2>x1){
				a3=x2;
				b3=b1;}
				else{
					a3=x1;
					b3=b2;
				}
							
			}
			if(x2==x1){
				a3=a1;
				b3=b1;
			}
		
			draw(x1, y1, a1, b1,count);
			draw(a1, b1, a3, b3,count);
			draw(a3, b3, a2, b2,count);
			draw(a2, b2, x2, y2,count);

		}
		//如果计数器等于1,则画线
		else if(count==1)	{g.drawLine(x1, y1, x2, y2);System.out.println("x1为:"+x1+"   y1:"+y1+"   x2:"+x2+"   y2:"+y2);return;}
	}
}

 

还有,关于科赫曲线画雪花, 在科赫曲线的基础上就很简单了。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics