【分享】破纪录:MandelbrotSet动态放大视频4 (放大1e258或2^857倍)
前一个视频帖子链接:https://bbs.bccn.net/thread-333856-1-1.html
视频链接:
http://v.
视频详细信息:
每秒放大8倍
视频放大过程时长286秒
最终放大1e258(2^857)倍
每秒24帧
源分辨率 1280 x 960
视频分辨率 640 x 480
Location:
real = -1.99999999999999999999
99999999999999999999
97344589793777924962
80529992759962819860
24156488045552272302
44073189491973478031
80238274274955380877
61986201309842882318
94031274218325703111
19090443120260112392
01666798411312326507
42495239850691572735
14813561653456639156
09333800669416787338
imag = 0.00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00060028373590270395
79269278208405247083
84221258002907159852
26066697019608772572
97502951824508652864
37164544710375610323
26007488828885952543
82532007738441170003
19905634094938268443
23967097074946753264
除此以外,同样也附带一个计算演示程序:http://u.
作为演示程序,这个是加上了逃逸速度插值的,所谓的逃逸速度插值是:
逃逸速度公式:v(z) = n + 1 - log2(log2(abs(z))) (log2是对于计算公式使用平方的M集)
其中n是实际迭代次数
这样得到的v(z)就是一个小数,就可以用在颜色的平滑插值上了。
但为了减少公式的计算误差,我们把逃逸边界的模,从2改为8,让它多迭代两次,就会平滑很多了。
最后,需要把这样一个浮点数映射到一个颜色,有两种映射的办法,一种是实时计算映射,另一种是调色板映射
实时计算的话,会因为计算不能太复杂,于是颜色会偏单调,如以下例子:
int iterToColor(double iter)
{
return (int)(fabs(fmod(iter + 256, 512) - 256));
}
COLORREF colorMap(COMPLEX z, int iteration)
{
double r = z.re * z.re + z.im * z.im;
r = iteration + 1 - log2(log2(r)/2);
return RGB(iterToColor(r * 28), iterToColor(r * 16), iterToColor(r * 32 + 128));
}
实时映射效果图(用的以上代码做映射计算):
对于使用调色板的,可以使用的颜色就会丰富很多很多,但在做插值的时候就不能像前一个这样直接进行计算了,我们要使用alphablend的办法做
首先要把那个v(z)拆分为整数部分和小数部分 n + m,n是整数部分
然后我们在调色板上取 n % MAXCOLOR 与 (n + 1) % MAXCOLOR 这两种颜色,记为c1,c2,
然后我们对这两个点做alphablend:
c = alphablend(c1, c2, m); // c1 是src, c2 是dest, m是srcalpha
alphablend计算公式:
Dst.Red = Src.Alpha * Src.Red + (1 - Src.Alpha) * Dst.Red
Dst.Green = Src.Alpha * Src.Green + (1 - Src.Alpha) * Dst.Green
Dst.Blue = Src.Alpha * Src.Blue + (1 - Src.Alpha) * Dst.Blue
最后把得到的c值画在屏幕上就可以了
[ 本帖最后由 御坂美琴 于 2011-3-26 22:06 编辑 ]