欢迎光临散文网 会员登陆 & 注册

噪声生成地形 v1.0 v1.1 v2.0 v2.1

2022-09-06 22:45 作者:ICE27182  | 我要投稿

写到第四版才想起来还没发(虽然第一版很水很水)


第一版

很水 v1.0
毫无效果图 v1.0

#噪声算法 自己先写写玩玩呗

#介绍

print('噪声地形生成v1.0')

print('''生成一个区块内的地形(其实就是条直线XD)

两端点数值可手动输入或随机 有检错功能

''')


#输入


print('输入一个区块的大小, 按回车则默认为16')

while True:

    try:

        chunk = input()

        if chunk == '':

            chunk = 16

        if float(chunk) <= 1:

            print(float(chunk))

            chunk = ''

        chunk = int(chunk)

        break

    except ValueError:

        print('输入大于1的数字')

print('输入区块两端点大小, 按回车则随机')

while True:

    try:

        val_1 = input('val_1 = ')

        if val_1 == '':

            import random

            val_1 = random.randint(0,chunk-1)

            print('val_1 = ', val_1)

        if float(val_1) < 0:

            print(float(val_1))

            val_1 = ''

        val_1 = int(float(val_1))

        break

    except ValueError:

        print('输入大于0的数字')

while True:

    try:

        val_2 = input('val_2 = ')

        if val_2 == '':

            import random

            val_2 = random.randint(0,chunk-1)

            print('val_2 = ', val_2)

        if float(val_2) < 0:

            print(float(val_2))

            val_2 = ''

        val_2 = int(float(val_2))

        break

    except ValueError:

        print('输入大于0的数字')


#计算

noise = [val_1]

for x in range(1,chunk):

    noise.append(int(val_2*x/chunk+val_1*(chunk-x)/chunk))

noise.append(val_2)

print(noise)

for x in noise:

    print('██'*x)

print('\n\n\n')

for x in noise:

    print('  '*(x-1),end='')

    print('██')





第二版

v1.1
有点样子了的效果图 v1.1

#噪声算法 自己先写写玩玩呗

print('噪声地形生成v1.1')

print('1 随机生成区块大小 各区块大小不一样')

print('2 随机生成端点大小')

print('3 一定程度上减小了过大的斜率')

print('4 对于不同高度的地形加以改变组成的字符 可以生成 水 地面 山 有雪的高山')

print('5 会无限绘制区块 每行时间间隔0.02s')

print('6 删除了输入界面')


#输入

import random,time

chunk = random.randint(12,32)

val_1 = random.randint(0,72)

val_2 = random.randint(0,72)


while True:

    #生成端点

    k1 = (val_2-val_1)/chunk

    chunk = random.randint(12,32)

    if val_2 > 64:

        chunk = random.randint(2,24)

    val_3 = val_2

    val_2 = random.randint(0,72)

    n = 0

    while n < 5:

        if val_2 > 64 or val_2 <32 or (val_2-val_3)*(val_3-val_1) < -0.2 or ((val_2-val_3)*(val_3-val_1) < -0.2 and val_2-val_3 > 0):

            val_2 = random.randint(0,72)

        n+=1

    if k1 < -1:

        chunk = random.randint(4,16)

        val_2 = random.randint(val_3-10,val_3+10)

    if val_3 <= 30 and val_2-val_3 > 30:

        val_2 = random.randint(val_3-10,val_3+30)


    #计算 int(val_2*x/chunk+val_1*(chunk-x)/chunk)

    val_1 = val_3

    noise = [val_1]

    for x in range(1,chunk):

        noise.append(int(val_2*x/chunk+val_1*(chunk-x)/chunk))

    noise.append(val_2)

   

    #绘图  ██  ░░  ░░  ▓▓  ꧁꧂

    for x in noise:

        if x <= 20:

            print('~~'*2,end='')

            print('~~'*(x-2),end='')

            print('||'*(20-x))

        elif x <= 40:

            print('~~'*x)

        elif x <= 60:

            print('~~'*40,end='')

            print('**'*(x-40))

        else:

            print('~~'*40,end='')

            print('**'*20,end='')

            print('██'*(x-60))

        time.sleep(0.02)





第三版

平缓曲线 好函数 v2.0
好多了不是吗(可能看不太出来?建议自己跑一下看看) v2.0

#通过缓和曲线加权

import random,time

print('噪声地形生成v2.0')

print('1 将加权方式由原来的线性改为 6x⁵-15x⁴+10x³,x∈[0,1] 使图像更平滑')

