Simplex噪声的matlab实现

Simplex噪声的matlab实现

0.Simplex噪声的特点

Simplex噪声是2001年Perlin本人提出的一种新的梯度噪声,主要目的是为了改善之前的Perlin噪声随维度增加计算量指数型增大的缺点。下图就是二维的Perlin噪声,具体实现可以参见:
https://blog.csdn.net/weixin_42943114/article/details/82110468
perlin噪声
与Perlin噪声相比,Simplex噪声最大的特点便是由原来的正方形网格转换成为了三角形网格,这大大减小了计算量,但是却增大了理解的难度。Simplex噪声的计算单元由单形(三角形,四面体,n维n+1面体)构成,其优点是在高维情况下计算量大大减小,由原来的o(2n)变为o(n2)。
本文的算法思路参见下面这篇文章:
【图形学】谈谈噪声 https://blog.csdn.net/candycat1992/article/details/50346469

1.二维Simplex噪声的实现

Simplex算法主要步骤为:三角网格的变形与编码,计算各点的梯度权重,加权。

1.1二维Simplex噪声三角网格的编码

对于二维Perlin噪声的网格编码,只需要对所求坐标点取整便可以得到。但是对于三角形网格点的二维simplex的编码,这个编码方式便不再容易。本文用到的思路是通过间接的坐标变换使得三角形网格变换为正方形网格,进行计算。下图便是三角形网格(红色的)变成正方形网格(黑色的)后的示意图,通过变换后的正方形坐标依然可以通过取整的方式来获得对应三角形网格的坐标号。

由于一个正方形网格对应2个三角形网格,所以还需要第二步判断确定具体位置。如果y-floor(y) > x-floor(x)则在上三角部分,关联的三角形三个点为( floor(x)+0 , floor(y)+0 ) , ( floor(x)+0 , floor(y)+1 ) , ( floor(x)+1 , floor(y)+1 ),简记为(0,0)
,(0,1),(1,1)。如果y-floor(y) < x-floor(x)则在下三角部分,关联的三角形记为(0,0),(1,0),(1,1)。

编码

上面的图是晶格点的编码方式,具体判断计算点所在位置可以用下面这张图进行解释:
三角形网格编码

  • 先布置计算点
  • 接下来把计算点由原来的三角网格变换为正方形网格。确定所需晶格点,并设置随机的梯度向量。坐标变换方法如红字所示。
  • 最后再把正方形坐标变回三角形坐标,计算梯度向量和方向向量的点积,以此计算权重。

计算权重的方法和Perlin噪声相似,这个之后再说
点积与权重

1.2二维Simplex噪声计算

对于二维Simplex噪声的计算,可以用以下的算法进行计算:

划分计算点网格
把计算点网格做三角形到正方形的变换
确定正方形网格的范围
给各个网格角点设定随机梯度向量
初始化计算点网格的数值zeros()
循环每一个计算点
	对计算点坐标(正方形坐标)取整,得到正方形网格的关联角点
	正方形网格包含2个三角形网格,筛选出计算点的三角形所在位置(是左上三角还是右下三角)
	循环每一个晶格点(3个)
		求出计算点和晶格角点在三角形网格(即变型前的网格)下的方向向量
		将方向向量与梯度向量做点积,然后做权重计算
	把3个权重相加,得到计算点数值
绘图

其中三角形网格到正方形网格的计算公式为:

  x 4 = x 3 + ( x 3 + y 3 + . . . ) ∗ K 34 \ x_4=x_3+(x_3+y_3+...)*K_ {34}  x4=x3+(x3+y3+...)K34
  y 4 = y 3 + ( x 3 + y 3 + . . . ) ∗ K 34 \ y_4=y_3+(x_3+y_3+...)*K_ {34}  y4=y3+(x3+y3+...)K34
  . . . \ ...  ...
其中

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值