java实现平面山脉模型

本文实例为大家分享了java实现平面山脉模型的具体代码,供大家参考,具体内容如下

核心方法:递归

其实当我第一次看到这个题目时,心中想的不就是个普通的递归吗,直接取两个点,然后不断取横坐标中点,然后中点纵坐标取随机数不就行吗,代码如下

public void recur(Graphics g, double x1, double x2, double y1, double y2, int range) {
            double x3 = (x1 + x2) / 2;
            double y3 = (y1 + y2) / 2;
            if (x2-x1<= 15) {
                g.drawLine((int) x1, (int) y1, (int) x3, (int) y3);
                g.drawLine((int) x2, (int) y2, (int) x3, (int) y3);
                return;
            }
            Random rand=new Random();
            int num=rand.nextInt(range);
            recur(g, x1, x3, y1, y3-num, range);
            recur(g, x3, x2, y3-num, y2, range);                    
        }

最终效果如下

很明显这并不像山脉背景吧,然后我通过查阅相关资料了解到问题在于需要每次递归时需要将纵坐标随机数值减小,改进后代码如下

public void recur(Graphics g, double x1, double x2, double y1, double y2, int range) {
//range我用的是300,大家可以自己调节
            double x3 = (x1 + x2) / 2;
            double y3 = (y1 + y2) / 2;
            if (x2-x1<= 1|range==0) {
                g.drawLine((int) x1, (int) y1, (int) x3, (int) y3);
                g.drawLine((int) x2, (int) y2, (int) x3, (int) y3);
                return;
            }
            Random rand=new Random();
            int num=rand.nextInt(range*2)-range;
            range*=0.5;
            recur(g, x1, x3, y1, y3+num, range);
            recur(g, x3, x2, y3+num, y2, range);                    
        }

效果很接近山脉

然后我又想可以使用Polygon类来对山脉进行颜色填充,同时传入不同的透明度进行不同山脉的区别一定更美观,废话不多说,上代码

public void recur(Graphics g, double x1, double x2, double y1, double y2, int range,int alp) {
        //实例range用的是300
        //四座山脉透明度分别为220,180,120,40
        double x3 = (x1 + x2) / 2;
        double y3 = (y1 + y2) / 2;
        if (x2-x1<= 1|range==0) {
            g.drawLine((int) x1, (int) y1, (int) x3, (int) y3);
            g.drawLine((int) x2, (int) y2, (int) x3, (int) y3);
            Polygon p=new Polygon();
            p.addPoint((int)x3, (int)y3);
            p.addPoint((int)x1, (int)y1);
            p.addPoint((int)x1, 800);
            p.addPoint((int)x2, 800);
            p.addPoint((int)x2, (int)y2);
            g.setColor(new Color(0,0,0,alp));
            g.fillPolygon(p);
            return;
        }
        Random rand=new Random();
        int num=rand.nextInt(range*2)-range;
        range*=0.5;
        //上面的0.5也可以改变,他控制的是循环次数和山脉的陡峭度,大家可以改变尝试
        recur(g, x1, x3, y1, y3+num, range,alp);
        recur(g, x3, x2, y3+num, y2, range,alp);
    }

大功告成

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

(0)

