首页 > 其他分享 >【低配】柏林噪声地形生成

【低配】柏林噪声地形生成

时间:2024-05-31 23:04:18浏览次数:15  
标签:... return 低配 噪声 random list width gaocha 柏林

渲染效果

源代码

作者将柏林噪声用了python和JavaScript两种语言实现

两种语言效果基本一样

python

import random

def ave(a, b):# 计算平均值
    return round((a + b) / 2)

def ave_list(lst):# 计算一个全为数字的列表的平均值
    return round(sum(lst) / len(lst))

def smooth_list(input_list, width)->list:# 将整个列表进行平滑处理
    result_list = input_list.copy()
    for i in range(len(input_list)):
        if i != 0 and i % width != 0 and i != len(input_list) - 1:
            neighbors_sum = input_list[i - 1] + input_list[i + 1]
            before_width = max(0, i - width)
            after_width = min(len(input_list) - 1, i + width)
            neighbors_sum += input_list[before_width] + input_list[after_width]
            result_list[i] = neighbors_sum / 4
    return result_list

def random_map(width, height, average, gaocha)->list:
    '''
    随机生成
    '''
    '''将所有输入值转换为int类型,放置后期报错'''
    average = int(average)
    width = int(width)
    height = int(height)
    gaocha = int(gaocha)

    print('开始随机生成!')# 打印一条消息方便调试
    next_value = 0# 下一个列表值的存档
    return_list = []# 返回的列表最初为空
    '''第一项:在平均值的基础上加或减一个“gaocha”范围内的数'''
    return_list.append(min(height, max(0, average + random.randint(-gaocha, gaocha))))

    '''生成列表1~256项(第一排)'''
    while len(return_list) < width:# 意思很简单,当列表长度小于宽度(256)时就重复生成
        '''控制整个列表的平均值,避免数值一直上升或下降'''
        if ave_list(return_list) >= average + gaocha:# 如果整个列表的平均值大于等于传入的平均值+高差(整体太高了)就只能在列表最后一项的基础上减去一个小于高差(当然大于0)的数
            next_value = return_list[-1] + random.randint(-gaocha, 0)
        elif ave_list(return_list) < average - gaocha:# 反之
            next_value = return_list[-1] + random.randint(0, gaocha)
        else:# 否则加或减都行
            next_value = return_list[-1] + random.randint(-gaocha, gaocha)
        next_value = min(height, max(0, next_value))
        if next_value > 0 and next_value <= height:# 为了防止亮度太高或太低(负数),检测next_value的值是否符合要求
            return_list.append(next_value)
    
    '''生成257以及以后的项'''
    while len(return_list) / width < width:# 当行数小于给定width时就不断生成
        return_list.append(return_list[-1] + random.randint(-gaocha, gaocha))
        '''分别生成每一行'''
        while len(return_list) % width != 0:
            '''根据不同的列表平均值情况“分类讨论”
            唯一的不同就是,257及以后的项需要考虑到上方一行自己对应的位置(前面第256项)和左边(上一项)'''
            if ave_list(return_list) >= average + gaocha:
                next_value = ave(return_list[-1], return_list[-1 - width]) + random.randint(-gaocha, 0)
            elif ave_list(return_list) < average - gaocha:
                next_value = ave(return_list[-1], return_list[-1 - width]) + random.randint(0, gaocha)
            else:
                next_value = ave(return_list[-1], return_list[-1 - width]) + random.randint(-gaocha, gaocha)
            if next_value > 0 and next_value <= height:
                return_list.append(next_value)
    return smooth_list(return_list, width)# 最后返回之前再次平滑一下列表

# 示例
map = random_map(256, 63, 10, 5)

JavaScript 

