广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java递归方法实现山脉绘制
  • 415
分享到

Java递归方法实现山脉绘制

2024-04-02 19:04:59 415人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

本文实例为大家分享了Java递归方法实现山脉绘制的具体代码,供大家参考,具体内容如下 一、山脉绘制的思路 给定两个点A(x1,y1),B(x2,y2),递归不断取中点,同时给定一个范

本文实例为大家分享了Java递归方法实现山脉绘制的具体代码,供大家参考,具体内容如下

一、山脉绘制的思路

给定两个点A(x1,y1),B(x2,y2),递归不断取中点,同时给定一个范围[-range,range]和一个比率rate。每次取中点后,这个中点的纵坐标的值加上这个范围内的随机值,同时通过range=range*rate来缩小这个变化的范围,最后,通过相邻的点连线,绘制成一个山脉的形状。

二、整段代码如下

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点递归,迭代A点
            divide(x, y+num, xr, yr, g, range, rate);
            //与A点递归,迭代B点
            divide(xl, yl, x, y+num, g, range, rate);
            
        }
    }
}

结果为:

现在,我们来对整段代码进行分析,这个整个代码主要通过divide方法 进行递归取中点画图形,代码如下:

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点递归,迭代A点
            divide(x, y+num, xr, yr, g, range, rate);
            //与A点递归,迭代B点
            divide(xl, yl, x, y+num, g, range, rate);
            
        }
    }

在这段代码中,我们首先需要去判断一下传入进来的两个点A,B的横坐标的差值是否小于等于1或者是变量range等于0,如果是,则直接画线即可,因为像素最小单位就为1,不能用小数表示;否则,就要取递归取中点了,然后,通过给A,B两个点上加上动态的变化量range,从而实现不停的递归画线,最终形成了山脉的形状。

三、实现山脉的填充功能

山脉填充功能的效果图:

那它是如何实现该功能的呢?

那先来看一段代码:

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);//这里需要连接几个点就添加几个点,而且按一定的顺序,顺时针和逆时针都行
            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点递归,迭代A点
            divide(x, y+num, xr, yr, g, range, rate);
            //与A点递归,迭代B点
            divide(xl, yl, x, y+num, g, range, rate);
            
        }
    }

根据上述的这段代码,我们可以看到本文利用Polygon类创建了一个对象,Polygon类封装了对坐标空间内封闭的二维区域的描述。 该区域由任意数量的线段界定,每个线段都是多边形的一侧。 在内部,多边形由(x,y)个坐标对列表组成,其中每对坐标定义了多边形的顶点,两个连续的对是作为多边形侧面的线的端点。 (x,y)点的第一对和最后一对通过封闭多边形的线段相连。 当这四个点按一定顺序(顺时针和逆时针都行)连接起来,然后利用fillPolygon方法进行填充,最终得到了上面山脉填充效果图。

四、使用缓冲图片画图

我们都知道,当你需要画好几张图片的时候,会发现画的速度很慢,这个时候BufferedImage类就应运而生,Java中画图一般会使用该类创建对象去实现更快的画图。

它的原理: 是先将一幅图片加载到内存中(BufferedImage生成的图片在内存里有一个图像缓冲区,利用这个缓冲区我们可以很方便地操作这个图片),提供获得绘图对象、图像缩放、选择图像平滑度等功能,通常用来做图片大小变换、图片变灰、设置透明不透明等。

关键程序的代码为:

//创建缓冲图片
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); 

读者可以自己结合上面的 “二、整段代码” 去比较所改动的地方,除了这段关键的代码改动了,其余并没有改动

实现的效果图为:

看到这样的效果图,我发现跟我之前所画的山脉不一样,“三、山脉填充功能” 所画的山脉是黑色来填充,白色为天空,但我现在所画的这个就刚刚相反,刚开始的我百思不得其解,因此,我想这给这个填充色不要弄成默认的填充色,而是设置成蓝色,则效果图如下:

这个图与上面的图片进行对比,可以得到的结论是: 当使用BufferedImage类来创建缓冲图片时,缓冲图片的背景色就是黑色,而当你使用默认的填充时,Java中为了区分,会将默认填充黑色改为默认填充白色,只是为了做区分而已,而当你将填充的颜色改为蓝色,那么下面就是蓝色了,不再是白色了。

通过上面的实验,得到一个结论: 当你的程序出现了跟你的预期结果不一致的时候,你可以去多做实验,多设置输出来弄清楚自己编写代码什么时候出错了!!!

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

--结束END--

本文标题: Java递归方法实现山脉绘制

