java如何实现平面山脉模型
这篇文章将为大家详细讲解有关java如何实现平面山脉模型,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
核心方法:递归
其实当我第一次看到这个题目时,心中想的不就是个普通的递归吗,直接取两个点,然后不断取横坐标中点,然后中点纵坐标取随机数不就行吗,代码如下
publicvoidrecur(Graphicsg,doublex1,doublex2,doubley1,doubley2,intrange){doublex3=(x1+x2)/2;doubley3=(y1+y2)/2;if(x2-x1<=15){g.drawLine((int)x1,(int)y1,(int)x3,(int)y3);g.drawLine((int)x2,(int)y2,(int)x3,(int)y3);return;}Randomrand=newRandom();intnum=rand.nextInt(range);recur(g,x1,x3,y1,y3-num,range);recur(g,x3,x2,y3-num,y2,range);}
最终效果如下
很明显这并不像山脉背景吧,然后我通过查阅相关资料了解到问题在于需要每次递归时需要将纵坐标随机数值减小,改进后代码如下
publicvoidrecur(Graphicsg,doublex1,doublex2,doubley1,doubley2,intrange){//range我用的是300,大家可以自己调节doublex3=(x1+x2)/2;doubley3=(y1+y2)/2;if(x2-x1<=1|range==0){g.drawLine((int)x1,(int)y1,(int)x3,(int)y3);g.drawLine((int)x2,(int)y2,(int)x3,(int)y3);return;}Randomrand=newRandom();intnum=rand.nextInt(range*2)-range;range*=0.5;recur(g,x1,x3,y1,y3+num,range);recur(g,x3,x2,y3+num,y2,range);}
效果很接近山脉
然后我又想可以使用Polygon类来对山脉进行颜色填充,同时传入不同的透明度进行不同山脉的区别一定更美观,废话不多说,上代码
publicvoidrecur(Graphicsg,doublex1,doublex2,doubley1,doubley2,intrange,intalp){//实例range用的是300//四座山脉透明度分别为220,180,120,40doublex3=(x1+x2)/2;doubley3=(y1+y2)/2;if(x2-x1<=1|range==0){g.drawLine((int)x1,(int)y1,(int)x3,(int)y3);g.drawLine((int)x2,(int)y2,(int)x3,(int)y3);Polygonp=newPolygon();p.addPoint((int)x3,(int)y3);p.addPoint((int)x1,(int)y1);p.addPoint((int)x1,800);p.addPoint((int)x2,800);p.addPoint((int)x2,(int)y2);g.setColor(newColor(0,0,0,alp));g.fillPolygon(p);return;}Randomrand=newRandom();intnum=rand.nextInt(range*2)-range;range*=0.5;//上面的0.5也可以改变,他控制的是循环次数和山脉的陡峭度,大家可以改变尝试recur(g,x1,x3,y1,y3+num,range,alp);recur(g,x3,x2,y3+num,y2,range,alp);}
大功告成
关于java如何实现平面山脉模型就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。