function random(min, max) {
   return Math.round(Math.random() * (max - min) + min)
}
function ave(a,b) {
   return Math.round((a+b)/2)
}
function ave_list(list){
   let sum = 0;
   for(let i=0;i<list.length;i++){
      sum+=list[i];
   }
   return Math.round(sum/list.length);
}
function smoothList(inputList, width) {
	let resultList = inputList.slice();  // 创建一个副本,以免修改原始列表
 
	for (let i = 0; i < inputList.length; i++) {
	  if (i !== 0 && i % width !== 0 && i !== inputList.length - 1) {  // 只处理非边缘和指定间隔的项
		 let neighborsSum = inputList[i-1] + inputList[i+1];
		 let beforeWidth = Math.max(0, i-width);
		 let afterWidth = Math.min(inputList.length-1, i+width);
		 neighborsSum += inputList[beforeWidth] + inputList[afterWidth];
		 resultList[i] = neighborsSum / 4;  // 将当前项替换为相邻项和指定间隔项的平均值
	  }
	}
	return resultList;
 }

// 柏林噪声地形生成
/**
 * @description 生成柏林噪声地形
 * @param {number} width 长
 * @param {number} height 宽
 * @param {number} average 平均高度
 * @param {number} gaocha 最大高差
 */
async function randomMap(width, height, average, gaocha) {
    await sleep(1000)
	var nextValue = 0;
    let return_list = [];
    return_list.push(Math.min(height, Math.max(0, average + random(-gaocha, gaocha))));
    while (return_list.length < width) {
		if(ave_list(return_list)>=average+gaocha){
			nextValue = return_list[return_list.length - 1] + random(-gaocha, 0);
		}
		else if(ave_list(return_list)<average-gaocha){
			nextValue = return_list[return_list.length - 1] + random(0, gaocha);
		}
		else{
			nextValue = return_list[return_list.length - 1] + random(-gaocha, gaocha);
		}
        nextValue = Math.min(height, Math.max(0, nextValue));
        if(nextValue>0&&nextValue<=height){
            return_list.push(nextValue);
        }
    }
	while(return_list.length/width < width){
		return_list.push(return_list[return_list.length-1]+random(-gaocha, gaocha))
		while(return_list.length%width!=0){
			if(ave_list(return_list)>=average+gaocha){
                nextValue = ave(return_list[return_list.length-1],return_list[return_list.length-width])+random(-gaocha, 0)
			}
			else if(ave_list(return_list)<average-gaocha){
                nextValue = ave(return_list[return_list.length-1],return_list[return_list.length-width])+random(0, gaocha)
			}
			else{
				nextValue = ave(return_list[return_list.length-1],return_list[return_list.length-width]+random(-gaocha, gaocha))
			}
            if(nextValue>0&&nextValue<=height){
                return_list.push(nextValue);
                if(return_list.length%50==0){
                    await sleep(1)
                }
            }
		}
	}
    return smoothList(return_list,width)
}

// 示例
map = randomMap(256, 63, 10, 5)

调用

ccw共创世界

将python代码进行一点小修改后弄到共创世界里面,用画笔呈现结果:

共创世界:《[开源]初级柏林噪声》

dao3.fun神奇代码岛

将JavaScript代码进行修改后弄到神奇代码岛的地图作品里面,可以实现3D渲染

神奇代码岛 (dao3.fun)(代码未开源,详情见链接)

原理

单看代码似乎不那么好理解,我们通过文字来讲解一下!

举个例子:我们将一个256*256(=65536,也可以是其他尺寸,具体尺寸依照传入的width值)的方形区域存储在一个长65536项的列表里

那么,每一项分别代表那一个地方呢?

举个栗子:第1项代表第一行的最左边的那个位置,第256项代表第一行最右边的位置;第257项代表第2行最左边的位置……第65536项代表最右下角的位置

也可以通过下方表格来理解(每个数字代表列表的第几项):

1

2

3

4

...

256

257

258

259

260

...

512

513

514

515

516

...

768

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

65281

65282

65283

65284

...

65536

那么,我们现在要做的就是生成这个超级大的列表了!

(生成列表的原理在上方python源代码中通过注释解释)

标签:...,return,低配,噪声,random,list,width,gaocha,柏林
From: https://blog.csdn.net/azkbbys/article/details/139030293

