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

Java实现递归山脉

2024-04-02 19:04:59 928人浏览 八月长安

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

摘要

本文实例为大家分享了Java实现递归山脉的具体代码,供大家参考,具体内容如下 一、递归山脉的要求 给定左右两个点X1(Lx,Ly),X2(Rx,Ry),一个y轴动态范围-range~

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

一、递归山脉的要求

给定左右两个点X1(Lx,Ly),X2(Rx,Ry),一个y轴动态范围-range~range,在该动态范围内随机选取一个数num,选取一个中点M,中点的横坐标为(Lx+Rx)/2,纵坐标为(Ly+Ry)/2+num,连接左端点与中点、中点与右端点。如此反复,再分别取左端点X1和中点M的中点、中点M和右端点X2的中点,range范围按一定比例缩小,连接两点形成递归山脉。

二、创新点

之前我们调用递归的时候每循环一次都调用一次,后面的结果覆盖前面的结果,形成最后的效果,这造成了之前的画的一些图的冗余。在本次项目中,我们采用不一样的思想,在循环部分只做计算,当最终条件满足时再画图,这样就是最后每一小段之间连接,不会造成小段覆盖大段的冗余。

三、实现过程

(1)创建界面,绑定监听

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();//设定流式布局
        jf.setLayout(flayout);
        jf.setVisible(true);//实现窗体可视化
        
        DrawListener dlistener = new DrawListener();
        jf.addMouseListener(dlistener);//界面注册鼠标监听器
        
        Graphics g = jf.getGraphics();//得到窗体画笔
        dlistener.g=g;//将窗体画笔赋给监听画笔
    }
    
    public static void main(String[] args) {//主函数
        RecurMountain Rmountain = new RecurMountain();
        Rmountain.ShowUI();
    }

}

(2)鼠标释放时画出递归山脉

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    //鼠标点击
    public void mouseClicked(MouseEvent e) {
        
    }

    @Override    //鼠标按下  
    public void mousePressed(MouseEvent e) {
        
    }

    @Override    //鼠标释放
    public void mouseReleased(MouseEvent e) {
        Lx=0;Ly=300;Rx=800;Ry=300;//初始左、右两端点坐标
        range=150;//生成-range~range的动态取值空间
        rate=0.5;//range缩小比例
        MyRecurMountain(Lx,Ly,Rx,Ry,range,rate);//调用方法,画递归山脉
        
    }

    @Override    //鼠标进入
    public void mouseEntered(MouseEvent e) {
        
    }

    @Override    //鼠标退出
    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();//利用多边形给画的山脉填充颜色    顺时针和逆时针可以   本次采用顺时针
            pon.addPoint(Lx, Ly);
            pon.addPoint(Rx, Ry);
            pon.addPoint(Rx, 600);
            pon.addPoint(Lx, 600);
            g.setColor(new Color(0,150,30,20));//设置颜色
            g.fillPolygon(pon);//填充
        }else {//只做计算
            int Mx=(Lx+Rx)/2;//中点坐标
            int My=(Ly+Ry)/2;
            Random rand = new Random();
            int num=rand.nextInt(range*2)-range;//随机生成-150~150的动态范围
            range = (int)(range*rate);//range范围不断缩小
            
            MyRecurMountain(Lx,Ly,Mx,My+num,range,rate);//与左端点递归
            MyRecurMountain(Mx,My+num,Rx,Ry,range,rate);//与右端点递归
            
        }
    }

}

在该段代码中我们在else部分中对坐标进行计算,随机生成num,并按rate比例缩小range,然后调用自己MyRecurMountain,直到满足条件Math.abs(Rx-Lx)<1 | range==0,执行连线g.drawLine(Lx, Ly, Rx, Ry)。
在这里我们还对图像进行了填充,创建一个Polygon对象pon,将连线的两点以及他们对应x坐标位于屏幕底部的点连接,形成一个封闭图像,对该封闭图形进行连接填充颜色。

