Java分形怎么绘制山脉模型

Java分形怎么绘制山脉模型

这篇文章主要为大家分析了Java分形怎么绘制山脉模型的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Java分形怎么绘制山脉模型”的知识吧。

如何绘制一个山脉

构思设计

任意选取三个点,选取一个范围和一个比率,每一个都对这三个点取中点,中点的纵坐标加一个在范围内的随机值,当完成一次递归之后缩小这个范围即range*rate
连线的时候,将三角形的一个点和这个点的两条边生成的中点相连,最后将三条边的中点相连
所以应该有四个递归调用。

代码实现及注解

packageMountion;importjava.awt.Graphics;importjava.util.ArrayList;importjava.util.List;importjava.util.Random;importjavax.swing.JFrame;publicclassShowUI{List<Shape>list=newArrayList<>();inti=0;publicvoiddivide(intx1,intx2,intx3,inty1,inty2,inty3,intrange,doublerate,inttimes,Graphicsg,Shapep){if(times==0){//画线,构成一个三角形g.drawLine(x1,y1,x2,y2);g.drawLine(x3,y3,x2,y2);g.drawLine(x1,y1,x3,y3);return;}else{times--;Randomrand=newRandom();//注意数据需要初始化intx4=0,x5=0,x6=0,y4=0,y5=0,y6=0;intflag1=0,flag2=0,flag3=0;//遍历这个表for(Shapes:list){//相等的两种状况if((s.pX1()==x1&&s.pX2()==x2&&s.pY1()==y1&&s.pY2()==y2)||(s.pX1()==x2&&s.pX2()==x1&&s.pY1()==y2&&s.pY2()==y1)){if(s.show(g)==1){//如果这个边已经被使用过了,那么此时说明中点已经生成,只需要读出来中点即可x4=s.pX3();y4=s.pY3();//System.out.println(times+":same:==================size:"+(i++));}else{//如果这条边存在但没有使用,那么生成这个中点,进行更新,其实就是将原来的shape删除掉,加入一个新的。x4=(x1+x2)/2;y4=(y1+y2)/2+rand.nextInt(range*2)-range;//System.out.println(times+":1");list.remove(s);p=newShape(x1,x2,x4,y1,y2,y4,1);list.add(p);}flag1=1;break;}}if(flag1==0){//System.out.println(times+":before:==================size:"+(i++));//如果不存在,这个很简单,只需要构造一个就好了x4=(x1+x2)/2;y4=(y1+y2)/2+rand.nextInt(range*2)-range;p=newShape(x1,x2,x4,y1,y2,y4,1);list.add(p);}//后面两种情况类似for(Shapes:list){if((s.pX1()==x1&&s.pX2()==x3&&s.pY1()==y1&&s.pY2()==y3)||(s.pX1()==x3&&s.pX2()==x1&&s.pY1()==y3&&s.pY2()==y1)){if(s.show(g)==1){x5=s.pX3();y5=s.pY3();}else{x5=(x1+x3)/2;y5=(y1+y3)/2+rand.nextInt(range*2)-range;list.remove(s);p=newShape(x1,x3,x5,y1,y3,y5,1);list.add(p);}flag2=1;break;}}if(flag2==0){x5=(x1+x3)/2;y5=(y1+y3)/2+rand.nextInt(range*2)-range;//System.out.println(times+":before1:==================size:"+(i++));p=newShape(x1,x2,x4,y1,y2,y4,1);list.add(p);}for(Shapes:list){if((s.pX1()==x2&&s.pX2()==x3&&s.pY1()==y2&&s.pY2()==y3)||(s.pX1()==x3&&s.pX2()==x2&&s.pY1()==y3&&s.pY2()==y2)){if(s.show(g)==1){x6=s.pX3();y6=s.pY3();}else{x6=(x2+x3)/2;y6=(y2+y3)/2+rand.nextInt(range*2)-range;list.remove(s);p=newShape(x2,x3,x6,y2,y3,y6,1);list.add(p);}flag3=1;break;}}if(flag3==0){x6=(x2+x3)/2;y6=(y2+y3)/2+rand.nextInt(range*2)-range;//System.out.println(times+":before2:==================size:"+(i++));p=newShape(x1,x2,x4,y1,y2,y4,1);list.add(p);}//逐渐缩小范围range=(int)(range*rate);//将边添加进行,类似一个初始话,标记位为0p=newShape(x1,x4,y1,y4,0);list.add(p);p=newShape(x1,x5,y1,y5,0);list.add(p);p=newShape(x4,x5,y4,y5,0);list.add(p);p=newShape(x2,x4,y2,y4,0);list.add(p);p=newShape(x2,x6,y2,y6,0);list.add(p);p=newShape(x4,x6,y4,y6,0);list.add(p);p=newShape(x3,x5,y3,y5,0);list.add(p);p=newShape(x3,x6,y3,y6,0);list.add(p);p=newShape(x5,x6,y5,y6,0);list.add(p);//画四个三角形divide(x1,x4,x5,y1,y4,y5,range,rate,times,g,p);divide(x2,x4,x6,y2,y4,y6,range,rate,times,g,p);divide(x3,x5,x6,y3,y5,y6,range,rate,times,g,p);divide(x4,x5,x6,y4,y5,y6,range,rate,times,g,p);}}publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubJFramemoun=newJFrame();moun.setSize(1000,600);moun.setLocationRelativeTo(null);moun.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);moun.setVisible(true);Graphicsg=moun.getGraphics();//获取窗体intx1=500,x2=100,x3=850;inty1=100,y2=400,y3=400;intrange=200;doublerate=0.5;inttimes=7;ShowUIa=newShowUI();try{Thread.sleep(566);}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}Shapep=null;//System.out.println(100);a.divide(x1,x2,x3,y1,y2,y3,range,rate,times,g,p);}}

Shape类

packageMountion;importjava.awt.Graphics;publicclassShape{privateintx1,x2,x3,y1,y2,y3;privateintflag;//这个构造函数存储的是一个边的两个点,以及这个边生成的中点publicShape(intx1,intx2,intx3,inty1,inty2,inty3,intflag){this.x1=x1;this.x2=x2;this.x3=x3;this.y1=y1;this.y2=y2;this.y3=y3;this.flag=flag;}//这个构造函数存储的一条边的两个点publicShape(intx1,intx2,inty1,inty2,intflag){this.x1=x1;this.x2=x2;this.y1=y1;this.y2=y2;this.flag=flag;}//flag标记位,这条边是否被使用过publicintshow(Graphicsg){//TODOAuto-generatedmethodstubreturnflag;}publicintpX1(){returnx1;}publicintpX2(){returnx2;}publicintpX3(){returnx3;}publicintpY1(){returny1;}publicintpY2(){returny2;}publicintpY3(){returny3;}}

效果展示

这篇文章主要为大家分析了Java分形怎么绘制山脉模型的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Java分形怎么绘制山脉模型”的知识吧。

发布于 2022-01-10 23:48:14
收藏
分享
海报
0 条评论
36
上一篇:java怎么实现简单五子棋小游戏 下一篇:java如何实现平面山脉模型
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码