我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java实现三角形分形山脉

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java实现三角形分形山脉

本文实例为大家分享了java实现三角形分形山脉的具体代码,供大家参考,具体内容如下

三角形分形山脉原理

原型图

如图,这是三角形分形山脉的一个原型图。首先我们让x1、x2、x3三个点组成的三角形的各条边的中点mid1、mid2、mid3可以在大三角形内部画一个三角形,这时就会有四个小三角形,那么我们对这四个小三角形做同样的操作,如此就可以画出雏形了。接下来我们只需要对内部每个需要连线三角形的y坐标做相关操作就可以了。

效果图

山脉分形之前的问题

重写equals与hasCode方法

重写的原因

就像下面这张图所展示的效果一样,其中出现了一个三角形分形两边的情况,导致下面这张图没有上面的图看上去更有山脉的感觉。

出现这种情况是因为其中一条边的中点向两边波动时,它的两个顶点不同方向连线后留下的大片空白区域导致的(见上图)。所以我们要想办法记录这条边的中点,使它们只记录它的一个中点,这样我们就能解决大片空白区域的问题了。

equals与hasCode

这里我们用到了hashMap,那么就牵涉到hashMap存储的问题。如图,hashMap在存储对象数据时会通过它的hasCode与哈希函数计算该对象的存储位置,如果这个位置没有存储数据,则直接存储这个对象;如果存在有对象,我们则需要比较他们的hasCode来比较他们是否是同一个对象,如果是true已经存在这个对象的情况下,那么我们就不操作,如果是false还没有存入这个对象,我们则在这个存储位置的后面将这个对象链接进来就好了。综上,我们要自己建立一个数据类型来记录这条边的两个点的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;

        //其中每个点相对应
        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);
        }

            //边对象对应,震荡点
            //存入边对象
        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);
    }

}

三角形山脉监听器

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

    }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java实现三角形分形山脉

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java分形怎么绘制山脉模型

这篇文章主要为大家分析了Java分形怎么绘制山脉模型的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Java分形怎么绘制山脉模型”的知识吧。如何绘制一个山脉构
2023-06-26

纯css如何实现三角形

本篇内容介绍了“纯css如何实现三角形”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!css实现三角的原理:首先确定底边是哪个方向,并设置哪个
2023-07-04

怎么用Java实现输出三角形数字

这篇文章主要介绍“怎么用Java实现输出三角形数字”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用Java实现输出三角形数字”文章能帮助大家解决问题。题目:给定一个如下图所示的数字三角形,从顶部
2023-06-26

CSS实现带阴影的三角形

怎么用CSS画一个带阴影的三角形呢 ?有童鞋说, 这还不简单吗网上有很多解决方案, 但其实大多都是实现不太完美的, 存在一些问题假设我们做一个向下的三角形箭头常见的方法大致有两种1.通过边框控制, border-left和border-ri
2023-06-03

glsl buffer如何实现渐变三角形

本文小编为大家详细介绍“glsl_buffer如何实现渐变三角形”,内容详细,步骤清晰,细节处理妥当,希望这篇“glsl_buffer如何实现渐变三角形”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。三角形我们通过
2023-07-05

使用Java怎么实现一个帕斯卡三角形

使用Java怎么实现一个帕斯卡三角形?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。杨辉三角形性质: 每行数字左右对称,由 1 开始逐渐变大,然后变小,回到 1。
2023-05-30

使用css怎么实现一个三角形

使用css怎么实现一个三角形?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。使用CSS画三角形第一步首先,先来一个div,然后给这个div加一层border,并且
2023-06-14

css实现三角形的代码怎么写

这篇文章主要介绍了css实现三角形的代码怎么写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇css实现三角形的代码怎么写文章都会有所收获,下面我们一起来看看吧。1.首先创建一个html文件。2.在html文件中
2023-07-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录