Polygon pon = new Polygon();//利用多边形给画的山脉填充颜色    顺时针和逆时针可以   本次采用顺时针
            pon.addPoint(Lx, Ly);//左端点
            pon.addPoint(Rx, Ry);//右端点
            pon.addPoint(Rx, 600);//右端点屏幕底部点
            pon.addPoint(Lx, 600);//左端点屏幕底部点
            g.setColor(new Color(0,150,30,20));//设置颜色
            g.fillPolygon(pon);//填充

形成的效果如图:

四、加缓冲提高画图速度

在之前的程序执行过程中,我们发现画图很慢,于是我们想改进画图速度。
是Image的一个子类,BufferedImage的主要作用就是将一副图片加载到内存中。BufferedImage生成的图片在内存里有一个图像缓冲区,利用这个缓冲区我们可以很方便的操作这个图片,通常用来做图片修改操作如大小变换、图片变灰、设置图片透明或不透明等,并且实现速度很快。

public void mouseReleased(MouseEvent e) {
  Lx=0;Ly=300;Rx=800;Ry=300;
  range=150;//生成-range~range的动态取值空间
  rate=0.5;//range缩小比例
  //创建缓冲图片  大小和窗体一致  类型为RGB
  BufferedImage bufferedimage = new BufferedImage(800, 600, BufferedImage.TYPE_3BYTE_BGR);
  //得到缓存图片的画笔
  Graphics gr=bufferedimage.getGraphics();
  //将缓存图片的画笔一起传入递归山脉画图的方法中
  //这样在下一步将缓存图片显示的同时就能将递归山脉一起画出   提高画图速度
  MyRecurMountain(Lx,Ly,Rx,Ry,gr,range,rate);
  //在画板上将缓存图片显示出来
  g.drawImage(bufferedimage, 0, 0,800,600,null);
        
    }

我们在MouseReleased中创建一个和窗体大小一样的RGB类型的bufferedimage对象,得到该对象的画笔gr,将该画笔作为画递归山脉的画笔传入MyRecurMountain()方法中,最后将bufferedimage图像显示出来,这样在显示缓冲图像的同时由于画笔gr传入了递归山脉方法中,递归山脉也能同时画出,大大提高了画图速度,效果如下:

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

--结束END--

本文标题: Java实现递归山脉

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

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

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

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