相关文章

  • 一个python文件做图像 灰度化 反转 通道分离 噪声、滤波 高斯双边滤波 均值偏移滤波
    代码测试可以正常运行。灰度化反转通道分离噪声、滤波高斯双边滤波均值偏移滤波图像二值化Canny边缘检测直线检测圆检测轮廓发现人脸检测测试可以运行代码如下:'''file:ImageMiniLab.pydate:2019/04/1920:00author:itisyan......
  • 实现Avalonia平台下低配版的Dock控件:实现TabControl的可关闭
    在弄一个项目,在WPF下用Dock控件,在Avalonia平台下实现也有一个Dock控件,但用起来有点复杂。Install-PackageDock.AvaloniaInstall-PackageDock.Model.Mvvm感兴趣的可以访问网站了解:https://github.com/wieslawsoltes/Dock其实本身用的比较简单,所以就想着,用TabControl来改一下......
  • 军事噪声
    军事噪声指军事演习或战争期间各种武器装备产生的噪声,包括枪炮武器的爆震声、发动机的机械声、军舰汽笛声、电机及通信设备声等。军事噪声的特点是:噪声强度较高,频率以中、低频为主。一般来说,每天在85分贝以下噪声环境中工作不超过8小时,听力相对安全。如果超出这一噪声限值,可能会......
  • 【扩频通信】混沌扩频通信matlab仿真,混沌信号 高斯噪声 调制解调
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • 无线技术整合到主动噪声控制(ANC)增强噪声降低性能
       主动噪声控制(ANC)已成为一种广泛使用的降噪技术。基本原理是通过产生与外界噪音相等的反向声波,将噪音中和,从而达到降噪的效果。ANC系统通常包括以下几个部分:参考麦克风、处理芯片、扬声器和误差麦克风。参考麦克风用于捕捉环境中的噪声信号;处理芯片则分析这些噪声曲线,并......
  • 数据分享|SAS与eviews用ARIMA模型对我国大豆产量时间序列预测、稳定性、白噪声检验可
    全文链接:http://tecdat.cn/?p=31480最近我们被客户要求撰写关于ARIMA的研究报告,包括一些图形和统计输出。我国以前一直以来都是世界上大豆生产的第一大国。但由于各国的日益强大,导致我国豆种植面积和产量持续缩减。因此,预测我国的大豆产量对中国未来的经济发展有着极其重要的作......
  • 《噪声》人类判断的缺陷 - 三余书屋 3ysw.net
    噪声:人类判断的缺陷大家好,今天我们要解读的是一本相当考验智力的书籍,书名为《噪声》。为何如此评价呢?一方面,这本书的内容确实相当复杂,不是轻松愉快的阅读材料。另一方面,读完这本书后,你会感觉自己的思维像经历了磨练一般,变得更加敏锐。为何称之为磨练?答案在于书名。这本书的......
  • PS1117-XX系列800 mA低噪声线性稳压器
    这份文件是关于PS1117-XX系列800mA低噪声线性稳压器的产品规格说明。以下是其核心内容的概要:产品特性(FEATURES)产品特性详细描述如下:1.**多种输出电压版本**:PS1117-XX系列线性稳压器提供了多种固定输出电压版本,包括1.5V、1.8V、2.5V、2.85V、3.3V、5V,以及可调版本,......
  • 先进电机技术 —— 电机噪声分析与优化初探
     一、背景电机噪声的危害主要体现在以下几个方面:听力受损:长时间暴露在高强度的电机噪声环境中,容易导致听力受损,影响人们的日常生活和交流。据临床医学统计,如果长期生活在80dB以上的噪声环境中,约有50%的人容易失聪、失鸣。影响心理健康:电机噪声的高频、高强度特性可能导致人......
  • 全球次声基准噪声数据
    一、数据来源说明次声全球噪声上、下限噪声数据从pythonobspy库中进行提取。可用于计算psd时加载全球噪声上下限,以辅助psd计算是否正确。二、模型数据hi_noise_periods=[87.8516656480.5842187873.919666767.8031701762.1942163457.04925797,52.3299114748.0009684......