java---实现3D山脉模型

2024-03-03 03:59
文章标签 java 实现 模型 3d 山脉

本文主要是介绍java---实现3D山脉模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

核心理念:递归

其实3D山脉基本思路可以认为是平面山脉和谢冰斯基三角形的结合体,敲代码之前请大家先了解一个取中点时第一个技巧,即取两个点中点时需要让中点的横坐标或纵坐标或同时减或加上一个极小的随机值,来产生山脉连绵起伏的效果,我通过查阅相关资料发现有些人将其称为中值震荡点,咱们就暂且这么称呼它吧

初步思路:

1.图中随机选取三个点

2.然后取中值震荡点

3.连接相应的顶点和中值震荡点

4.然后不断迭代,迭代到一定次数结束迭代

代码如下

public void recur3D(Graphics g, double x1,  double y1,double x2, double y2,double x3,double y3, int range) {                                                if (range==0) {int[] px = { (int)x1, (int)x2, (int)x3 };int[] py = { (int)y1, (int)y2, (int)y3 };g.drawPolygon(px, py, 3);return;}else {Random rand=new Random();int num=rand.nextInt(range*2)-range;double ax,ay,bx,by,cx,cy;ax = (x1 + x2) / 2 ;ay = (y1 + y2) / 2 + num;bx = (x1 + x3) / 2;by = (y1 + y3) / 2 + num;cx = (x2 + x3) / 2;cy = (y2 + y3) / 2 + num;//以上全部都是在y轴上取震荡点,造成起伏效果,其实也可以在x轴上震荡range*=0.55;recur3D(g, x1, y1, ax, ay, bx, by, range);recur3D(g, x2, y2, ax, ay, cx, cy, range);recur3D(g, x3, y3, cx, cy, bx, by, range);recur3D(g, ax, ay, cx, cy, bx, by, range);}}

效果图

 结果我发现山脉上出现了许多的裂缝,其实这不难理解在取中值震荡点时可能取到同一个点,从而造成割裂,解决方案的话就是使用一个数组储存中值震荡点,如果取到过就直接使用,如果未储存就求取中值震荡点

代码如下

public void recur3D(Graphics g, double x1,  double y1,double x2, double y2,double x3,double y3, int range) {//我用的range为100if (range==0) {int[] px = { (int)x1, (int)x2, (int)x3 };int[] py = { (int)y1, (int)y2, (int)y3 };		g.drawPolygon(px, py, 3);return;}else {Random rand=new Random();int num=rand.nextInt(range*2)-range;double ax,ay,bx,by,cx,cy;int u=0,j=0,o=0;boolean f1=true;boolean f2=true;boolean f3=true;for(int i=0;i<counts;i++) {if((x1 == po[i].x1&&x2==po[i].x2&&y1==po[i].y1&&y2==po[i].y2)||(x1==po[i].x2&&x2==po[i].x1&&y1==po[i].y2&&y2==po[i].y1)){f1=false;u=i;break;}}for(int i=0;i<counts;i++) {if((x2 == po[i].x1&&x3==po[i].x2&&y2==po[i].y1&&y3==po[i].y2)||(x2==po[i].x2&&x3==po[i].x1&&y2==po[i].y2&&y3==po[i].y1)){f2=false;j=i;break;}}for(int i=0;i<counts;i++) {if((x1 == po[i].x1&&x3==po[i].x2&&y1==po[i].y1&&y3==po[i].y2)||(x1==po[i].x2&&x3==po[i].x1&&y1==po[i].y2&&y3==po[i].y1)){f3=false;o=i;break;}}if(!f1) {ax=po[u].X;ay=po[u].Y;} else {ax = (x1 + x2) / 2 ;ay = (y1 + y2) / 2 + num;Point p=new Point(x1,x2,y1,y2,ax,ay);counts++;po[counts-1]=p;}if(!f3) {bx=po[o].X;by=po[o].Y;} else {bx = (x1 + x3) / 2;by = (y1 + y3) / 2 + num;Point p=new Point(x1,x3,y1,y3,bx,by);counts++;po[counts-1]=p;}if(!f2) {cx=po[j].X;cy=po[j].Y;} else {cx = (x2 + x3) / 2;cy = (y2 + y3) / 2 + num;Point p=new Point(x2,x3,y2,y3,cx,cy);counts++;po[counts-1]=p;}range*=0.55;recur3D(g, x1, y1, ax, ay, bx, by, range);recur3D(g, x2, y2, ax, ay, cx, cy, range);recur3D(g, x3, y3, cx, cy, bx, by, range);recur3D(g, ax, ay, cx, cy, bx, by, range);}}

效果如下

 其实还可以添加颜色来使其更美观,如

			g.setColor(new Color(0,140,0,new Random().nextInt(40)));

大功告成,感谢观众老爷们阅读 ≧◇≦,如有错误,敬请指正

这篇关于java---实现3D山脉模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/768383

相关文章

DeepSeek模型本地部署的详细教程

《DeepSeek模型本地部署的详细教程》DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私,在本地成功部署DeepSe... 目录一、环境准备(一)硬件需求(二)软件依赖二、安装Ollama三、下载并部署DeepSeek模型选

Spring IOC的三种实现方式详解

《SpringIOC的三种实现方式详解》:本文主要介绍SpringIOC的三种实现方式,在Spring框架中,IOC通过依赖注入来实现,而依赖注入主要有三种实现方式,构造器注入、Setter注入... 目录1. 构造器注入(Cons编程tructor Injection)2. Setter注入(Setter

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC

Python实现文件下载、Cookie以及重定向的方法代码

《Python实现文件下载、Cookie以及重定向的方法代码》本文主要介绍了如何使用Python的requests模块进行网络请求操作,涵盖了从文件下载、Cookie处理到重定向与历史请求等多个方面,... 目录前言一、下载网络文件(一)基本步骤(二)分段下载大文件(三)常见问题二、requests模块处理

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件

java中的HashSet与 == 和 equals的区别示例解析

《java中的HashSet与==和equals的区别示例解析》HashSet是Java中基于哈希表实现的集合类,特点包括:元素唯一、无序和可包含null,本文给大家介绍java中的HashSe... 目录什么是HashSetHashSet 的主要特点是HashSet 的常用方法hasSet存储为啥是无序的

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决Spring运行时报错:Consider defining a bean of type ‘xxx.xxx.xxx.Xxx‘ in your configuration

《解决Spring运行时报错:Considerdefiningabeanoftype‘xxx.xxx.xxx.Xxx‘inyourconfiguration》该文章主要讲述了在使用S... 目录问题分析解决方案总结问题Description:Parameter 0 of constructor in x