print('2 加快了刷新速度 约为每秒66.67行')

print('3 固定了区块大小为16 且每个区块的后一个端点值与该区块后一个区块的前一个端点的值相同')

print('4 地面 水 山 有雪的高山 的高度不在固定 而是受预设的高度限制影响 尽管高度限制只能在代码里改')


chunk,len = 16,72

val_1,val_2 = random.randint(int(len/72),len),random.randint(int(len/72),len)


def smth(x,chunk):  

    return(chunk*(6*(x/chunk)**5-15*(x/chunk)**4+10*(x/chunk)**3))


while True:

    val_3 = val_2

    val_2 = random.randint(int(len/36),len)

    val_1 = val_3

   

    noise = [val_1]

    for x in range(1,chunk):

        noise.append(int(val_1*(chunk-smth(x,chunk))/chunk+val_2*smth(x,chunk)/chunk))

        noise.append(int(val_2*smth(x,chunk)/chunk+val_1*(chunk-smth(x,chunk))/chunk))

    noise.append(val_2)


    for x in noise:

        if x <= int(len/3):  #24

            print('~~'*x, end='')

            print('||'*int(len/3-x))

        elif x <= int(len*4/9):  #32

            print('~~'*x)

        elif x <= int(len*7/9):  #56

            print('~~'*(int(len*4/9)), end='')

            print('**'*(x-int(len*4/9)))

        else:

            print('~~'*int(len*4/9), end='')

            print('**'*(int(len*7/9)-int(len*4/9)), end='')

            print('██'*(x-int(len*7/9)))

   

        time.sleep(0.015)





第四版

关键在于mis变量吧 v2.1
可能感觉和2.0没什么区别对吧 主要还是细节吧 v2.1
一些细节吧主要是 v2.1

#通过缓和曲线加权

import random,time

print('噪声地形生成v2.1')

print('1 增加了自定义 区块大小 高度限制 刷新速度 的功能')

print('2 使山没那么平淡 连接处变得粗糙')

print('3 使生成平均斜率大于30度的地形的概率减半 即增加了平地的量')

print('4 我写代码注释了')


#输入

def TypeIn(default):

    while True:

        try:

            v = input('')

            if v == '':

                v = default

            if float(v) <= 1 or float(v) != int(float(v)):

                v = ''

            v = int(float(v))

            break

        except ValueError:

            print('输入大于1的整数')

    return(v)

print('输入区块两端点大小, 按回车则默认16 (不确定就默认)')

chunk = TypeIn(16)

print('输入高度限制大小, 按回车则默认72 (如果图像有错误应减小)')

len = TypeIn(72)

print('输入每秒刷新的行数, 按回车则默认 50 行/s')

speed = TypeIn(50)


#取随机数

val_1,val_2 = random.randint(int(len/72),len),random.randint(int(len/72),len)


def smth(x,chunk):

    return(chunk*(6*(x/chunk)**5-15*(x/chunk)**4+10*(x/chunk)**3))


while True:

    val_3 = val_2

    val_2 = random.randint(int(len/36),len)

   

    if ((val_2-val_3)/chunk)**2 >= 1/3:   #让地形平一点 平均斜率超过30°就再尝试一次生成

        val_2 = random.randint(int(len/36),len)


    val_1 = val_3


    #计算值

    noise = [val_1]

    for x in range(1,chunk):

        noise.append(int(val_1*(chunk-smth(x,chunk))/chunk+val_2*smth(x,chunk)/chunk))

        noise.append(int(val_2*smth(x,chunk)/chunk+val_1*(chunk-smth(x,chunk))/chunk))

    noise.append(val_2)


    #显示图像

    for x in noise:

        mis = random.randint(0,int(round(len/18,0)))   #让图像没那么平淡

        if x <= int(len/3):  #24

            print('~~'*x, end='')

            print('||'*int(len/3-x))

        elif x <= int(len*4/9):  #32

            print('~~'*x)

        elif x <= int(len*7/9):  #56

            print('~~'*(int(len*4/9)-1), end='')

            print('~'*mis, end='')

            print('**'*(x-int(int(len*4/9)-1+0.5*mis)))

        else:

            print('~~'*(int(len*4/9)-1), end='')

            print('~'*mis, end='')

            print('**'*(int(len*7/9)-int(int(len*4/9)-1+0.5*mis)), end='')

            print('██'*(x-int(len*7/9)))

   

        time.sleep(1/speed)


噪声生成地形 v1.0 v1.1 v2.0 v2.1的评论 (共 条)

分享到微博请遵守国家法律