java實(shí)現(xiàn)直線分形山脈
本文實(shí)例為大家分享了java實(shí)現(xiàn)直線分形山脈的具體代碼,供大家參考,具體內(nèi)容如下
直線分形
直線分形平面山脈
想要實(shí)現(xiàn)這個(gè)效果的思想就是,由x1、x2所確定的一條直線,我們?nèi)∷鼈兊闹悬c(diǎn)x3然后允許x3的y坐標(biāo)在一定范圍內(nèi)隨機(jī)波動(dòng),(這種情況下我們讓x1連接x3,x2連接x3就會(huì)看起來(lái)有小山的感覺(jué)了,但其實(shí)我們是在遞歸結(jié)束時(shí)才開(kāi)始連線的)接下來(lái)做相同的動(dòng)作,讓x1與x3的中點(diǎn)x4的y坐標(biāo)在一定范圍內(nèi)波動(dòng),x2與x3的中點(diǎn)x5的y坐標(biāo)在一定范圍內(nèi)隨機(jī)波動(dòng),就這樣遞歸下去,最后在我們完成設(shè)定的遞歸層數(shù)后就開(kāi)始連線,并且填充它們之間所包含的區(qū)域,那么就實(shí)現(xiàn)了直線分形的平面山脈啦。(作為手殘黨的我畫圖是真的不好看,小伙伴們就將就著看看好了,T.T…)

效果圖
這是我這個(gè)代碼畫出的一個(gè)效果。

山脈
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)前兩個(gè)點(diǎn)的坐標(biāo),n是我設(shè)定的遞歸層數(shù)
//range就是允許中點(diǎn)坐標(biāo)波動(dòng)的范圍,height是最后填充時(shí)會(huì)用到的?? ??? ?
? ?//在遞歸結(jié)束的時(shí)候,我們才開(kāi)始畫山脈
? //填充的時(shí)候我們已經(jīng)知道了需要填充不規(guī)則四邊形的上面兩個(gè)點(diǎn)的坐標(biāo)
?//那么下面兩個(gè)點(diǎn)的橫坐標(biāo)我們就也可以對(duì)應(yīng)上面的兩個(gè)點(diǎn)
?//只需要將上面兩個(gè)點(diǎn)的y坐標(biāo)設(shè)為界面底部就OK
//所以我這里讓下面的兩個(gè)點(diǎn)加上height,當(dāng)然這個(gè)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 ;
?? ? ? ?}
?? ? ? ?//求中點(diǎn)的坐標(biāo)
?? ? ? ?int x=(x2+x1)/2;?
?? ??? ?int y=(y2+y1)/2;
?? ??? ?//這里的range可能會(huì)為0,為了修復(fù)這個(gè)bug,我們要檢測(cè)它
?? ??? ? ? if(range==0){
? ? ? ? ?? ?range=1;
? ? ? ? }
? ? ? ? Random rand=new Random();
? ? ? ? int i=rand.nextInt(range*2)-range;
? ? ? ? //讓中點(diǎn)的y坐標(biāo)隨機(jī)波動(dòng)
? ? ? ? y+=i;
? ? ? ? //減少遞歸層數(shù)
?? ??? ?n--;
?? ??? ?//每一次遞歸都減少range可以波動(dòng)的范圍
?? ??? ?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)聽(tīng)器
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
?? ??? ?
?? ?}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java ThreadLocal 線程安全問(wèn)題解決方案
這篇文章主要介紹了Java ThreadLocal 線程安全問(wèn)題解決方案的相關(guān)資料,需要的朋友可以參考下2016-09-09
Mybatis實(shí)現(xiàn)動(dòng)態(tài)排序方式
這篇文章主要介紹了Mybatis實(shí)現(xiàn)動(dòng)態(tài)排序方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
java如何將Object數(shù)組轉(zhuǎn)換為指定類型數(shù)組
這篇文章主要介紹了java如何將Object數(shù)組轉(zhuǎn)換為指定類型數(shù)組,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
使用Java實(shí)現(xiàn)百萬(wàn)Excel數(shù)據(jù)導(dǎo)出
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)百萬(wàn)Excel數(shù)據(jù)導(dǎo)出,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下2024-03-03
Spring AspectJ 實(shí)現(xiàn)AOP的方法你了解嗎
這篇文章主要為大家介紹了Spring AspectJ 實(shí)現(xiàn)AOP的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-01-01
java實(shí)現(xiàn)微信支付結(jié)果通知
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)微信支付結(jié)果通知,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01

