欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實(shí)現(xiàn)遞歸山脈

 更新時(shí)間:2022年01月10日 14:38:55   作者:不愿透露姓名的Y同學(xué)  
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)遞歸山脈,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

一、遞歸山脈的要求

給定左右兩個(gè)點(diǎn)X1(Lx,Ly),X2(Rx,Ry),一個(gè)y軸動(dòng)態(tài)范圍-range~range,在該動(dòng)態(tài)范圍內(nèi)隨機(jī)選取一個(gè)數(shù)num,選取一個(gè)中點(diǎn)M,中點(diǎn)的橫坐標(biāo)為(Lx+Rx)/2,縱坐標(biāo)為(Ly+Ry)/2+num,連接左端點(diǎn)與中點(diǎn)、中點(diǎn)與右端點(diǎn)。如此反復(fù),再分別取左端點(diǎn)X1和中點(diǎn)M的中點(diǎn)、中點(diǎn)M和右端點(diǎn)X2的中點(diǎn),range范圍按一定比例縮小,連接兩點(diǎn)形成遞歸山脈。

二、創(chuàng)新點(diǎn)

之前我們調(diào)用遞歸的時(shí)候每循環(huán)一次都調(diào)用一次,后面的結(jié)果覆蓋前面的結(jié)果,形成最后的效果,這造成了之前的畫的一些圖的冗余。在本次項(xiàng)目中,我們采用不一樣的思想,在循環(huán)部分只做計(jì)算,當(dāng)最終條件滿足時(shí)再畫圖,這樣就是最后每一小段之間連接,不會(huì)造成小段覆蓋大段的冗余。

三、實(shí)現(xiàn)過程

(1)創(chuàng)建界面,綁定監(jiān)聽

package com.yzd1223.RecurMountain;

import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.JFrame;

public class RecurMountain {
?? ?public void ShowUI() {
?? ??? ?JFrame jf = new JFrame("MyPad");
?? ??? ?jf.setSize(800, 600);//畫板寬800 ?高600
?? ??? ?jf.setLocationRelativeTo(null);
?? ??? ?jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
?? ??? ?
?? ??? ?FlowLayout flayout = new FlowLayout();//設(shè)定流式布局
?? ??? ?jf.setLayout(flayout);
?? ??? ?jf.setVisible(true);//實(shí)現(xiàn)窗體可視化
?? ??? ?
?? ??? ?DrawListener dlistener = new DrawListener();
?? ??? ?jf.addMouseListener(dlistener);//界面注冊(cè)鼠標(biāo)監(jiān)聽器
?? ??? ?
?? ??? ?Graphics g = jf.getGraphics();//得到窗體畫筆
?? ??? ?dlistener.g=g;//將窗體畫筆賦給監(jiān)聽畫筆
?? ?}
?? ?
?? ?public static void main(String[] args) {//主函數(shù)
?? ??? ?RecurMountain Rmountain = new RecurMountain();
?? ??? ?Rmountain.ShowUI();
?? ?}

}

(2)鼠標(biāo)釋放時(shí)畫出遞歸山脈

package com.yzd1223.RecurMountain;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Polygon;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;

