相关文章推荐
爱笑的木瓜  ·  MySQL :: MySQL ...·  2 月前    · 
茫然的键盘  ·  Unable to convert ...·  4 月前    · 
痴情的铁链  ·  NSURLErrorDomain 对照 - 掘金·  1 年前    · 

分形布朗运动曲线讲解

大家好,今天我为大家讲解分形噪音的基础:分形布朗运动曲线的绘制。噪音在图形学领域非常受欢迎,特别是在复杂场景的应用,能在低消耗的情况下模拟出许多传统的欧式几何难以刻画的场景。例如使用perlin噪声可以模拟山脉地形,天空云层等等。这是本人的第一篇博客,后续本人将引领大家一起走进计算机图形领域!

布朗运动是1827年英国植物学家R.Brown发现的,它是一种随机运动,粒子的运动方向随时改变,其运动轨迹是一条无规则的折线,不受什么约束和支配。

1968年1968年Mandelbrot和Ness两人提出分形布朗运动FBM(Fractal Brown Motion),它主要用于描述自然界的山脉、云层、地形地貌以及模拟星球表面等不规则形状阶。
以下为我在MFC上实现的FBM直线类所绘制的分形布朗曲线:
在这里插入图片描述

FBM实际上是一种策略,其目的是为了让普通的噪声有更多的细节,可以看成是不同位置,不同比例,不同频率的同一个噪声函数的叠加。实现代码如下:
实现代码1
其中octaves为倍频,即噪音叠加的次数,影响着噪音的自然性。frequency为噪音的频率,amplitude为噪音的振幅,控制着噪音的极大值与极小值。一般在[0,1]之间,值越大则代表噪音波动越大。下图是H=0.8与H=0.2的比较。
比较
其中的noise函数为噪音函数,噪音函数返回的是一个伪随机数,即每次输入的值一定,则结果一定为某个值。例如:我们假设这个函数为取圆周率π的小数点后几位。则次函数就是一个伪随机函数。因为每次输入的值一定则结果一定。取第一位必定是1,然而每个数之间又相互随机。不同的伪随机函数会产生截然不同的结果。此处我选择的伪随机函数如下:
实现代码2

折线的绘制

折线的绘制采用经典的线段中点递归位移算法,其主要的思想是通过递归的对每一条直线中点进行FBM位移产生新的两条线段。到达递归条件遍使用MFC自带的函数绘制直线。折线段的走势会符合整体的直线。而且局部和整体也具有相似性。具体的递归实现代码如下:
实现代码3

CODE:function similar_sequence = generator_FFT(n,H)%--------------------------------------------------------------------------% GENERATOR_FFT Use fast fourier transform to generate normalized FGN% ... 一、 分形 布朗运动 FBM 分形 布朗运动 (Fractal Brownian Motion)也就是 fbm ,它不是 噪声 ,但是他可以让 噪声 有更多的细节。可以看成把不同比例位置的一张 噪声 合并在一起。 通过添加不同的 噪声 迭代(octaves),我们以规则的步长(lacunarity)连续增加频率并降低 噪声 的幅度(增益),我们可以获得更精细的 噪声 粒度并获得更精细的细节。这种技术称为“ 分形 布朗运动 ”( FBM ),或简称为“ 分形 噪声 ”。 具体原理可参照thebookofshaders一书详细简介。 二、raymarc. /* 本程序利用 分形 技术画一维的 布朗运动 曲线 */ /* BC 3.1编译 */ /* 其中 函数 initgraph的第三个参数可能需要修改 */ #include "graphics.h" #include "math.h" #include "stdlib.h" #include "conio.h" #include "time.h" #include "stdio.h" #define MAX_SIZE 1. <br /> 分形 布朗运动 (fractal Brownian movement)<br />    在自然界中,分子、大分子、病毒、粒子等都由于热涨落而以随机碰撞的形式不停地运动,这种运动称为 布朗运动 。<br /> 布朗运动 的粒子位置是时间的随机 函数 ,对归一化独立高斯随机过程〈ξ〉,布郎粒子的位置增量是H(0<H<1,称为赫斯特指数)的 函数 ,对寻常 布朗运动 H=1/2,当它不等于1/2时,这时的 布朗运动 就叫做 分形 布朗运动 。<br /> <br />应用1:<br /> 分形 作为描述自然界极不规则极为复杂现象 分形 布朗运动 FBM (Fractal Brown Motion)是1968年Mandelbrot和Ness两人提出的一种数学模型,它主要用于描述自然界的山脉、云层、地形地貌以及模拟星球表面等不规则形状阶。 布朗运动 是1827年英国植物学家R.Brown发现的,它是一种随机运动,粒子的运动方向随时改变,其运动轨迹是一条无规则的折线,不受什么约束和支配。 opengl中使用 fbm //------------------------------------------------------------- 分形 布朗运动 FBM (Fractal Brown Motion),是1968年Mandelbrot和Ness两人提出的一种数学模型,它常用于描述自然界的山脉、云层、地形地貌以 分形 布朗运动 FBM (Fractal Brown Motion)是1968年Mandelbrot和Ness两人提出的一种数学模型,它是一种随机运动,粒子的运动方向随时改变,其运动轨迹是一条无规则的折线,不受什么约束和支配。它主要用于描述自然界的山脉、云层、地形地貌以及模拟星球表面等不规则形状阶。 分型 布朗运动 的原理:https://thebookofshaders.com/13/?lan... 从一条直线段开始,将线段中间的三分之一部分用一个等边三角形的两边代替,形成山丘形图形如下,在新的图形中,又将图中每一直线段中间的三分之一部分都用一个等边三角形的两条边代替,再次形成新的图形如此迭代,形成Koch 分形 曲线 。koch​在matlab中 绘制 koch 曲线 ,来欣赏下数学之美,开始 分形 之旅。1、算法分析:考虑由直线段(2个点)产生第一个图形(5个点)的过程。图中,设和分别为原始直线段的两个端... num = [1,2,3,4,5,6,7,8,9,10] # net_913动脉树 net_913_ArtNorm = [1.3501,1.3311,1.3186,1.3331,1.3387,1.3273,1.3271,1.3421,1.3299,1.2932] net_91... 分形 布朗运动 (Fractal Brownian Motion)也就是 fbm ,它不是 噪声 ,但是他可以让 噪声 有更多的细节。可以看成把不同比例位置的一张 噪声 合并在一起。 // Properties const int octaves = 1; float lacunarity = 2.0; float gain = 0.5; // Initial values float amplitude ... - Dragon 曲线 的生成规则 变化的起始是一条原始直线段。第一步是将该直线段由中间点隆起,使其变成一个等腰直角三角形的两腰。接下去再分别对两腰作和前面同样的变化,如此不断进行。 不难看出,Dragon 曲线 完全是由长度相等的线段组成,且两两相交处都成直角。另外,每次 分形 后, 曲线 的长度是原来 曲线 长度的 根号2倍。因此,经过无数次变化,Dragon 曲线 也将变成无限长。这一点正符合 分形