这篇文章将为大家详细讲解有关java如何实现平面山脉模型,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
核心方法:递归
其实当我第一次看到这个题目时,心中想的不就是个普通的递归吗,直接取两个点,然后不断取横坐标中点,然后中点纵坐标取随机数不就行吗,代码如下
public void recur(Graphics g, double x1, double x2, double y1, double y2, int range) {
double x3 = (x1 + x2) / 2;
double y3 = (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;
}
Random rand=new Random();
int num=rand.nextInt(range);
recur(g, x1, x3, y1, y3-num, range);
recur(g, x3, x2, y3-num, y2, range);
}
最终效果如下
很明显这并不像山脉背景吧,然后我通过查阅相关资料了解到问题在于需要每次递归时需要将纵坐标随机数值减小,改进后代码如下
public void recur(Graphics g, double x1, double x2, double y1, double y2, int range) {
//range我用的是300,大家可以自己调节
double x3 = (x1 + x2) / 2;
double y3 = (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;
}
Random rand=new Random();
int num=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类来对山脉进行颜色填充,同时传入不同的透明度进行不同山脉的区别一定更美观,废话不多说,上代码
public void recur(Graphics g, double x1, double x2, double y1, double y2, int range,int alp) {
//实例range用的是300
//四座山脉透明度分别为220,180,120,40
double x3 = (x1 + x2) / 2;
double y3 = (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);
Polygon p=new Polygon();
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(new Color(0,0,0,alp));
g.fillPolygon(p);
return;
}
Random rand=new Random();
int num=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如何实现平面山脉模型就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。