java實現(xiàn)直線分形山脈
本文實例為大家分享了java實現(xiàn)直線分形山脈的具體代碼,供大家參考,具體內(nèi)容如下
直線分形
直線分形平面山脈
想要實現(xiàn)這個效果的思想就是,由x1、x2所確定的一條直線,我們?nèi)∷鼈兊闹悬cx3然后允許x3的y坐標(biāo)在一定范圍內(nèi)隨機(jī)波動,(這種情況下我們讓x1連接x3,x2連接x3就會看起來有小山的感覺了,但其實我們是在遞歸結(jié)束時才開始連線的)接下來做相同的動作,讓x1與x3的中點x4的y坐標(biāo)在一定范圍內(nèi)波動,x2與x3的中點x5的y坐標(biāo)在一定范圍內(nèi)隨機(jī)波動,就這樣遞歸下去,最后在我們完成設(shè)定的遞歸層數(shù)后就開始連線,并且填充它們之間所包含的區(qū)域,那么就實現(xiàn)了直線分形的平面山脈啦。(作為手殘黨的我畫圖是真的不好看,小伙伴們就將就著看看好了,T.T…)
效果圖
這是我這個代碼畫出的一個效果。
山脈
import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Polygon; import java.util.Random; import javax.swing.JFrame; public class LineString { ?? ?JFrame frame=new JFrame(); ?? ?public static void main(String[] args) { ?? ??? ?LineString line=new LineString(); ? ? ? ? line.showUI(); ?? ?} ?? ?public void drawline(int x1,int y1,int x2,int y2,int n,Graphics g,int range,int height){ //參數(shù)解釋:x1,y1,x2,y2就是我們當(dāng)前兩個點的坐標(biāo),n是我設(shè)定的遞歸層數(shù) //range就是允許中點坐標(biāo)波動的范圍,height是最后填充時會用到的?? ??? ? ? ?//在遞歸結(jié)束的時候,我們才開始畫山脈 ? //填充的時候我們已經(jīng)知道了需要填充不規(guī)則四邊形的上面兩個點的坐標(biāo) ?//那么下面兩個點的橫坐標(biāo)我們就也可以對應(yīng)上面的兩個點 ?//只需要將上面兩個點的y坐標(biāo)設(shè)為界面底部就OK //所以我這里讓下面的兩個點加上height,當(dāng)然這個height也是跟著界面在改變 ?? ? ? ?if(n<=0){ ?? ? ? ??? ?int []x={x1,x2,x2,x1}; ?? ? ? ??? ?int []y={y1,y2,y2+height,y1+height}; ?? ? ? ??? ?Polygon polygon=new Polygon(x,y,4); ?? ? ? ??? ?g.setColor(Color.BLACK); ?? ? ? ??? ?g.fillPolygon(polygon); ?? ? ? ??? ?return ; ?? ? ? ?} ?? ? ? ?//求中點的坐標(biāo) ?? ? ? ?int x=(x2+x1)/2;? ?? ??? ?int y=(y2+y1)/2; ?? ??? ?//這里的range可能會為0,為了修復(fù)這個bug,我們要檢測它 ?? ??? ? ? if(range==0){ ? ? ? ? ?? ?range=1; ? ? ? ? } ? ? ? ? Random rand=new Random(); ? ? ? ? int i=rand.nextInt(range*2)-range; ? ? ? ? //讓中點的y坐標(biāo)隨機(jī)波動 ? ? ? ? y+=i; ? ? ? ? //減少遞歸層數(shù) ?? ??? ?n--; ?? ??? ?//每一次遞歸都減少range可以波動的范圍 ?? ??? ?range *= 0.6;?? ? ?? ??? ? ?? ??? ?//將山脈分成左右兩邊 ?? ??? ?//畫左邊 ?? ? ? ?drawline(x1,y1,x,y,n,g,range,height); ?? ? ? ?//畫右邊 ? ? ?? ?drawline(x,y,x2,y2,n,g,range,height); ?? ? ?? ?? ?} ? ? public void showUI(){ ? ? ?? ?Dimension dim=new Dimension(1000,1000); ? ? ?? ?frame.setTitle("Recursion"); ? ? ?? ?frame.setSize(dim); ? ? ?? ?frame.setLocationRelativeTo(null); ? ? ?? ?frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ? ? ?? ?LineListener listener=new LineListener(frame); ? ? ?? ?frame.addMouseListener(listener); ? ? ?? ?frame.setVisible(true); ? ? ?? ?Graphics g=frame.getGraphics(); ? ? ?? ?listener.g=g; ? ? ?? ? ? ? ?? ?listener.height=frame.getHeight(); ? ? } }
山脈界面監(jiān)聽器
import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JFrame; public class LineListener implements MouseListener{ ?? ?int x1,x2,y1,y2; ? ? public Graphics g; ? ? int height; ? ? JFrame frame; ? ? public LineListener(JFrame frame) { ?? ??? ?// TODO Auto-generated constructor stub ? ? ?? ?this.frame=frame; ? ? ?? ?this.height=frame.getHeight(); ? ? ?? ? ?? ?} ?? ?@Override ?? ?public void mousePressed(MouseEvent e) { ?? ??? ?// TODO Auto-generated method stub ?? ??? ? ?? ??? ?x1=e.getX(); ?? ??? ?y1=e.getY(); ?? ?} ?? ?@Override ?? ?public void mouseReleased(MouseEvent e) { ?? ??? ?// TODO Auto-generated method stub ?? ??? ? ?? ??? ?x2=e.getX(); ?? ??? ?y2=e.getY(); ?? ??? ?LineString string=new LineString(); ?? ??? ?string.drawline(x1, y1, x2, y2, 9, g,300,height); ?? ?} ?? ?@Override ?? ?public void mouseClicked(MouseEvent e) { ?? ??? ?// TODO Auto-generated method stub ?? ??? ? ?? ?} ?? ?@Override ?? ?public void mouseEntered(MouseEvent e) { ?? ??? ?// TODO Auto-generated method stub ?? ??? ? ?? ?} ?? ?@Override ?? ?public void mouseExited(MouseEvent e) { ?? ??? ?// TODO Auto-generated method stub ?? ??? ? ?? ?} }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java如何將Object數(shù)組轉(zhuǎn)換為指定類型數(shù)組
這篇文章主要介紹了java如何將Object數(shù)組轉(zhuǎn)換為指定類型數(shù)組,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08使用Java實現(xiàn)百萬Excel數(shù)據(jù)導(dǎo)出
這篇文章主要為大家詳細(xì)介紹了如何使用Java實現(xiàn)百萬Excel數(shù)據(jù)導(dǎo)出,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以參考一下2024-03-03Spring AspectJ 實現(xiàn)AOP的方法你了解嗎
這篇文章主要為大家介紹了Spring AspectJ 實現(xiàn)AOP的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01