亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java遞歸方法實(shí)現(xiàn)山脈繪制

 更新時(shí)間:2022年01月10日 14:14:10   作者:feng之鋒  
這篇文章主要為大家詳細(xì)介紹了Java遞歸方法實(shí)現(xiàn)山脈繪制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Java遞歸方法實(shí)現(xiàn)山脈繪制的具體代碼,供大家參考,具體內(nèi)容如下

一、山脈繪制的思路

給定兩個(gè)點(diǎn)A(x1,y1),B(x2,y2),遞歸不斷取中點(diǎn),同時(shí)給定一個(gè)范圍[-range,range]和一個(gè)比率rate。每次取中點(diǎn)后,這個(gè)中點(diǎn)的縱坐標(biāo)的值加上這個(gè)范圍內(nèi)的隨機(jī)值,同時(shí)通過range=range*rate來縮小這個(gè)變化的范圍,最后,通過相鄰的點(diǎn)連線,繪制成一個(gè)山脈的形狀。

二、整段代碼如下

package com.yf1031;

import java.awt.FlowLayout;
import java.awt.Graphics;
import java.util.Random;

import javax.swing.JFrame;

public class Drawpanel {
?? ?public static void main(String[] args) {
?? ??? ?Drawpanel drawpanel = new Drawpanel();
?? ??? ?drawpanel.showUI();
?? ??? ?
?? ?}
?? ?
?? ?public void showUI() {
?? ??? ?JFrame jf = new JFrame();
?? ??? ?jf.setTitle("山脈");
?? ??? ?jf.setSize(800, 800);
?? ??? ?jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
?? ??? ?jf.setLayout(new FlowLayout());
?? ??? ?jf.setLocationRelativeTo(null);
?? ??? ?
?? ??? ?jf.setVisible(true);
?? ??? ?
?? ??? ?Graphics g = jf.getGraphics();
?? ??? ?int xl = 10, yl =500 , xr = 750, yr = 600, range = 300;
?? ??? ?double rate = 0.5;
?? ??? ?
?? ??? ?try {
?? ??? ??? ?Thread.sleep(566);
?? ??? ?} catch (Exception e) {
?? ??? ??? ?// TODO: handle exception
?? ??? ??? ?e.printStackTrace();
?? ??? ?}
?? ??? ?
?? ??? ?divide(xl, yl, xr, yr, g, range, rate);
?? ??? ?
?? ?}
?? ?
?? ?public void divide(int xl, int yl, int xr, int yr, Graphics g, int range, double rate) {
?? ??? ?
?? ??? ?if(Math.abs(xr - xl) <= 1 | range == 0) {
?? ??? ??? ?g.drawLine(xl, yl, xr, yr);
?? ??? ?}else {
?? ??? ??? ?int x=(xr+xl)/2;
?? ??? ??? ?int y = (yl+yr)/2;
?? ??? ??? ?
?? ??? ??? ?//按比例縮小range
?? ??? ??? ?Random rand = new Random();
?? ??? ??? ?int num = rand.nextInt(range*2) - range;
?? ??? ??? ?range = (int)(range*rate);
?? ??? ??? ?
?? ??? ??? ?//與B點(diǎn)遞歸,迭代A點(diǎn)
?? ??? ??? ?divide(x, y+num, xr, yr, g, range, rate);
?? ??? ??? ?//與A點(diǎn)遞歸,迭代B點(diǎn)
?? ??? ??? ?divide(xl, yl, x, y+num, g, range, rate);
?? ??? ??? ?
?? ??? ?}
?? ?}
}

結(jié)果為:

現(xiàn)在,我們來對(duì)整段代碼進(jìn)行分析,這個(gè)整個(gè)代碼主要通過divide方法 進(jìn)行遞歸取中點(diǎn)畫圖形,代碼如下:

public void divide(int xl, int yl, int xr, int yr, Graphics g, int range, double rate) {
?? ??? ?
?? ??? ?if(Math.abs(xr - xl) <= 1 | range == 0) {
?? ??? ??? ?g.drawLine(xl, yl, xr, yr);
?? ??? ?}else {
?? ??? ??? ?int x=(xr+xl)/2;
?? ??? ??? ?int y = (yl+yr)/2;
?? ??? ??? ?
?? ??? ??? ?//按比例縮小range
?? ??? ??? ?Random rand = new Random();
?? ??? ??? ?int num = rand.nextInt(range*2) - range;
?? ??? ??? ?range = (int)(range*rate);
?? ??? ??? ?
?? ??? ??? ?//與B點(diǎn)遞歸,迭代A點(diǎn)
?? ??? ??? ?divide(x, y+num, xr, yr, g, range, rate);
?? ??? ??? ?//與A點(diǎn)遞歸,迭代B點(diǎn)
?? ??? ??? ?divide(xl, yl, x, y+num, g, range, rate);
?? ??? ??? ?
?? ??? ?}
?? ?}