相关推荐

  • Java递归方法实现山脉绘制

    本文实例为大家分享了Java递归方法实现山脉绘制的具体代码,供大家参考,具体内容如下 一.山脉绘制的思路 给定两个点A(x1,y1),B(x2,y2),递归不断取中点,同时给定一个范围[-range,range]和一个比率rate.每次取中点后,这个中点的纵坐标的值加上这个范围内的随机值,同时通过range=range*rate来缩小这个变化的范围,最后,通过相邻的点连线,绘制成一个山脉的形状. 二.整段代码如下 package com.yf1031; import java.awt.FlowL

  • Java分形绘制山脉模型

    本文实例为大家分享了Java分形绘制山脉模型的具体代码,供大家参考,具体内容如下 如何绘制一个山脉 构思设计 任意选取三个点,选取一个范围和一个比率,每一个都对这三个点取中点,中点的纵坐标加一个在范围内的随机值,当完成一次递归之后缩小这个范围即range*rate连线的时候,将三角形的一个点和这个点的两条边生成的中点相连,最后将三条边的中点相连所以应该有四个递归调用. 代码实现及注解 package Mountion; import java.awt.Graphics; import java.

  • Java实现递归山脉

    本文实例为大家分享了Java实现递归山脉的具体代码,供大家参考,具体内容如下 一.递归山脉的要求 给定左右两个点X1(Lx,Ly),X2(Rx,Ry),一个y轴动态范围-range~range,在该动态范围内随机选取一个数num,选取一个中点M,中点的横坐标为(Lx+Rx)/2,纵坐标为(Ly+Ry)/2+num,连接左端点与中点.中点与右端点.如此反复,再分别取左端点X1和中点M的中点.中点M和右端点X2的中点,range范围按一定比例缩小,连接两点形成递归山脉. 二.创新点 之前我们调用递归

  • java实现平面山脉模型

    本文实例为大家分享了java实现平面山脉模型的具体代码,供大家参考,具体内容如下 核心方法:递归 其实当我第一次看到这个题目时,心中想的不就是个普通的递归吗,直接取两个点,然后不断取横坐标中点,然后中点纵坐标取随机数不就行吗,代码如下 public void recur(Graphics g, double x1, double x2, double y1, double y2, int range) {             double x3 = (x1 + x2) / 2;       

  • MapStruct处理Java中实体与模型间不匹配属性转换的方法

    摘要: 前面介绍了MapStrut简单用法,MapStrut的最重要的特点就是处理Java中实体与模型间不匹配属性的转换. 实体模型 有一个User对象: public class User { private Integer id; private String name; private double account; private boolean married; // setters, getters, toString() } 有一个Employee 对象: public class

  • Java三种IO模型原理实例详解

    Java中IO的模型分为三种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. BIO[同步阻塞] 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请求,如果有的话,客户端会线程会等待请求结束后才继续执行. NIO[同步非阻塞] NIO本身是基于事

  • 详解Java中的线程模型与线程调度

    JAVA线程模型 线程的实现主要有3种方式: 使用内核线程实现(1:1) 使用用户线程实现(1:N) 使用用户线程加轻量级进程实现(N:M) 使用内核线程实现(Kernel-Level Thread, KLT)(1:1) 内核线程就是直接由操作系统内核支持的线程,这种线程由内核来完成线程的切换,内核通过操作调度器对线程进行调度,并负责将线程的任务映射到各个处理器上. 程序一般不会直接去使用内核,而是去使用线程的一种高级接口--轻量级进程(Light Weight Process,LWP),轻量级

  • Java 中的io模型详解

    1. BIO 我们先看一个 Java 例子: package cn.bridgeli.demo;   import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket;   /**  * @author bridgel

  • 一篇文章总结Java虚拟机内存区域模型

    首先我们来看一下Java运行时的数据区域,Java虚拟机在执行Java程序的过程中会把它所管理的内存划分成若干个不同的数据区域,这些区域都有各自的用途,各自的创建和销毁的时间.有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁. 我们来看一下Java虚拟机运行时的数据区 结合这张图,下面逐个来分析一下每个数据区域的特点. 1.程序计数器 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器. 什么意思呢?我们知道,CPU的计算时间是以分片的

  • Java设计模式的事件模型详解

    目录 监听模式 参与的角色 事件.事件源.监听器之间的关系 举个粒子 总结 监听模式 事件模型实现了监听模式,监听模式简单来说就是事件源经过事件的封装传给监听器,当事件源触发事件后,监听器接收到事件对象可以回调事件的方法. 参与的角色 事件模型有三种角色参与,分别是:事件源.事件.事件监听器. 事件 事件继承自java.util.EventObject类,封装了事件源对象及跟事件相关的信息,代码可以说是很简单了. public class EventObject implements java.

随机推荐