分形/fractint
Fractint 是一个免费软件计算机程序,可以渲染和显示许多种分形。源代码可用
Fractint 19.5 的主要作者是
- Bert Tyler
- Timothy Wegner
- Jonathan Osuch
- Wesley Loewer
commons:Category:Fractals created with Fractint
CORNERS=[xmin/xmax/ymin/ymax[/x3rd/y3rd]]
"例如:corners=-0.739/-0.736/0.288/0.291 从这些坐标开始作为 x 和 y 坐标的范围,而不是默认值(对于 type=mandel) -2.0/2.0/-1.5/1.5。当您指定四个值(通常情况)时,这定义了一个矩形:x 坐标映射到屏幕,从左到右,从 xmin 到 xmax,y 坐标映射到屏幕,从下到上,从 ymin 到 ymax。六个参数可以用来描述任何旋转或拉伸的平行四边形:(xmin,ymax)是用于屏幕左上角的坐标,(xmax,ymin)是用于右下角的坐标,以及(x3rd,y3rd)是用于左下角的坐标。只输入“CORNERS=”告诉 Fractint 使用这种形式(默认模式),而不是 CENTER-MAG(见下文)当使用 [B] 命令保存参数时。"[1]
CENTER-MAG=[Xctr/Yctr/Mag[/Xmagfactor/Rotation/Skew]]
"这是输入角落作为中心点和放大倍数的另一种方法,这种方法在一些分形程序和出版物中很流行。只输入“CENTER-MAG=”告诉 Fractint 使用这种形式,而不是 CORNERS(见上文)当使用 [B] 命令保存参数时。[TAB] 状态显示以两种形式显示“角落”。当您指定三个值(通常情况)时,这定义了一个矩形:(Xctr,Yctr)指定图像中心的坐标,而 Mag 指示要使用的放大倍数。六个参数可以用来描述任何旋转或拉伸的平行四边形:Xmagfactor 指示 x 放大倍数是 y 放大倍数的多少倍,Rotation 指示图像旋转了多少度,Skew 指示图像倾斜了多少度。正角度将逆时针旋转和倾斜图像。"
Mag 指示要使用的放大倍数。初始值(无缩放)为 6.66666667e-01。 "如果将放大倍数设置为 1,则 Y 轴上的范围为 +1 到 -1 - 这缩放得太大了,会切断曼德勃罗集的一些顶部和底部球体。如果将放大倍数设置为 .666666667,则 Y 轴上的范围为 +1.5 到 -1.5,这将提供完整曼德勃罗集的视图。" (Ryan Davenport)[2]
/*
frames.c - frames for endless zoom
http://www.nahee.com/spanky/www/fractint/loewer/frames.c
Results of Wesley Loewer's Study :
"The C program, frames.c, was used to generate the batch file, using "frames > tmp.bat" at the command line prompt. I put the following in my sstools.ini and then ran tmp.bat.
batch=y
video=f3
sound=off
float=y
passes=b
viewwindows=///128/128
maxiter=1000
colors=000_HcaDhc9n<2>YGkD_HEdH76H<2>50GTWJ<2>YLZA7F<73>YQo\
000<75>IdU111<36>igu102<14>SAi000<13>5815917105A1<14>AJ3
When I stitched them together in an animation, the last frame looks just like the first frame."
*/
#include <stdio.h>
#include <math.h>
main(int argc, char *argv[])
{
int frame, frames;
double zoom, relzoom, zoomfactor;
zoom = 1e5; /* seems like a deep enough starting place */
relzoom = pow(2.0, 2.5*8); /* 2**(2.5 * 8 steps/lap ) */
frames = 100;
zoomfactor = pow(relzoom, 1.0 / (frames - 1));
for (frame = 0; frame < frames; frame++)
{
printf("fractint center-mag=0/1/%g\n", zoom);
zoom *= zoomfactor;
}
return 0;
}
/*
frames45.c - frames at 45 degree increments using autokey option
http://www.nahee.com/spanky/www/fractint/loewer/frames45.c
Results of Wesley Loewer's Study :
"The C file, frames45.c, generates an auto.key script to produce the whole sequence of frames via FractInt's "g" command.
After compiling frames45.c, at the command line prompt, just enter "frames45 > auto.key".
Then I started FractInt with:
video=af3
float=y
viewwindows=///128/128
passes=b
maxiter=5000
autokey=play
and away it went. "
*/
#include <stdio.h>
#include <math.h>
main(int argc, char *argv[])
{
int angle, frame, frames;
double zoomfactor, zoom;
frames = 100;
zoomfactor = pow(2.0, 2.5);
zoom = 1.0; /* looks like a good starting place */
angle = 0;
for (frame = 0; frame < frames; frame++)
{
printf(
"\"g\"\n"
"\"center-mag=0/1/%g/1.333333/%d\"\n"
"ENTER\n"
"CALCWAIT\n"
"\"s\"\n"
"CALCWAIT\n"
"\"eh..\"\n"
"ESC\n\n"
, zoom, angle);
zoom *= zoomfactor;
angle = (angle + 45) % 360;
}
return 0;
}
最重要的文件是
- par 文件 - 平面描述 和内置类型
- frm 文件 - 分形类型(公式)。在这里可以定义迭代函数(映射)
- map 文件 - 颜色梯度。在 Fractint 中,map 表示颜色梯度,而不是函数(数学公式)
- IFS 文件 - *.ifs
- Fractint 确实将参数保存在其 GIF 文件中
- 可以使用命令行从 gif 文件中提取 par 文件
wine fractint.exe foo.gif makepar=bar.par/foo
# https://www.fractalforums.com/mandelbrot-and-julia-set/is-there-anything-novel-left-to-do-in-m-like-escape-time-fractals-in-2d/255/ # fracmonk e90circs(xyaxis) {;z0=+,-sqrt(2) z=sqrt(2), c=pixel:;no s=z*z ;periodicity t=s*s ;testing! z=(1/s-(1/t))*c |z| < p3 }
DM54(xaxis) {;deg 10 c=pixel, z=p1, d=p2:;quasi M2 q=z*z ;d=1:z0=4/5=.8 r=q*q ;only! s=r*z ;nonstandard t=(s-r)*c-d ;dendritic z=t*t ;structure |z| < p3 }
笔记
- 如果 a-b>1 且 b=1,则集合将类似于 a-b=1 的情况,但将被无限多个不同大小的卫星岛包围,
- 对于 b=1,使用 sqrt(3)= .5773503... 对于 a=3,以及 cuberoot(4)=.6299605...
FractInt palettes have 256 colours (of which the first is reserved for interior). They are stored as 6bit RGB, encoded in ASCII. Gradients of slowly changing colours are compressed as two endpoints and a count. Check FractInt documentation Topic=Color Specification for details. (Claude Heiland-Allen )
转换
可以在 Gnuplot 中使用/检查 Fractint 地图文件
set palette file "Skydye07.map" using ($1/255):($2/255):($3/255) # Read in a palette of RGB triples each in range [0,255] test palette
Fractint_default_colour_map(256 色)在一个颜色表中满足 4 种不同需求[5]
- 0..15:前 16 种颜色与所有 16 色模式(0Dh/0Eh/10h/12h)的编码方式完全相同,反过来使用与所有文本模式(*1)的颜色属性相同的 4 位编码。它向后兼容 EGA 和 CGA 适配器。
- 16..31:接下来的 16 种颜色提供了一个均匀照明的 4 位黑色(10h)到白色(1Fh)灰度(二进制编码的灰度)
- 32..247:216(3x8x3x3)色:基于
- 24 色调 RGB 轮,从蓝色开始,每个 R、G 和 B 有 8 个细分,产生 24(3x8)个离散的“色调”。每个色调都在
- 3 级饱和度(色彩度)
- 3 级强度(亮度值)
- 248..255:8 色(= 256 - (16 + 16 + 216))定义保证用于用户应用程序(用户定义的颜色),通常为黑色。8 个未使用的定义。通过保证 BIOS 不会触碰它们。
256 色的 VGA 颜色索引(= 16x16)。它显示索引,而不是直接的 rgb 颜色值。
VGA 颜色索引值
- 十进制:从 0 到 255
- 十六进制:从 #00 到 #FF(或 $00 在旧符号中)[6]
-
Fractint_default_colour_map
-
VGA 调色板
-
VGA 调色板整理
另请参阅
- M Sargent:MAPView : 这是一个独立的程序,它显示任何选定 MAP 文件的颜色光谱。
- M Sargent:MAP 文件集 - Fractint 256 色 MAP 文件(颜色调色板)。它们是包含 RGB 三元组的文本文件,易于创建或编辑。此 ZIP 档案包含一个小集合。网络上提供了数百甚至数千个这样的文件。这些程序允许您从其 GUI 菜单中选择 MAP 文件,并且通常会显示其颜色光谱的预览。
- Fractal-Zoomer 颜色地图(与 Fractint 结构相同)
"Fractint 使用参数文件[7][8] 来保存/恢复所有选项和设置,[9] 用于重新创建特定的图像。描述图像所需的参数占用非常少的磁盘空间,尤其是在与保存图像本身相比的情况下。" [10]
参数文件
- 它们是普通的文本文件
- 可以包含一个文件或命名参数组的参数,看起来像这样
name { ; main comment .... } quickdraw { ; a set of parameters named quickdraw maxiter=150 float=no } slowdraw { ; another set of parameters named slowdraw maxiter=2000 float=yes }
这些部分被称为 **parset** 部分,描述了分形方程、视图区域、参数和调色板。[11]
对于参数平面和曼德尔布罗特集的标准视图
Mandel_Demo { ; PAR for initialization of Fractint demo reset=1900 type=mandel corners=-2.5/1.5/-1.5/1.5 params=0/0 inside=0 sound=no }
或者 :[12]
1_01 { ; quite good spirals reset=2000 type=mandel passes=1 corners=-0.6014129278/-0.5990935452/0.427747516/0.429487053 params=0/0 float=y maxiter=1000 inside=0 outside=15 distest=1/10/320/200 } 1_02 { ; stringy one, with dist estimator reset=2000 type=mandel passes=1 corners=-1.9228429644992/-1.9228427944992/-6.3749991620026e-008/6.375000\ 8379971e-008 params=0/0 float=y maxiter=1000 inside=0 outside=15 distest=1/20/320/200 } 1_03 { ; OK, bit dull, not zoomed in far reset=2000 type=mandel passes=1 corners=0.3734922373/0.3820837907/-0.243292645/-0.23684898 params=0/0 float=y maxiter=1000 inside=0 outside=15 distest=1/10/320/200 } 1_04 { ; a mess, needs dist est reset=2000 type=mandel passes=1 corners=-1.862224008886682/-1.86222400040936/-3.214020831358832e-009/3.1\ 43970347410528e-009 params=0/0 float=y maxiter=1000 inside=0 outside=15 distest=1/10/320/200 } 1_05 { ; A twirly twiddly one reset=2000 type=mandel passes=1 corners=-0.77464016774366/-0.77463987034365/0.12426328506998/0.124263508\ 11999 params=0/0 float=y maxiter=1000 inside=0 outside=15 distest=1/10/320/200 }
FractInt 的参数文件(扩展名为 PAR)
top-mag1500 { ; a really really deep zoom Wesley Loewer ; highly self similar ; took over 1200 hours at 320x240 on a 486sx/25 reset=1920 type=mandel passes=b center-mag=0.0/1.0/1e+1500 maxiter=15000 }
Julia 集
test { reset=2004 type=julia center-mag=0/0/0.6666667 params=-0.49749687108886109/-0.0025041736227045075 float=y inside=0 [email protected] }
要使用它
- 将文件保存到 fractint 主目录。
- 运行 fractint。
- 按 2 键
- 按 F6 键
- 选择 par 文件(默认值为 usr/share/xfractint/pars/fractint.par)
一个人可以
- 使用 b 键将命令保存到 par 文件
- 使用 F7 键从角点更改为中心
- 使用 F6 键选择 par 文件
- 使用 Ctrl-@ 加载 par 文件
重置会导致 Fractint 将所有与计算相关的参数重置为其默认值。非计算参数(例如“printer=”、“sound=” 和“savename=”)不受影响。[13] 参数文件中的 reset=1730 显示它是在 Fractint 的 17.3 版本中创建的。[14]
搜索代码
grep -R "par file"
结果
miscres.c: /* just to make par file look nicer */ miscovl.c: ranges which can be written as <nn> to compress .par file entry. printer.c: /* user might change gammas with a .par file entry mid-run. */
参数平面(曼德尔布罗特集外部)上的场线的 256 分解近似[15]
Field { ; Field lines, Jay R Hill, 1997 reset=1960 type=mandel center-mag=-0.75/-1.12577e-013/0.8695652 params=0/0 float=y maxiter=256 bailout=3600 decomp=256 colors=000www<33>www000www<33>www000w\ ww<9>www000www<23>www000www<32>www0\ 00www<22>www000www<9>www000www<34>\ www000www<32>www000000 savename=field }
另请参阅
来自 Fractint 20.04 版本的描述
"passes 选项"(<X> 选项屏幕或“passes=” 参数)选择以下一项
- 单遍
- 双遍
- 三遍
- 实心猜测(默认)
- 第 n 遍后的实心猜测
- 边界追踪
- Tesseral(网格)
- 同步轨道
- 轨道模式
此选项适用于大多数分形类型。
**单遍** 模式 ("1") 以逐像素的方式绘制屏幕。**双遍** ("2") 首先生成一个半分辨率屏幕作为预览,使用 2x2 像素方块,然后在第二次遍中生成其余的点。双遍不比单遍使用更多时间。**三遍** ("3") 生成实心猜测模式(见下面的 "g")的粗略第一遍,然后切换到 "1"(使用低分辨率视频模式)或 "2"(使用更高分辨率视频模式)。'3' 相对于 '2' 的优势在于,当使用高分辨率模式时,第一遍的分辨率要低得多(大约 160x120),因此比 passes=2 模式的第一遍快得多。但是,使用 '2' 模式,第一遍并不代表浪费的时间。'3' 模式浪费了生成粗略第一屏的努力。
单遍、双遍和三遍模式都会生成相同的图像。这些模式适用于那些希望获得最高精度的人。大多数人会希望使用猜测模式,下面会介绍。
**实心猜测** ("g") 是默认模式。它执行两到四次可见的遍 - 在更高分辨率的视频模式下更多。它第一次可见的遍实际上是两次遍 - 生成每 4x4、8x8 或 16x16 像素方块一个像素,并应用猜测逻辑在下一级(2x2、4x4 或 8x8)填充块。后续遍将以更精细的分辨率填充显示,跳过被相同颜色包围的块。实心猜测可能会猜错,但它确实猜得很快!
第 n 遍后停止实心猜测 ("g1" 到 "g6") 是猜测模式的一种变体,其中算法在第 n 遍后停止。此功能用于在低分辨率下探索,你更愿意看到一个低分辨率的图像,其中大块的像素填充整个屏幕,而不是一个小的低分辨率图像,就像你使用 <v>(视图窗口)命令得到的图像。请注意,在 <x> 屏幕上,你不能直接输入 g1 或 g2。反复按下 g,直到你获得所需的选项,或者使用左或右光标键。
**边界追踪** ("b"),它只对不包含颜色“岛屿”的分形类型(如曼德尔布罗特集,而不是牛顿类型)准确起作用,它会找到一个颜色边界,在屏幕周围追踪它,然后“绘制”颜色覆盖封闭区域。
**Tesseral(网格)** ("t") 是一种“超级实心猜测”选项,它会将图像逐级划分为子部分,并在边界为实心的矩形内填充颜色。它实际上比实心猜测算法慢,但它看起来很不错,所以我们保留了它。当颜色岛屿出现在矩形内部时,此模式也容易出错。
**扩散扫描** ("d") 是一种基于抖动技术的绘图类型。它扫描图像,均匀地传播点,并且对每个点,它都绘制一个适当大小的正方形,以便图像逐步增强。此方法计算图像中的所有点,是单遍/双遍/三遍的良好替代方法,即使是最慢的分形,也能快速可视化。使用 "fillcolor=0"(见下文),正方形不会被绘制,并且点会在图像上散开,直到所有点都被计算出来(有点像“淡入”)。
"fillcolor=" 选项在 <X> 屏幕或命令行中设置一个固定颜色,供边界追踪和 Tesseral(网格)计算用于填充定义的区域。这样做的效果是显示这两种方法限定的区域的边界。
**轨道** ("o") 通过绘制逃逸时间分形的轨道来绘制图像。此技术使用与其他遍选项相同的坐标绘制图像,设置 "passes=1" 且没有对称性,然后绘制每个像素的轨道。实际上,放大 "passes=o" 图像是在放大 "passes=1" 图像,结果图像可能与预期不同。要找到有趣的地方进行调查,在图像完成之后按下 <O>,并观察轨道在光标在屏幕上移动时的行为。参见轨道窗口(第 36 页)。
"outside=summ" 选项会导致轨道每次轨道接触像素时递增像素的颜色编号;结果显示是一个二维直方图。如果 "outside=" 是其他值,则 "inside=" 颜色决定了绘制的轨道的颜色。如果 "inside=0",则在 passes=1 图像的每个像素的开头递增颜色编号。
"orbitdelay=" 选项控制在轨道显示在屏幕上之前计算多少轨道。这允许轨道稳定下来。"orbitinterval=" 选项会导致轨道绘制每个第 n 个轨道点。非零值的 "periodicity=" 选项会导致轨道不绘制已经达到退出条件或轨道离开图像可见区域的轨道。periodicity 的零值将绘制所有轨道,除了由 orbitdelay 和 orbitinterval 修改的轨道。
**同步轨道** ("s") 是一种实验模式,使用基于 Michael Ganss 的 Almondbread 实现的“分形魔法”算法。此算法通过计算从不同点开始的平行轨道来优化深度缩放,并在轨道断裂形成时进行细分。Michael 的实现必须经过广泛修改才能与 Fractint 的 DOS 中等内存模型环境一起使用。
同步轨道(也称为 SOI)有一些局限性。SOI 与 fractint 松散耦合,大多数选项不适用于它。只实现了 mandel 和 julia 类型。SOI 仅适用于非常深的缩放,但仅限于双精度范围。在这个狭窄的放大范围内,SOI 可以带来巨大的加速。如果在命令行中使用“debug=3444”调用 fractint,则将使用长双精度(而不是双精度)版本,这允许缩放约 1000 倍更深。SOI 真的需要移植到 fractint 的任意精度。这可能只有在 Fractint 被转移到一个更好的编程环境之后才会发生。
-
c = -1.24
-
胖的杜瓦迪兔子
-
巴西利亚朱利亚集
19.6 版本的新功能包括:新的分形类型 {=HT_ESCHER escher_julia} 和 {=HT_VL volterra-lotka},由 迈克尔·萨金特 提供。
埃舍尔式的朱利亚集
(type=escher_julia)
这些在《分形图像科学》中提出的朱利亚集主题的独特变体,挑战我们扩展对分形如何迭代的先入为主的概念。我们从一个非常基本的朱利亚公式开始
z(n+1) = z(n)^2 + (0, 0i)
标准算法将测试每个迭代点以查看它是否“逃逸到无穷大”。如果它的尺寸或“模量”(它到原点的距离)超过预先选定的逃逸测试(第 100 页)值,则它位于朱利亚集之外,并且它将被驱逐到彩色等级集的世界,这些等级集以惊人的方式循环。但描述逃逸点的另一种方式是说它被“吸引”到无穷大。我们通过计算该点是否落在所有点比逃逸值创建的边界更靠近无穷大的“目标集”内来做出此决定。这样,围绕无穷大的“圆盘”在概念上与围绕有限吸引子(第 188 页)的圆盘没有区别,例如用于牛顿分形的那些。
在上面的公式中,当 c = (0, 0i) 时,这个标准算法会产生一个相当无趣的圆圈。但是佩特根来了,告诉我们“由于 T [目标集] 本质上可以是任何东西,所以这种方法具有巨大的艺术潜力。例如,T 可以是一个所谓的 p 范数圆盘......或一个缩放的填充的朱利亚集,或者一些手工设计的东西。这种方法开辟了一种简单 [当他使用这样的词时要小心] 和系统的方法来进行埃舍尔式的拼贴。”
所以,我们所做的是迭代上面的公式,缩放每次迭代,并将其代入第二个朱利亚公式。这个公式具有用户选择的 c 值。如果该点收敛于这个非圆形目标集
T = [ z: | (z * 15.0)^2 + c | < BAILOUT ]
我们根据总迭代次数为它着色。如果不是,它将被吸引到无穷大,可以用通常的外部着色选项着色。这个公式使用了一个新的 Fractint 编程功能,它允许对收敛到目标朱利亚集的点使用自定义着色选项,同时允许其他点由标准分形引擎处理,并使用其所有选项。
使用适当的调色板和 c 参数,并使用反转(第 94 页)选项和来自颜色参数第 130 页的纯色外部颜色,你可以创建一个日食,日冕由从太阳表面辐射的朱利亚形状的火焰组成。
如果你质疑这些图像与埃舍尔的关联,请查看他的《圆形极限》系列(特别是 III 和 IV)。用他自己的话说:“今天是否还存在许多......任何类型的艺术家,他们渴望深入无穷......是有待怀疑的。......只有一种可能的方式......在逻辑边界线内完全获得“无穷大”......。最大的......形状现在位于中心,而无限数量和无限小的极限位于圆周......。没有一个单一的组成部分能到达边缘。因为在边缘之外是“绝对的虚无”。然而,这个圆形世界无法没有周围的空虚而存在,不仅仅是因为“内部”预示着“外部”,而且还因为正是外面在“虚无”中,这些形成框架的弧线的中心点以如此几何的精确度固定着。”
参考文献
- Ernst, B. M. C. 埃舍尔的魔镜,巴恩斯与诺布尔,1994 年,第 102-11 页。
- Peitgen, H.-O. 和 Saupe, D. 分形图像科学,施普林格出版社,1988 年;第 185、187 页。
可以搜索源代码使用
grep -nR "escher"
结果
// help2.src
Escher-like tiling of Julia sets from The Science of Fractal Images
z(0) = pixel
z(n+1) = z(n)^2 + (0, 0i)
The target set is a second, scaled, Julia set:
T = [ z: | (z * 15.0)^2 + c | < BAILOUT ]
Two parameters: real and imaginary parts of c
Iteration count and bailout size apply to both Julia sets.
// fractalp.c
{
"escher_julia",
{realparm, imagparm, ES, ES},
{0.32, 0.043, 0, 0},
HT_ESCHER, HF_ESCHER, WINFRAC,
(float)-1.6, (float)1.6, (float)-1.2, (float)1.2,
0, NOFRACTAL, NOFRACTAL, NOFRACTAL, ORIGIN,
EscherfpFractal, juliafp_per_pixel, StandardSetup,
StandardFractal,
STDBAILOUT
},
// fractal19.par
{ ; "Escher-Julia #1" t= 0:32:35.06
; t=calc time [h:mm:ss.] using 486DX2-66 at 1024x768
; (c) 1997 by Les St Clair [email protected]
; parameters created on Apr 13, 1997
reset=1960 type=escher_julia passes=1
center-mag=+0.42798355610118920/+0.29420988317529780/3.4153
params=0.005/0.641 float=y bailout=100 inside=bof60 logmap=4
decomp=256
colors=000H51<39>ywezxfzxf<40>H51G40G40<40>ywezxfzxf<40>H51G40G40<40>ywe\
zxfzxf<39>I62 cyclerange=0/255
}
/*
fracint
CALCFRAC.C contains the high level ("engine") code for calculating the
fractal images (well, SOMEBODY had to do it!).
Original author Tim Wegner, but just about ALL the authors have contributed
SOME code to this routine at one time or another, or contributed to one of
the many massive restructurings.
The following modules work very closely with CALCFRAC.C:
FRACTALS.C the fractal-specific code for escape-time fractals.
FRACSUBR.C assorted subroutines belonging mainly to calcfrac.
CALCMAND.ASM fast Mandelbrot/Julia integer implementation
Additional fractal-specific modules are also invoked from CALCFRAC:
LORENZ.C engine level and fractal specific code for attractors.
JB.C julibrot logic
PARSER.C formula fractals
and more
-------------------------------------------------------------------- */
/******************* boundary trace method ***************************
Fractint's original btm was written by David Guenther. There were a few
rare circumstances in which the original btm would not trace or fill
correctly, even on Mandelbrot Sets. The code below was adapted from
"Mandelbrot Sets by Wesley Loewer" (see calmanfp.asm) which was written
before I was introduced to Fractint. It should be noted that without
David Guenther's implementation of a btm, I doubt that I would have been
able to implement my own code into Fractint. There are several things in
the following code that are not original with me but came from David
Guenther's code. I've noted these places with the initials DG.
Wesley Loewer 3/8/92
*********************************************************************/
#define bkcolor 0 /* I have some ideas for the future with this. -Wes */
#define advance_match() coming_from = ((going_to = (going_to - 1) & 0x03) - 1) & 0x03
#define advance_no_match() going_to = (going_to + 1) & 0x03
/***** vars for new btm *****/
enum direction {North,East,South,West};
enum direction going_to;
int trail_row, trail_col;
static
int bound_trace_main(void)
{
enum direction coming_from;
unsigned int match_found, continue_loop;
int trail_color, fillcolor_used, last_fillcolor_used = -1;
int max_putline_length;
int right, left, length;
static FCODE btm_cantbeused[]={"Boundary tracing cannot be used with "};
if (inside == 0 || outside == 0)
{
static FCODE inside_outside[] = {"inside=0 or outside=0"};
char msg[MSGLEN];
far_strcpy(msg,btm_cantbeused);
far_strcat(msg,inside_outside);
stopmsg(0,msg);
return(-1);
}
if (colors < 16)
{
char msg[MSGLEN];
static FCODE lessthansixteen[] = {"< 16 colors"};
far_strcpy(msg,btm_cantbeused);
far_strcat(msg,lessthansixteen);
stopmsg(0,msg);
return(-1);
}
got_status = 2;
max_putline_length = 0; /* reset max_putline_length */
for (currow = iystart; currow <= iystop; currow++)
{
reset_periodicity = 1; /* reset for a new row */
color = bkcolor;
for (curcol = ixstart; curcol <= ixstop; curcol++)
{
if (getcolor(curcol, currow) != bkcolor)
continue;
trail_color = color;
row = currow;
col = curcol;
if ((*calctype)()== -1) /* color, row, col are global */
{
if (showdot != bkcolor) /* remove showdot pixel */
(*plot)(col,row,bkcolor);
if (iystop != yystop) /* DG */
iystop = yystop - (currow - yystart); /* allow for sym */
add_worklist(xxstart,xxstop,curcol,currow,iystop,currow,0,worksym);
return -1;
}
reset_periodicity = 0; /* normal periodicity checking */
/*
This next line may cause a few more pixels to be calculated,
but at the savings of quite a bit of overhead
*/
if (color != trail_color) /* DG */
continue;
/* sweep clockwise to trace outline */
trail_row = currow;
trail_col = curcol;
trail_color = color;
fillcolor_used = fillcolor > 0 ? fillcolor : trail_color;
coming_from = West;
going_to = East;
match_found = 0;
continue_loop = TRUE;
do
{
step_col_row();
if (row >= currow
&& col >= ixstart
&& col <= ixstop
&& row <= iystop)
{
/* the order of operations in this next line is critical */
if ((color = getcolor(col, row)) == bkcolor && (*calctype)()== -1)
/* color, row, col are global for (*calctype)() */
{
if (showdot != bkcolor) /* remove showdot pixel */
(*plot)(col,row,bkcolor);
if (iystop != yystop) /* DG */
iystop = yystop - (currow - yystart); /* allow for sym */
add_worklist(xxstart,xxstop,curcol,currow,iystop,currow,0,worksym);
return -1;
}
else if (color == trail_color)
{
if (match_found < 4) /* to keep it from overflowing */
match_found++;
trail_row = row;
trail_col = col;
advance_match();
}
else
{
advance_no_match();
continue_loop = going_to != coming_from || match_found;
}
}
else
{
advance_no_match();
continue_loop = going_to != coming_from || match_found;
}
} while (continue_loop && (col != curcol || row != currow));
if (match_found <= 3) /* DG */
{ /* no hole */
color = bkcolor;
reset_periodicity = 1;
continue;
}
/*
Fill in region by looping around again, filling lines to the left
whenever going_to is South or West
*/
trail_row = currow;
trail_col = curcol;
coming_from = West;
going_to = East;
do
{
match_found = FALSE;
do
{
step_col_row();
if (row >= currow
&& col >= ixstart
&& col <= ixstop
&& row <= iystop
&& getcolor(col,row) == trail_color)
/* getcolor() must be last */
{
if (going_to == South
|| (going_to == West && coming_from != East))
{ /* fill a row, but only once */
right = col;
while (--right >= ixstart && (color = getcolor(right,row)) == trail_color)
; /* do nothing */
if (color == bkcolor) /* check last color */
{
left = right;
while (getcolor(--left,row) == bkcolor)
/* Should NOT be possible for left < ixstart */
; /* do nothing */
left++; /* one pixel too far */
if (right == left) /* only one hole */
(*plot)(left,row,fillcolor_used);
else
{ /* fill the line to the left */
length=right-left+1;
if (fillcolor_used != last_fillcolor_used || length > max_putline_length)
{ /* only reset dstack if necessary */
memset(dstack,fillcolor_used,length);
last_fillcolor_used = fillcolor_used;
max_putline_length = length;
}
sym_fill_line(row, left, right, dstack);
}
} /* end of fill line */
#if 0 /* don't interrupt with a check_key() during fill */
if(--kbdcount<=0)
{
if(check_key())
{
if (iystop != yystop)
iystop = yystop - (currow - yystart); /* allow for sym */
add_worklist(xxstart,xxstop,curcol,currow,iystop,currow,0,worksym);
return(-1);
}
kbdcount=max_kbdcount;
}
#endif
}
trail_row = row;
trail_col = col;
advance_match();
match_found = TRUE;
}
else
advance_no_match();
} while (!match_found && going_to != coming_from);
if (!match_found)
{ /* next one has to be a match */
step_col_row();
trail_row = row;
trail_col = col;
advance_match();
}
} while (trail_col != curcol || trail_row != currow);
reset_periodicity = 1; /* reset after a trace/fill */
color = bkcolor;
}
}
return 0;
}
/*******************************************************************/
/* take one step in the direction of going_to */
static void step_col_row()
{
switch (going_to)
{
case North:
col = trail_col;
row = trail_row - 1;
break;
case East:
col = trail_col + 1;
row = trail_row;
break;
case South:
col = trail_col;
row = trail_row + 1;
break;
case West:
col = trail_col - 1;
row = trail_row;
break;
}
}
/******************* end of boundary trace method *******************/
- ubuntu : xfractint
- windows-7 with dosbox
- 迭代动力学 是一个基于 DOS fractint 程序的开源分形生成器。 文档
来自 sci.fractals 常见问题解答[21] 的答案,由迈克尔·C·泰勒和让-皮埃尔·卢瓦特撰写,以及其他人的大量贡献。
Fractint 的速度(如它所是)归因于以下因素的组合
- 通过周期性检查和猜测实心区域(尤其是“湖泊”区域)来减少计算。
- 在许多地方使用手工编码的汇编器。
- 尽可能使用定点数学而不是浮点数学(对于非协处理器机器来说是巨大的改进,对于 486 来说是小的,对于奔腾处理器来说是无关紧要的)。
- 利用分形的对称性。
- 检测几乎重复的轨道,避免无用的迭代(例如,重复迭代 02+0 等等)。
- 从一个 387 数学协处理器指令中获得正弦和余弦。
- 在 256 色模式下使用良好的直接内存图形写入。
前三个可能是最重要的。其中一些会引入误差,通常是相当可以接受的。
- ↑ fractint 图像计算参数
- ↑ Fractaal 论坛 : FractInt > Mag
- ↑ 在 FractInt 和 Fractal eXtreme 调色板之间转换
- ↑ 弗雷德·席姆尔的 KAM 地图
- ↑ retrocomputing SE 问题:为什么选择这些颜色作为 256 色 VGA 的默认调色板?
- ↑ fountainware : vga 颜色调色板
- ↑ Laurent Chabin 对 PAR 文件的简要介绍
- ↑ julian haight : filmer 指令
- ↑ Fractint 文档索引
- ↑ Rupert Russell 的 Fractint par 文件
- ↑ Laurent Chabin 的 FRACTINT 视频
- ↑ Fractint .par 文件页面
- ↑ fractint 图像计算参数
- ↑ [Fractint] FOTD 27-07-11 (Bad Moon on the Rise [无评分])
- ↑ Richard A Thomson 渲染曼德尔布罗特集的场线
- ↑ Fractint 深度缩放
- ↑ /spanky/pub/fractals/params 的索引
- ↑ nehee par 集合
- ↑ fracton 链接
- ↑ Hopy 的 Fractint .par 文件页面
- ↑ faqs.org : sci/fractals-faq