在這段代碼中,我們首先需要去判斷一下傳入進(jìn)來的兩個(gè)點(diǎn)A,B的橫坐標(biāo)的差值是否小于等于1或者是變量range等于0,如果是,則直接畫線即可,因?yàn)橄袼刈钚挝痪蜑?,不能用小數(shù)表示;否則,就要取遞歸取中點(diǎn)了,然后,通過給A,B兩個(gè)點(diǎn)上加上動(dòng)態(tài)的變化量range,從而實(shí)現(xiàn)不停的遞歸畫線,最終形成了山脈的形狀。

三、實(shí)現(xiàn)山脈的填充功能

山脈填充功能的效果圖:

那它是如何實(shí)現(xiàn)該功能的呢?

那先來看一段代碼:

public void divide(int xl, int yl, int xr, int yr, Graphics g, int range, double rate) {
?? ??? ?
?? ??? ?if(Math.abs(xr - xl) <= 10 | range == 0) {
?? ??? ??? ?g.drawLine(xl, yl, xr, yr);
?? ??? ??? ?Polygon p = new Polygon();
?? ??? ??? ?p.addPoint(xl, yl);//這里需要連接幾個(gè)點(diǎn)就添加幾個(gè)點(diǎn),而且按一定的順序,順時(shí)針和逆時(shí)針都行
?? ??? ??? ?p.addPoint(xl, 800);
?? ??? ??? ?p.addPoint(xr, 800);
?? ??? ??? ?p.addPoint(xr, yr);
?? ??? ??? ?g.fillPolygon(p);
?? ??? ??? ?
?? ??? ?}else {
?? ??? ??? ?int x=(xr+xl)/2;
?? ??? ??? ?int y = (yl+yr)/2;
?? ??? ??? ?
?? ??? ??? ?//按比例縮小range
?? ??? ??? ?Random rand = new Random();
?? ??? ??? ?int num = rand.nextInt(range*2) - range;
?? ??? ??? ?range = (int)(range*rate);
?? ??? ??? ?
?? ??? ??? ?//與B點(diǎn)遞歸,迭代A點(diǎn)
?? ??? ??? ?divide(x, y+num, xr, yr, g, range, rate);
?? ??? ??? ?//與A點(diǎn)遞歸,迭代B點(diǎn)
?? ??? ??? ?divide(xl, yl, x, y+num, g, range, rate);
?? ??? ??? ?
?? ??? ?}
?? ?}

根據(jù)上述的這段代碼,我們可以看到本文利用Polygon類創(chuàng)建了一個(gè)對(duì)象,Polygon類封裝了對(duì)坐標(biāo)空間內(nèi)封閉的二維區(qū)域的描述。 該區(qū)域由任意數(shù)量的線段界定,每個(gè)線段都是多邊形的一側(cè)。 在內(nèi)部,多邊形由(x,y)個(gè)坐標(biāo)對(duì)列表組成,其中每對(duì)坐標(biāo)定義了多邊形的頂點(diǎn),兩個(gè)連續(xù)的對(duì)是作為多邊形側(cè)面的線的端點(diǎn)。 (x,y)點(diǎn)的第一對(duì)和最后一對(duì)通過封閉多邊形的線段相連。 當(dāng)這四個(gè)點(diǎn)按一定順序(順時(shí)針和逆時(shí)針都行)連接起來,然后利用fillPolygon方法進(jìn)行填充,最終得到了上面山脈填充效果圖。

四、使用緩沖圖片畫圖

我們都知道,當(dāng)你需要畫好幾張圖片的時(shí)候,會(huì)發(fā)現(xiàn)畫的速度很慢,這個(gè)時(shí)候BufferedImage類就應(yīng)運(yùn)而生,Java中畫圖一般會(huì)使用該類創(chuàng)建對(duì)象去實(shí)現(xiàn)更快的畫圖。

它的原理: 是先將一幅圖片加載到內(nèi)存中(BufferedImage生成的圖片在內(nèi)存里有一個(gè)圖像緩沖區(qū),利用這個(gè)緩沖區(qū)我們可以很方便地操作這個(gè)圖片),提供獲得繪圖對(duì)象、圖像縮放、選擇圖像平滑度等功能,通常用來做圖片大小變換、圖片變灰、設(shè)置透明不透明等。

關(guān)鍵程序的代碼為:

//創(chuàng)建緩沖圖片
BufferedImage bufferedImage = new BufferedImage(800, 800, BufferedImage.TYPE_INT_RGB);
//獲取緩沖圖片的畫筆
Graphics buffg = bufferedImage.getGraphics();

