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ì)看起來有小山的感覺了,但其實(shí)我們是在遞歸結(jié)束時(shí)才開始連線的)接下來做相同的動(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ù)后就開始連線,并且填充它們之間所包含的區(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í)候,我們才開始畫山脈
? //填充的時(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,我們要檢測它
?? ??? ? ? 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)聽器
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)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot中Controller的傳參方式詳細(xì)講解
這篇文章主要介紹了SpringBoot在Controller層接收參數(shù)的常用方法,Controller接收參數(shù)的常用方式總體可以分為三類,第一類是Get請(qǐng)求通過拼接url進(jìn)行傳遞,第二類是Post請(qǐng)求通過請(qǐng)求體進(jìn)行傳遞,第三類是通過請(qǐng)求頭部進(jìn)行參數(shù)傳遞,下面我們來詳細(xì)看看2023-01-01
Spring項(xiàng)目集成RabbitMQ及自動(dòng)創(chuàng)建隊(duì)列
這篇文章主要介紹了Spring項(xiàng)目集成RabbitMQ及自動(dòng)創(chuàng)建隊(duì)列,本文內(nèi)容分別在Spring(V5.2.6)和Spring Boot(V2.5.14)兩個(gè)項(xiàng)目中經(jīng)過了驗(yàn)證,需要的朋友可以參考下2024-02-02
利用Kotlin + Spring Boot實(shí)現(xiàn)后端開發(fā)
這篇文章主要給大家介紹了關(guān)于利用Kotlin + Spring Boot實(shí)現(xiàn)后端開發(fā)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
java實(shí)現(xiàn)字符串四則運(yùn)算公式解析工具類的方法
今天小編就為大家分享一篇java實(shí)現(xiàn)字符串四則運(yùn)算公式解析工具類的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07
使用RestTemplate 調(diào)用遠(yuǎn)程接口上傳文件方式
這篇文章主要介紹了使用RestTemplate 調(diào)用遠(yuǎn)程接口上傳文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
JAVA JSP頁面技術(shù)之EL表達(dá)式整理歸納總結(jié)
這篇文章主要介紹了java中JSP頁面技術(shù)之EL表達(dá)式概念作用以及語法等的使用,需要的朋友可以參考2017-04-04
Maven如何解決添加依賴之后沒有加載jar包報(bào)錯(cuò)問題
這篇文章主要介紹了Maven如何解決添加依賴之后沒有加載jar包報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
java算法實(shí)現(xiàn)預(yù)測雙色球中獎(jiǎng)號(hào)碼
這篇文章主要介紹了java算法實(shí)現(xiàn)預(yù)測雙色球中獎(jiǎng)號(hào)碼的相關(guān)資料,需要的朋友可以參考下2015-12-12

