写作绅士,读作丧尸 X岛揭示板
 首页版规 |用户系统 |移动客户端下载 | 丧尸路标 | | 常用图串及路标 | 请关注 公众号:【矛盾苇草】| 人,是会思考的芦苇
常用串:·豆知识·跑团板聊天室·公告汇总串·X岛路标

No.54955672 - 无标题 - 技术宅


回应模式
No.54955672
名 称
E-mail
标题
颜文字
正文
附加图片
•程序语言、压制投稿、视频制作以及各计算机领域的技术问题
•我觉得还是CSDN靠谱一点
•本版发文间隔为15秒。

收起 查看大图 向左旋转 向右旋转
无标题 无名氏 2023-01-19(四)19:32:58 ID:4WVuFwF [举报] [订阅] [只看PO] No.54955672 [回应] 管理
用python和写了个柏林噪声算法,不知道哪里写得不对,太规律了 ( ゚∀。)
Tips 无名氏 2099-01-01 00:00:01 ID:Tips小会员 [举报] No.9999999 管理
讲甘多托膝咩,吔个包先
无标题 无名氏 2023-01-19(四)19:33:50 ID:4WVuFwF (PO主) [举报] No.54955698 管理
import random,math

class Noise:
def __init__(self):
nums = [i for i in range(256)]
permutation = [nums[random.randint(0, len(nums) - 1)] for i in range(256)]

self.p = [permutation[x % 256] for x in range(512)]

#噪声重复的区间范围
self.repeat = 0
#噪声的频率
self.frequency = 50
#噪声的振幅
self.amplitude = 10
self.vs = [0+1j, 1+0j, 1+1j, 0-1j, -1+0j, -1-1j, 1-1j, -1+1j]

def perlin(self,x:int,y:int)->float:
x /= 1000
y /= 1000
x *= self.frequency
y *= self.frequency
#确定柏林噪声重复的区间
if self.repeat > 0:
x %= self.repeat
y %= self.repeat
#取xy的整数部分用于确定坐标落在了哪个晶格内
xi = math.floor(x)%255
yi = math.floor(y)%255
#取xy的小数部分用于确定坐标在晶格内的位置
xf = x - math.floor(x)
yf = y - math.floor(y)
#对坐标的小数部分使用缓和曲线插值
u = self.fade(xf)
v = self.fade(yf)
# 通过哈希运算确定晶格4个顶点的哈希值(用于在self.grad函数中确定顶点的梯度向量)
# b-----c
# | |
# | |
# a-----d
p = self.p
a = hash((xi,yi))
b = hash((xi,self.inc(yi)))
c = hash((self.inc(xi), self.inc(yi)))
d = hash((self.inc(xi), yi))
#计算4个顶点的梯度向量与输入点-顶点向量之间的点积的加权平均值
x1 = self.lerp(self.grad(a, xf, yf), self.grad(d, xf - 1, yf), u)
x2 = self.lerp(self.grad(b, xf, yf - 1), self.grad(c, xf - 1, yf - 1), u)
z = self.lerp(x1, x2, v)
return z * self.amplitude

def fade(self,t):
# 6t^5 - 15t^4 + 10t^3
return t * t * t * (t * (t * 6 - 15) + 10)

def inc(self,num):
num += 1
if self.repeat > 0:
num %= self.repeat
return num

def lerp(self, a, b, x):
return a + x * (b - a)

def grad(self, hash, x, y):
print(self.vs[hash % 8])
return abs(self.normalized(self.vs[hash % 8]) * (x+y*1j))

#归一化
def normalized(self, v):
m = abs(v)
return v/m
收起 查看大图 向左旋转 向右旋转
无标题 无名氏 2023-01-19(四)19:35:28 ID:4WVuFwF (PO主) [举报] No.54955750 管理
附个图片|-` )
无标题 无名氏 2023-01-19(四)21:03:03 ID:yCkzOFK [举报] No.54957755 管理
有没有可能,跨平台分享代码可以用在线剪贴板之类的工具
https://pastebin.ubuntu.com/
特别是python这种要拿游标卡尺对缩进的
无标题 无名氏 2023-01-19(四)23:10:13 ID:4WVuFwF (PO主) [举报] No.54961108 管理
找到原因了,我用Python的复数来代替向量用,然后脑抽把模当点乘了( ゚∀。)
无标题 无名氏 2023-01-30(一)11:21:51 ID:90nrjbn [举报] No.55196112 管理
>>No.54957755
自从这玩意儿要登录后就用的少了(;´Д`)

UP主: