最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實現(xiàn)三角形分形山脈

 更新時間:2022年01月10日 15:08:38   作者:Benjamin.  
這篇文章主要為大家詳細介紹了java實現(xiàn)三角形分形山脈,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了java實現(xiàn)三角形分形山脈的具體代碼,供大家參考,具體內(nèi)容如下

三角形分形山脈原理

原型圖

如圖,這是三角形分形山脈的一個原型圖。首先我們讓x1、x2、x3三個點組成的三角形的各條邊的中點mid1、mid2、mid3可以在大三角形內(nèi)部畫一個三角形,這時就會有四個小三角形,那么我們對這四個小三角形做同樣的操作,如此就可以畫出雛形了。接下來我們只需要對內(nèi)部每個需要連線三角形的y坐標做相關(guān)操作就可以了。

效果圖

山脈分形之前的問題

重寫equals與hasCode方法

重寫的原因

就像下面這張圖所展示的效果一樣,其中出現(xiàn)了一個三角形分形兩邊的情況,導(dǎo)致下面這張圖沒有上面的圖看上去更有山脈的感覺。

出現(xiàn)這種情況是因為其中一條邊的中點向兩邊波動時,它的兩個頂點不同方向連線后留下的大片空白區(qū)域?qū)е碌模ㄒ娚蠄D)。所以我們要想辦法記錄這條邊的中點,使它們只記錄它的一個中點,這樣我們就能解決大片空白區(qū)域的問題了。

equals與hasCode

這里我們用到了hashMap,那么就牽涉到hashMap存儲的問題。如圖,hashMap在存儲對象數(shù)據(jù)時會通過它的hasCode與哈希函數(shù)計算該對象的存儲位置,如果這個位置沒有存儲數(shù)據(jù),則直接存儲這個對象;如果存在有對象,我們則需要比較他們的hasCode來比較他們是否是同一個對象,如果是true已經(jīng)存在這個對象的情況下,那么我們就不操作,如果是false還沒有存入這個對象,我們則在這個存儲位置的后面將這個對象鏈接進來就好了。綜上,我們要自己建立一個數(shù)據(jù)類型來記錄這條邊的兩個點的x、y坐標及波動后中點的y坐標,所以我們要重寫equals與hasCode方法。

三角形山脈代碼

import java.awt.Color;
import java.awt.Graphics;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

import javax.swing.JFrame;

public class Recursive extends JFrame{

? ? private int[] xLabel;
? ? private int[] yLabel;
? ? Map<Object, Integer> map = new HashMap<>();
? ? Integer shiftY = 100;

? ? public void drawTri(Graphics g, int x1, int y1, int x2, int y2, int x3, int y3,
? ? ? ? ? ? ? ? ? ? ? ? int deep, double range) {

? ? ? ? xLabel = new int[] {x1, x2, x3};
? ? ? ? yLabel = new int[] {y1, y2, y3};

? ? ? ? int shiftY1 = 0;
? ? ? ? int shiftY2 = 0;
? ? ? ? int shiftY3 = 0;

? ? ? ? if(deep-- < 0) {

? ? ? ? ? ? Color color = new Color(43, 43, 41, 233);

? ? ? ? ? ? g.setColor(color);

? ? ? ? ? ? g.drawPolygon(xLabel, yLabel, 3);

? ? ? ? ? ? return;

? ? ? ? }

? ? ? ? range *= 0.62;

? ? ? ? int midX1 = (x1 + x2) / 2;
? ? ? ? int midX2 = (x2 + x3) / 2;
? ? ? ? int midX3 = (x3 + x1) / 2;

? ? ? ? int midY1 = (y1 + y2) / 2;
? ? ? ? int midY2 = (y2 + y3) / 2;
? ? ? ? int midY3 = (y3 + y1) / 2;

? ? ? ? //其中每個點相對應(yīng)
? ? ? ? if(verify(x2, y2, x1, y1)){
? ? ? ? ? ? shiftY1 = shiftY;
? ? ? ? } else{
? ? ? ? ? ? shiftY1 = shift(midY1,range);
? ? ? ? }
? ? ? ? if (verify(x3, y3, x2, y2)) {
? ? ? ? ? ? shiftY2 = shiftY;
? ? ? ? } else {
? ? ? ? ? ? shiftY2 = shift(midY2,range);
? ? ? ? }
? ? ? ? if(verify(x1, y1, x3, y3)) {
? ? ? ? ? ? shiftY3 = shiftY;
? ? ? ? } else{
? ? ? ? ? ? shiftY3 = shift(midY3,range);
? ? ? ? }

? ? ? ? ? ? //邊對象對應(yīng),震蕩點
? ? ? ? ? ? //存入邊對象
? ? ? ? map.put(new LineObject(x1, y1, x2, y2), shiftY1);
? ? ? ? map.put(new LineObject(x2, y2, x3, y3), shiftY2);
? ? ? ? map.put(new LineObject(x3, y3, x1, y1), shiftY3);

? ? ? ? drawTri(g, x1, y1, midX1, shiftY1, midX3, shiftY3, deep, range); ?//頂
? ? ? ? drawTri(g, midX1, shiftY1, x2, y2, midX2, shiftY2, deep, range); ? //左
? ? ? ? drawTri(g, midX3, shiftY3, midX2, shiftY2, x3, y3, deep, range); ?//右
? ? ? ? drawTri(g, midX2, shiftY2, midX3, shiftY3, midX1, shiftY1, deep, range); //中

? ? }

? ? public int shift(int y, double range) {
? ? ? ? return y += (Math.random() * 2 - 1) * range;
? ? }

? ? public boolean verify(int x1, int y1, int x2, int y2) {

? ? ? ? LineObject lineObject = new LineObject(x1, y1, x2, y2);

? ? ? ? if(map.containsKey(lineObject)){
? ? ? ? ? ? shiftY = map.get(lineObject);
? ? ? ? ? ? return true;
? ? ? ? }
? ? ? ? return false;
? ? }
? ? public void UI() {
? ? ?? ?this.setTitle("test");
? ? ?? ?this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
? ? ?? ?this.setSize(1000,1000);
? ? ?? ?this.setLocationRelativeTo(null);
? ? ?? ?this.setVisible(true);
? ? ?? ?
? ? ?? ?Graphics g=this.getGraphics();
? ? ?? ?RecursiveListener rl=new RecursiveListener();
? ? ?? ?this.addMouseListener(rl);
? ? ?? ?rl.g=g;
? ? }

}

class LineObject {
? ? int x1;
? ? int y1;
? ? int x2;
? ? int y2;

? ? public LineObject(int x1, int y1, int x2, int y2) {
? ? ? ? this.x1 = x1;
? ? ? ? this.x2 = x2;
? ? ? ? this.y1 = y1;
? ? ? ? this.y2 = y2;

? ? }

? ? @Override
? ? public boolean equals(Object o) {
? ? ? ? if (this == o) return true;
? ? ? ? if (o == null || getClass() != o.getClass()) return false;
? ? ? ? LineObject that = (LineObject) o;
? ? ? ? return x1 == that.x1 &&
? ? ? ? ? ? ? ? y1 == that.y1 &&
? ? ? ? ? ? ? ? x2 == that.x2 &&
? ? ? ? ? ? ? ? y2 == that.y2;
? ? }

? ? @Override
? ? public int hashCode() {
? ? ? ? return Objects.hash(x1, y1, x2, y2);
? ? }

}

三角形山脈監(jiān)聽器

import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class TriangleListener implements MouseListener {

?? ?int x1, x2, x3, y1, y2, y3;
?? ?int count = 0;
?? ?Graphics g;

?? ?@Override
?? ?public void mouseClicked(MouseEvent e) {
?? ??? ?// TODO Auto-generated method stub
?? ??? ?g.drawOval(e.getX() - 4, e.getY() - 4, 8, 8);
?? ??? ?if (count == 0) {
?? ??? ??? ?x1 = e.getX();
?? ??? ??? ?y1 = e.getY();
?? ??? ??? ?count++;
?? ??? ?} else if (count == 1) {
?? ??? ??? ?x2 = e.getX();
?? ??? ??? ?y2 = e.getY();
?? ??? ??? ?count++;
?? ??? ??? ?g.drawLine(x1, y1, x2, y2);
?? ??? ?} else {
?? ??? ??? ?x3 = e.getX();
?? ??? ??? ?y3 = e.getY();
?? ??? ??? ?g.drawLine(x1, y1, x3, y3);
?? ??? ??? ?g.drawLine(x2, y2, x3, y3);
?? ??? ??? ?count = 0;
?? ??? ??? ?Triangle triangle = new Triangle();
?? ??? ??? ?triangle.recursion(x1, y1, x2, y2, x3, y3, g, 9, 800);
?? ??? ?}

?? ?}

?? ?@Override
?? ?public void mousePressed(MouseEvent e) {
?? ??? ?// TODO Auto-generated method stub

?? ?}

?? ?@Override
?? ?public void mouseReleased(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)文章

  • Feign遠程調(diào)用參數(shù)里面內(nèi)容丟失的解決方案

    Feign遠程調(diào)用參數(shù)里面內(nèi)容丟失的解決方案

    這篇文章主要介紹了Feign遠程調(diào)用參數(shù)里面內(nèi)容丟失的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java利用讀寫的方式實現(xiàn)音頻播放代碼實例

    Java利用讀寫的方式實現(xiàn)音頻播放代碼實例

    這篇文章主要介紹了Java利用讀寫的方式實現(xiàn)音頻播放代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • JAVA線程用法詳解

    JAVA線程用法詳解

    這篇文章主要介紹了JAVA線程用法,配合實例針對Java中線程的開啟、sleep、合并與讓出等進行了較為深入的分析,需要的朋友可以參考下
    2014-08-08
  • SpringBoot如何獲取src/main/resource路徑下的文件

    SpringBoot如何獲取src/main/resource路徑下的文件

    這篇文章主要介紹了SpringBoot如何獲取src/main/resource路徑下的文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 一文搞懂Spring?Security異常處理機制

    一文搞懂Spring?Security異常處理機制

    這篇文章主要為大家詳細介紹一下Spring?Security異常處理機制,文中的示例代碼講解詳細,對我們學(xué)習(xí)Spring?Security有一定幫助,感興趣的可以學(xué)習(xí)一下
    2022-07-07
  • Redisson分布式鎖源碼解析

    Redisson分布式鎖源碼解析

    文章給大家分享了關(guān)于Redisson分布式鎖源碼相關(guān)的知識點內(nèi)容,有興趣的朋友們可以參考學(xué)習(xí)下。
    2018-08-08
  • Spring boot外部配置(配置中心化)詳解

    Spring boot外部配置(配置中心化)詳解

    這篇文章主要給大家介紹了關(guān)于Spring boot外部配置(配置中心化)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • RabbitMq報錯reply-code=406 reply-text=PRECONDITION_FAILED解決

    RabbitMq報錯reply-code=406 reply-text=PRECONDITION_FAILED

    這篇文章主要為大家介紹了RabbitMq報錯reply-code=406 reply-text=PRECONDITION_FAILED分析解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 將Dubbo服務(wù)打包成Jar包的操作步驟

    將Dubbo服務(wù)打包成Jar包的操作步驟

    Dubbo 是一款流行的 Java RPC 框架,它提供了高性能、透明化的 RPC 遠程服務(wù)調(diào)用方案,在開發(fā)基于 Dubbo 的服務(wù)時,我們通常需要將服務(wù)代碼打包成可發(fā)布的 JAR 包,本文將詳細介紹如何將 Dubbo 服務(wù)打包成 JAR 包,并提供相應(yīng)的配置和步驟,需要的朋友可以參考下
    2024-12-12
  • java實現(xiàn)md5加密示例

    java實現(xiàn)md5加密示例

    這篇文章主要介紹了java實現(xiàn)md5加密示例,需要的朋友可以參考下
    2014-05-05

最新評論

揭东县| 杭州市| 根河市| 绥化市| 东兰县| 徐州市| 江口县| 唐海县| 庆安县| 轮台县| 新巴尔虎右旗| 丰台区| 祁阳县| 灵台县| 清徐县| 蚌埠市| 荆州市| 南丰县| 克山县| 乐平市| 奉化市| 互助| 张家界市| 瑞丽市| 沁水县| 思茅市| 逊克县| 蓬安县| 太和县| 重庆市| 井冈山市| 桃园市| 天台县| 那曲县| 乐都县| 湛江市| 利辛县| 江永县| 沙坪坝区| 黄山市| 沾化县|