下载Word文档
猜你喜欢
  • Java实现递归山脉
    本文实例为大家分享了Java实现递归山脉的具体代码,供大家参考,具体内容如下 一、递归山脉的要求 给定左右两个点X1(Lx,Ly),X2(Rx,Ry),一个y轴动态范围-range~...
    99+
    2022-11-12
  • Java递归方法实现山脉绘制
    本文实例为大家分享了Java递归方法实现山脉绘制的具体代码,供大家参考,具体内容如下 一、山脉绘制的思路 给定两个点A(x1,y1),B(x2,y2),递归不断取中点,同时给定一个范...
    99+
    2022-11-12
  • java实现平面山脉模型
    本文实例为大家分享了java实现平面山脉模型的具体代码,供大家参考,具体内容如下 核心方法:递归 其实当我第一次看到这个题目时,心中想的不就是个普通的递归吗,直接取两个点,然后不断取...
    99+
    2022-11-12
  • java实现直线分形山脉
    本文实例为大家分享了java实现直线分形山脉的具体代码,供大家参考,具体内容如下 直线分形 直线分形平面山脉 想要实现这个效果的思想就是,由x1、x2所确定的一条直线,我们取它们的中...
    99+
    2022-11-12
  • java实现三角形分形山脉
    本文实例为大家分享了java实现三角形分形山脉的具体代码,供大家参考,具体内容如下 三角形分形山脉原理 原型图 如图,这是三角形分形山脉的一个原型图。首先我们让x1、x2、x3三个...
    99+
    2022-11-12
  • java如何实现平面山脉模型
    这篇文章将为大家详细讲解有关java如何实现平面山脉模型,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。核心方法:递归其实当我第一次看到这个题目时,心中想的不就是个普通的递归吗,直接取两个点,...
    99+
    2023-06-26
  • 原:八皇后问题的递归和非递归Java实现
    原:八皇后问题的递归和非递归实现八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名 的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线...
    99+
    2023-06-03
  • Java递归实现迷宫游戏
    目录1.问题由来2.问题的描述3.思路分析4.代码实现5.结果输出1.问题由来 迷宫实验是取自心理学的一个古典实验。在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒中设置了许多墙...
    99+
    2022-11-12
  • java中如何实现递归排列
    递归排列递归,俗称“我 调 我 自 己”,如果从数据结构的角度来理解,其实就是栈。假如我们要求得到A、B、C的排列,流程大概如下:(0)初始状态,栈内无数据。此时栈外:A、B、C(1)将A放入栈底。此时栈外:B、C(2)将B放入栈中。此时栈...
    99+
    2020-04-05
    java 递归 排列
  • Java递归如何实现菜单树
    这篇文章将为大家详细讲解有关Java递归如何实现菜单树,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。pom文件<xml version="1.0" encod...
    99+
    2023-06-29
  • java递归算法实例
    递归三要素:明确递归终止条件;给出递归终止时的处理办法;提取重复的逻辑,缩小问题规模。1、1+2+3+…+nimport java.util.Scanner; public class Recursion { public sta...
    99+
    2018-06-15
    java入门 java 递归算法
  • 快速排序详解(递归实现与非递归实现)
    目录 一、快速排序的基本思想 二、将序列划分成左右区间的常见方法 2.1hoare版本(动图+解释+代码实现) 2.2挖坑法 2.3前后指针法 三、快速排序的初步实现 四、快速排序的优化实现 4.1快排的特殊情况 4.2对区间划分代码的...
    99+
    2023-10-24
    排序算法 算法 数据结构 c++
  • Java8使用lambda实现Java的尾递归
    前言本篇介绍的不是什么新知识,而是对前面讲解的一些知识的综合运用。众所周知,递归是解决复杂问题的一个很有效的方式,也是函数式语言的核心,在一些函数式语言中,是没有迭代与while这种概念的,因为此类的循环通通可以用递归来实现,这类语言的编译...
    99+
    2023-05-30
    java8 lambda 尾递归
  • Oracle递归函数怎么用java实现
    在Java中,你可以通过创建一个递归函数来实现Oracle递归。以下是一个使用Java实现Oracle递归的示例:```javapu...
    99+
    2023-09-26
    Oracle java
  • Java递归简单实现n的阶乘
    目录1.递归的基本概念2.递归的重要规则3.利用递归实现n的阶乘1.递归的基本概念 在说什么是递归之前,我想大家定见过这个表情包吧 什么是递归: 程序调用自身的编程技巧称为递归( ...
    99+
    2022-11-12
  • Java实现递归计算n的阶乘
    本文实例为大家分享了Java实现递归计算n的阶乘的具体代码,供大家参考,具体内容如下 问题描述 利用递归的思想实现阶乘的计算,以 n!为例 (一)、n的范围 1.n<0:n!无...
    99+
    2022-11-12
  • Java中怎么实现多线程递归
    这篇文章将为大家详细讲解有关Java中怎么实现多线程递归,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。public<T> voidParallelRecursive(f...
    99+
    2023-06-17
  • Java递归怎样实现迷宫游戏
    本篇文章为大家展示了Java递归怎样实现迷宫游戏,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.问题由来迷宫实验是取自心理学的一个古典实验。在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒中设...
    99+
    2023-06-22
  • java递归实现树形结构数据
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、树形结构是什么?二、实现方案1、stream流递归实现1.1 实体类1.2 实现类 2、jdk1.7以下实现2.1 节点类2.2 实现类...
    99+
    2023-08-18
    java 数据库 mysql
  • java全排列用递归怎么实现
    要实现全排列的递归算法,可以按照以下步骤进行:1. 定义一个递归函数,传入当前需要排列的数组、起始索引和结束索引。2. 当起始索引等...
    99+
    2023-08-11
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作