public class DrawListener implements MouseListener{
?? ?Graphics g = null;
?? ?int Lx,Ly,Rx,Ry;
?? ?int range;
?? ?double rate;
?? ?
?? ?@Override ? ?//鼠標(biāo)點(diǎn)擊
? ? public void mouseClicked(MouseEvent e) {
? ? ?? ?
? ? }

?? ?@Override ? ?//鼠標(biāo)按下 ?
? ? public void mousePressed(MouseEvent e) {
?? ??? ?
?? ?}

?? ?@Override ? ?//鼠標(biāo)釋放
? ? public void mouseReleased(MouseEvent e) {
?? ??? ?Lx=0;Ly=300;Rx=800;Ry=300;//初始左、右兩端點(diǎn)坐標(biāo)
?? ??? ?range=150;//生成-range~range的動(dòng)態(tài)取值空間
?? ??? ?rate=0.5;//range縮小比例
?? ??? ?MyRecurMountain(Lx,Ly,Rx,Ry,range,rate);//調(diào)用方法,畫遞歸山脈
?? ??? ?
?? ?}

?? ?@Override ? ?//鼠標(biāo)進(jìn)入
? ? public void mouseEntered(MouseEvent e) {
?? ??? ?
?? ?}

?? ?@Override ? ?//鼠標(biāo)退出
? ? public void mouseExited(MouseEvent e) {
?? ??? ?
?? ?}
?? ?
?? ?//自定義畫遞歸山脈圖方法
?? ?public void MyRecurMountain(int Lx,int Ly,int Rx,int Ry,int range,double rate) {

?? ??? ?if(Math.abs(Rx-Lx)<1 | range==0) {
?? ??? ??? ?g.drawLine(Lx, Ly, Rx, Ry);
?? ??? ??? ?Polygon pon = new Polygon();//利用多邊形給畫的山脈填充顏色 ? ?順時(shí)針和逆時(shí)針可以 ? 本次采用順時(shí)針
?? ??? ??? ?pon.addPoint(Lx, Ly);
?? ??? ??? ?pon.addPoint(Rx, Ry);
?? ??? ??? ?pon.addPoint(Rx, 600);
?? ??? ??? ?pon.addPoint(Lx, 600);
?? ??? ??? ?g.setColor(new Color(0,150,30,20));//設(shè)置顏色
?? ??? ??? ?g.fillPolygon(pon);//填充
?? ??? ?}else {//只做計(jì)算
?? ??? ??? ?int Mx=(Lx+Rx)/2;//中點(diǎn)坐標(biāo)
?? ??? ??? ?int My=(Ly+Ry)/2;
?? ??? ??? ?Random rand = new Random();
?? ??? ??? ?int num=rand.nextInt(range*2)-range;//隨機(jī)生成-150~150的動(dòng)態(tài)范圍
?? ??? ??? ?range = (int)(range*rate);//range范圍不斷縮小
?? ??? ??? ?
?? ??? ??? ?MyRecurMountain(Lx,Ly,Mx,My+num,range,rate);//與左端點(diǎn)遞歸
?? ??? ??? ?MyRecurMountain(Mx,My+num,Rx,Ry,range,rate);//與右端點(diǎn)遞歸
?? ??? ??? ?
?? ??? ?}
?? ?}

}

在該段代碼中我們?cè)趀lse部分中對(duì)坐標(biāo)進(jìn)行計(jì)算,隨機(jī)生成num,并按rate比例縮小range,然后調(diào)用自己MyRecurMountain,直到滿足條件Math.abs(Rx-Lx)<1 | range==0,執(zhí)行連線g.drawLine(Lx, Ly, Rx, Ry)。
在這里我們還對(duì)圖像進(jìn)行了填充,創(chuàng)建一個(gè)Polygon對(duì)象pon,將連線的兩點(diǎn)以及他們對(duì)應(yīng)x坐標(biāo)位于屏幕底部的點(diǎn)連接,形成一個(gè)封閉圖像,對(duì)該封閉圖形進(jìn)行連接填充顏色。

Polygon pon = new Polygon();//利用多邊形給畫的山脈填充顏色 ? ?順時(shí)針和逆時(shí)針可以 ? 本次采用順時(shí)針
?? ??? ??? ?pon.addPoint(Lx, Ly);//左端點(diǎn)
?? ??? ??? ?pon.addPoint(Rx, Ry);//右端點(diǎn)
?? ??? ??? ?pon.addPoint(Rx, 600);//右端點(diǎn)屏幕底部點(diǎn)
?? ??? ??? ?pon.addPoint(Lx, 600);//左端點(diǎn)屏幕底部點(diǎn)
?? ??? ??? ?g.setColor(new Color(0,150,30,20));//設(shè)置顏色
?? ??? ??? ?g.fillPolygon(pon);//填充

形成的效果如圖:

四、加緩沖提高畫圖速度

在之前的程序執(zhí)行過程中,我們發(fā)現(xiàn)畫圖很慢,于是我們想改進(jìn)畫圖速度。
是Image的一個(gè)子類,BufferedImage的主要作用就是將一副圖片加載到內(nèi)存中。BufferedImage生成的圖片在內(nèi)存里有一個(gè)圖像緩沖區(qū),利用這個(gè)緩沖區(qū)我們可以很方便的操作這個(gè)圖片,通常用來做圖片修改操作如大小變換、圖片變灰、設(shè)置圖片透明或不透明等,并且實(shí)現(xiàn)速度很快。

