绘制一个山脉轮廓
给定两个点(x1,y1),(x2,y2),递归取终点,同时给定一个范围[-range,range]和一个比率,
每次取中点后,这个中点的纵坐标的值加上这个范围内的随机值,同时range=range*rate,缩小这个范围
相邻的点连线,绘制成一个山脉的形状。
递归实现
public void divide(int xl,int xr,int yl,int yr,Graphics g,int range,double rate){
if(xr-xl<=1){
g.drawLine(xl, yl, xr, yr);
}else{
int x=(xr+xl)/2;
int y=(yr+yl)/2;
Random rand =new Random();
int num=rand.nextInt(range*2)-range;
range=(int)(range*rate);
//System.out.println(range);
//y+=num;
//g.drawLine(xl, yl, xr, yr);
divide(x,xr,y+num,yr,g,range,rate);
divide(xl,x,yl,y+num,g,range,rate);
}
}
这是一个很简单的递归实现,代码中实现的是当两个点横坐标差值为1的时候开始连线,我们用递归写的时候不需要保存数据,因为递归不会导致数据的丢失。同时我们可以看到,我们用了int,没有用double,这是因为我们的像素点不能用小数表示。
try{
Thread.sleep(200);
}catch(InterruptedException e){
e.printStackTrace();
}
这一段可以睡眠,让绘图的图形有足够的时间画出来
效果图
当然我们依旧可以使用以前的重绘操作来使我们改变窗体后图像依旧显示