本文链接: https://www.lsjlt.com/news/162070.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Java递归方法实现山脉绘制
    本文实例为大家分享了Java递归方法实现山脉绘制的具体代码,供大家参考,具体内容如下 一、山脉绘制的思路 给定两个点A(x1,y1),B(x2,y2),递归不断取中点,同时给定一个范...
    99+
    2022-11-12
  • Java实现递归山脉
    本文实例为大家分享了Java实现递归山脉的具体代码,供大家参考,具体内容如下 一、递归山脉的要求 给定左右两个点X1(Lx,Ly),X2(Rx,Ry),一个y轴动态范围-range~...
    99+
    2022-11-12
  • Java递归实现菜单树的方法详解
    pom文件 <xml version="1.0" encoding="UTF-8"> <project xmlns="http://maven.apache.or...
    99+
    2022-11-13
  • php递归方法如何实现
    本篇内容介绍了“php递归方法如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php递归方法的实现方式:1、通过静态变量方式实现,代码...
    99+
    2023-07-04
  • php递归方法怎么实现
    本教程操作环境:windows7系统、PHP8.1版、Dell G3电脑。php递归方法怎么实现?递归的三种常用技法:静态变量、全局变量、引用一 静态变量方式function loop(){ static $i = 0; echo $i...
    99+
    2022-10-24
  • mysql实现递归查询的方法
    小编给大家分享一下mysql实现递归查询的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!mysql实现递归查询的方法:首先创建表,并初始化数据;然后向下递归,利用【find_in_set(...
    99+
    2022-10-18
  • python中如何实现递归方法
    小编给大家分享一下python中如何实现递归方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1.递归概念递归是解决问题的一种方法,它将问题不断地分成更小的子问题,直到子问题可以用普通的方法解决。通常情况下,递归会使用一个...
    99+
    2023-06-22
  • python非递归全排列实现方法
    刚刚开始学习python,当前看到了函数这一节。结合数组操作,写了个非递归的全排列生成。原理是插入法,也就是在一个有n个元素的已有排列中,后加入的元素,依次在前,中,后的每一个位置插入,生成n+1个新的全排...
    99+
    2022-06-04
    递归 排列 方法
  • Mysql树形递归查询的实现方法
    前言 对于数据库中的树形结构数据,如部门表,有时候,我们需要知道某部门的所有下属部分或者某部分的所有上级部门,这时候就需要用到mysql的递归查询 最近在做项目迁移,Oracle版本的迁到Mysql版本,遇...
    99+
    2022-10-18
  • Golang函数的递归调用实现方法
    Golang函数的递归调用实现方法随着Golang在软件开发中的广泛应用,函数的递归调用成为了程序员们实现复杂逻辑和算法的重要手段。递归调用是指在函数内部不断地调用自身,直至满足某一个条件终止循环。在本文中,我们将探讨Golang函数的递归...
    99+
    2023-05-17
    函数 Golang 递归调用
  • DropDownList显示的C#递归的实现方法
    本篇内容介绍了“DropDownList显示的C#递归的实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#递归实现Drop...
    99+
    2023-06-17
  • Java 递归遍历实现linux tree命令方式
    目录Java 递归遍历实现linux tree命令递归调用的函数traversalprintName函数java实现zTree的遍历Java 递归遍历实现linux tree命令 看...
    99+
    2022-11-12
  • JAVA递归生成树形菜单的实现方法是什么
    今天小编给大家分享一下JAVA递归生成树形菜单的实现方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。  递归生成一个...
    99+
    2023-06-26
  • java递归实现拼装多个api的结果操作方法
    工作需要,经常需要实现api接口,但每次都是大同小异,我就考虑是否可以将这种重复性的工作配置化。 我就写一个模板api,然后所有的HTTP请求过来,根据不同的配置返回不同结果。 最开...
    99+
    2022-11-12
  • python二分查找算法的递归实现方法
    本文实例讲述了python二分查找算法的递归实现方法。分享给大家供大家参考,具体如下: 这里先提供一段二分查找的代码: def binarySearch(alist, item): first = ...
    99+
    2022-06-04
    递归 算法 方法
  • MySQL实现递归查询的方法有哪些
    MySQL中实现递归查询的方法有以下几种:1. 使用存储过程:可以在存储过程中使用递归的方式进行查询。在每次递归调用时,将查询到的结...
    99+
    2023-09-11
    MySQL
  • python递归&迭代方法实现链表反转
    定义链表node结构: class ListNode:       def __init__(self,data):         self.data = data        ...
    99+
    2022-11-13
  • 使用Java实现算法为什么慎用递归
    本篇文章为大家展示了使用Java实现算法为什么慎用递归,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。现象 :递归是我们很经典的一种算法实现,可以很好的描述一个算法的原理!对于算法的描述、表现和代码结...
    99+
    2023-06-17
  • 基于Vue技术实现递归组件的方法
    描述 本文介绍的是基于Vue技术实现递归组件的方法。用Vue实现一级列表、二级列表的展示很简单,但是想要实现无限级,光是套上一个又一个的v-for是行不通的,这个时候就需要用到递归的...
    99+
    2022-11-12
  • java基于递归算法实现汉诺塔问题实例
    本文实例讲述了java基于递归算法实现汉诺塔问题。分享给大家供大家参考,具体如下:package test;import java.util.List;import java.util.ArrayList;import java.util....
    99+
    2023-05-31
    java 递归算法 汉诺塔
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作