public void mouseReleased(MouseEvent e) {
??Lx=0;Ly=300;Rx=800;Ry=300;
??range=150;//生成-range~range的動(dòng)態(tài)取值空間
??rate=0.5;//range縮小比例
??//創(chuàng)建緩沖圖片 ?大小和窗體一致 ?類型為RGB
??BufferedImage bufferedimage = new BufferedImage(800, 600, BufferedImage.TYPE_3BYTE_BGR);
??//得到緩存圖片的畫筆
??Graphics gr=bufferedimage.getGraphics();
??//將緩存圖片的畫筆一起傳入遞歸山脈畫圖的方法中
??//這樣在下一步將緩存圖片顯示的同時(shí)就能將遞歸山脈一起畫出 ? 提高畫圖速度
??MyRecurMountain(Lx,Ly,Rx,Ry,gr,range,rate);
??//在畫板上將緩存圖片顯示出來
??g.drawImage(bufferedimage, 0, 0,800,600,null);
?? ??? ?
?? ?}

我們?cè)贛ouseReleased中創(chuàng)建一個(gè)和窗體大小一樣的RGB類型的bufferedimage對(duì)象,得到該對(duì)象的畫筆gr,將該畫筆作為畫遞歸山脈的畫筆傳入MyRecurMountain()方法中,最后將bufferedimage圖像顯示出來,這樣在顯示緩沖圖像的同時(shí)由于畫筆gr傳入了遞歸山脈方法中,遞歸山脈也能同時(shí)畫出,大大提高了畫圖速度,效果如下:

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

相關(guān)文章

  • java.net.MalformedURLException異常的解決方法

    java.net.MalformedURLException異常的解決方法

    下面小編就為大家?guī)硪黄猨ava.net.MalformedURLException異常的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • 淺談mybatis中的#和$的區(qū)別 以及防止sql注入的方法

    淺談mybatis中的#和$的區(qū)別 以及防止sql注入的方法

    下面小編就為大家?guī)硪黄獪\談mybatis中的#和$的區(qū)別 以及防止sql注入的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-10-10
  • Java的SPI機(jī)制以及基于SPI編程示例詳解

    Java的SPI機(jī)制以及基于SPI編程示例詳解

    這篇文章主要為大家介紹了Java的SPI機(jī)制以及基于SPI編程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • SpringBoot面試突擊之過濾器和攔截器區(qū)別詳解

    SpringBoot面試突擊之過濾器和攔截器區(qū)別詳解

    過濾器(Filter)和攔截器(Interceptor)都是基于?AOP(Aspect?Oriented?Programming,面向切面編程)思想實(shí)現(xiàn)的,用來解決項(xiàng)目中某一類問題的兩種“工具”,但二者有著明顯的差距,接下來我們一起來看
    2022-10-10
  • spring?boot集成redisson的最佳實(shí)踐示例

    spring?boot集成redisson的最佳實(shí)踐示例

    這篇文章主要為大家介紹了spring?boot集成redisson的最佳實(shí)踐示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • 淺談Java并發(fā)編程之Lock鎖和條件變量

    淺談Java并發(fā)編程之Lock鎖和條件變量

    這篇文章主要介紹了淺談Java并發(fā)編程之Lock鎖和條件變量,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Spring?Boot整合Log4j2.xml的問題及解決方法

    Spring?Boot整合Log4j2.xml的問題及解決方法

    這篇文章主要介紹了Spring?Boot整合Log4j2.xml的問題,本文給大家分享解決方案,需要的朋友可以參考下
    2023-09-09
  • Java源碼解析之詳解ImmutableMap

    Java源碼解析之詳解ImmutableMap

    今天給大家?guī)淼氖顷P(guān)于Java源碼的相關(guān)知識(shí),文章圍繞著Java ImmutableMap展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 給JavaBean賦默認(rèn)值并且轉(zhuǎn)Json字符串的實(shí)例

    給JavaBean賦默認(rèn)值并且轉(zhuǎn)Json字符串的實(shí)例

    這篇文章主要介紹了給JavaBean賦默認(rèn)值并且轉(zhuǎn)Json字符串的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • JSON序列化導(dǎo)致Long類型被搞成Integer的坑及解決

    JSON序列化導(dǎo)致Long類型被搞成Integer的坑及解決

    這篇文章主要介紹了JSON序列化導(dǎo)致Long類型被搞成Integer的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評(píng)論