divide(xl, yl, xr, yr, buffg, range, rate);

//將緩沖圖片畫在窗體上
g.drawImage(bufferedImage, 0, 0, null);?

讀者可以自己結(jié)合上面的 “二、整段代碼” 去比較所改動(dòng)的地方,除了這段關(guān)鍵的代碼改動(dòng)了,其余并沒有改動(dòng)

實(shí)現(xiàn)的效果圖為:

看到這樣的效果圖,我發(fā)現(xiàn)跟我之前所畫的山脈不一樣,“三、山脈填充功能” 所畫的山脈是黑色來填充,白色為天空,但我現(xiàn)在所畫的這個(gè)就剛剛相反,剛開始的我百思不得其解,因此,我想這給這個(gè)填充色不要弄成默認(rèn)的填充色,而是設(shè)置成藍(lán)色,則效果圖如下:

這個(gè)圖與上面的圖片進(jìn)行對(duì)比,可以得到的結(jié)論是: 當(dāng)使用BufferedImage類來創(chuàng)建緩沖圖片時(shí),緩沖圖片的背景色就是黑色,而當(dāng)你使用默認(rèn)的填充時(shí),Java中為了區(qū)分,會(huì)將默認(rèn)填充黑色改為默認(rèn)填充白色,只是為了做區(qū)分而已,而當(dāng)你將填充的顏色改為藍(lán)色,那么下面就是藍(lán)色了,不再是白色了。

通過上面的實(shí)驗(yàn),得到一個(gè)結(jié)論: 當(dāng)你的程序出現(xiàn)了跟你的預(yù)期結(jié)果不一致的時(shí)候,你可以去多做實(shí)驗(yàn),多設(shè)置輸出來弄清楚自己編寫代碼什么時(shí)候出錯(cuò)了!?。?/p>

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java基礎(chǔ)異常處理代碼及原理解析

    Java基礎(chǔ)異常處理代碼及原理解析

    這篇文章主要介紹了java基礎(chǔ)異常處理代碼及原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • java中URLencode、URLdecode及Base64加解密轉(zhuǎn)換

    java中URLencode、URLdecode及Base64加解密轉(zhuǎn)換

    本文主要介紹了java中URLencode、URLdecode及Base64加解密轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • java8新特性 stream流的方式遍歷集合和數(shù)組操作

    java8新特性 stream流的方式遍歷集合和數(shù)組操作

    這篇文章主要介紹了java8新特性 stream流的方式遍歷集合和數(shù)組操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • java實(shí)現(xiàn)快速打字游戲

    java實(shí)現(xiàn)快速打字游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)快速打字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • java 定義長(zhǎng)度為0的數(shù)組/空數(shù)組案例

    java 定義長(zhǎng)度為0的數(shù)組/空數(shù)組案例

    這篇文章主要介紹了java 定義長(zhǎng)度為0的數(shù)組/空數(shù)組案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • SpringBoot favicon Chrome設(shè)置問題解決方案

    SpringBoot favicon Chrome設(shè)置問題解決方案

    在本篇文章里小編給大家分享的是關(guān)于SpringBoot favicon Chrome設(shè)置問題實(shí)例內(nèi)容,小的朋友們可以參考學(xué)習(xí)下。
    2020-02-02
  • Java打包之后讀取Resources下的文件失效原因及解決方法

    Java打包之后讀取Resources下的文件失效原因及解決方法

    這篇文章主要給大家介紹了Java打包之后讀取Resources下的文件失效的問題分析和解決方法,文中通過代碼示例和圖文結(jié)合給大家講解非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • 數(shù)據(jù)結(jié)構(gòu)與算法之手撕排序算法

    數(shù)據(jù)結(jié)構(gòu)與算法之手撕排序算法

    排序算法看似簡(jiǎn)單,其實(shí)不同的算法中蘊(yùn)涵著經(jīng)典的算法策略。通過熟練掌握排序算法,就可以掌握基本的算法設(shè)計(jì)思想,本文主要介紹了Java中的排序算法,需要的朋友歡迎閱讀
    2023-04-04
  • 使用SpringBoot項(xiàng)目導(dǎo)入openfeign版本的問題

    使用SpringBoot項(xiàng)目導(dǎo)入openfeign版本的問題

    這篇文章主要介紹了使用SpringBoot項(xiàng)目導(dǎo)入openfeign版本的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Mybatis-Plus和Mybatis的區(qū)別詳解

    Mybatis-Plus和Mybatis的區(qū)別詳解

    這篇文章主要介紹了Mybatis-Plus和Mybatis的區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評(píng)論