跳转到内容

分形/xaos

来自 Wikibooks,开放世界的开放书籍

XaoS 是一个用 C++ 和 JS 编写的交互式分形缩放程序。它允许用户实时连续放大或缩小分形。

这里是非官方的 XaoS wiki。





Hubička 算法

[编辑 | 编辑源代码]

XaoS 最初只是一个“写得不好的”Mandelbrot 浏览器[1],直到 Jan Hubička 添加了高效缩放(= 实时缩放[2][3],使用了一种有时称为 XaoS 算法或 Hubička 算法的技术。

当时,分形缩放电影是通过完全重新计算每一帧来制作的,即使它们自然地与彼此共享大部分区域。这使得在没有非常强大的计算机的情况下,交互式缩放成为不可能。[4] 此外,除非使用更多处理来进行抗锯齿,否则重新计算每一帧会产生“闪烁”效果,因为小的明亮区域会在像素之间出现然后消失。[5]

然而,允许用户缩放,而不是像Fractint那样跳跃,似乎是与分形交互最自然的方式。为了创建一个交互式缩放,Hubička 需要找到一种方法来保存已经完成的计算。保存每个计算过的像素会占用太多内存,因此 Hubička 算法只保存上一帧,而不是记住每个像素的位置,它可以将它们对齐成行和列并记住它们。

XaoS 算法中最困难的部分是选择将保存的行和列绘制在哪里。这样做错误会导致图像失真,但必须快速完成才能有用。在尝试了几种不同的启发式方法之后,最终将这个问题视为一个优化问题。

剩余的行和列的颜色与最接近的行/列相同,并在CPU有时间这样做时被重新计算。这在保持缩放进行和提高细节水平之间取得了平衡。计算图像正在缩放到的区域的优先级更高,因为这些区域将在屏幕上停留时间最长,而且这很可能是用户正在查看的地方。缩小,则相反,优先级在边缘。[5]

Hubička 算法也可以应用于放大其他像素是计算出来的图像,并且已在其他软件中使用,例如 rtzme 复函数绘图程序[6],以及其他分形缩放器。

命令行选项

[编辑 | 编辑源代码]

要找到它,使用 

xaos -help

输出是 

 XaoS3.5 help text
 (This help is genereated automagically. I am sorry for all inconvencies)

option string   param   description

 -delay          number
                  Delay screen updates (milliseconds)
 -driver         string
                  Select driver
 -list            List available drivers. Then exit
 -config          Print configuration. Then exit
 -speedtest       Test speed of calculation loop. Then exit
 -threads        number
                  Set number of threads (CPUs) to use
 -pipe           string
                  Accept commands from pipe (use "-" for stdin)
 -maxframerate   number
                  Maximal framerate (0 for unlimited - default)

Screen size options:

  Knowledge of exact screen size makes random dot stereogram look better. 
  Also is used for choosing correct view area

 -screenwidth    f.point
                  exact size of screen in centimeters
 -screenheight   f.point
                  exact size of screen in centimeters

  Use this option in case you use some kind of virtual screen
  or something similar that confuses previous options

 -pixelwidth     f.point
                  exact size of one pixel in centimeters
 -pixelheight    f.point
                  exact size of one pixel in centimeters
 -formula        string
                  user formula
 -forminit       string
                  z0 for user formula

Animation rendering:

 -render         string
                  Render animation into seqence of .png files
 -basename       string
                  Name for .png files (XaoS will add 4 digit number and extension
 -size           string
                  widthxheight
 -renderimage    string
                  256 or truecolor
 -renderframerate  f.point
                  framerate
 -antialiasing    Perform antialiasing (slow, requires quite lot of memory)
 -alwaysrecalc    Always recalculate whole image (slowes down rendering, increases quality)
 -rendervectors   Render motion vectors (should be used for MPEG encoding)
 -iframedist     number
                  Recommended distance between I frames in pat file (should be used for MPEG encoding)

X11 driver options:

 -display        string
                  Select display
 -size           string
                  Select size of window (WIDTHxHEIGHT).
 -sync            Generate sync signals before looking for events. This
			helps on old and buggy HP-UX X servers.
 -shared          Use shared colormap on pseudocolor display.
 -usedefault      Use default visual if autodetection causes troubles.
 -nomitshm        Disable MITSHM extension.
 -fullscreen      Enable fullscreen mode.
 -windowid       number
                  Use selected window.
 -window-id      number
                  Use selected window.
 -root            Use root window.

AA driver options:

 -aadriver       string
                  Select display driver used by aa-lib
 -kbddriver      string
                  Select keyboard driver used by aa-lib
 -mousedriver    string
                  Select keyboard driver used by aa-lib
 -font           string
                  Select font
 -width          number
                  Set width
 -height         number
                  Set height
 -minwidth       number
                  Set minimal allowed width
 -minheight      number
                  Set minimal allowed height
 -maxwidth       number
                  Set maximal allowed width
 -maxheight      number
                  Set maximal allowed height
 -recwidth       number
                  Set recommended width
 -recheight      number
                  Set recommended height
 -normal          enable usage of narmal{{typo help inline|reason=similar to harmal|date=September 2022}} characters
 -nonnormal        disable usage of normal characters
 -dim             enable usage of dim(half bright) characters
 -nodim           disable usage of dim(half bright) characters
 -bold            enable usage of bold(double bright) characters
 -nobold          disable usage of bold(double bright) characters
 -boldfont        enable usage of boldfont characters
 -noboldfont      disable usage of boldfont characters
 -reverse         enable usage of reversed characters
 -noreverse       disable usage of reversed characters
 -all             enable usage of reserved characters
 -eight           enable usage of non ansi characters
 -extended        enable usage of extended character set
 -inverse         enable inverse
 -bright         number
                  set bright (0-255)
 -contrast       number
                  set contrast (0-255)
 -gamma          f.point
                  set famma (0-1)
 -nodither        Disable dithering
 -floyd_steinberg   Enable floyd steinberg dithering
 -error_distribution   Enable error distribution dithering
 -random         number
                  Set random dithering value
 -dimmul         f.point
                  Multiply factor for dim color (5.3)
 -boldmul        f.point
                  Multiply factor for bold color (5.3)
 -nomouse         Disable mouse

Command line options only

 -print_menus     print menus specifications of all menus
 -print_menu     string 
                  print menu specification
 -xshl_print_menustring 
                  print menu specification in xshl format
 -xshl_print_menus print all menu specifications in xshl format
 -print_dialog   string 
                  print dialog specification

File

 -loadpos        input_file 
                  Load
 -savepos        output_file 
                  Save
 -record         output_file 
                  Record
 -play           input_file 
                  Replay
 -saveimg        output_file 
                  Save image
 -loadexample     Load random example
 -savecfg         Save configuration

Fractal

 -usrform        string 
                  User formula
 -usrformInit    string 
                  User initialization
 -perturbation   real_number  real_number 
                  Perturbation
 -initstate       Reset to defaults
 -julia          on|off 
                  Julia mode
 -view           real_number real_number real_number real_number 
                  View
 -angle          real_number 
                  Set angle
 -plane          integer 
                  Set plane
 -incoloring     integer 
                  Inside coloring mode
 -outcoloring    integer 
                  Outside coloring mode
 -intcoloring    integer 
                  Inside truecolor coloring mode
 -outtcoloring   integer 
                  Outside truecolor coloring mode
 -juliaseed      real_number  real_number 
                  Julia seed

Calculation

 -periodicity     Periodicity checking
 -maxiter        integer 
                  Iterations
 -bailout        real_number 
                  Bailout
 -fastjulia       Fast julia mode
 -range          integer 
                  Solid guessing range

Filters

 -edge            Edge detection
 -edge2           Edge detection2
 -threed          Pseudo 3d
 -starfield       Starfield
 -stereogram      Random dot stereogram
 -interlace       Interlace filter
 -blur            Motionblur
 -emboss          Emboss
 -palettef        Palette emulator
 -anti            Antialiasing
 -truecolor       Truecolor emulator

UI

 -letterspersec  integer 
                  Letters per second
 -autopilot       Autopilot
 -inhibittextoutput VJ mode
 -recalculate     Recalculate
 -interrupt       Interrupt
 -speed          real_number 
                  Zooming speed
 -fixedstep       Fixed step
 -nogui           Disable XaoS's builtin GUI
 -status          Status
 -ministatus      Ministatus

Misc

 -playstr        string 
                  Play string
 -text           string 
                  Display text
 -color          white|black|red 
                  Color
 -textposition   left|center|right top|middle|bottom 
                  Text position
 -message        string 
                  Message

Help

 -help            Help

Formulae

 -mandel          Mandelbrot
 -mandel3         Mandelbrot^3
 -mandel4         Mandelbrot^4
 -mandel5         Mandelbrot^5
 -mandel6         Mandelbrot^6
 -newton          Newton
 -newton4         Newton^4
 -barnsley        Barnsley1
 -barnsley2       Barnsley2
 -barnsley3       Barnsley3
 -octal           Octal
 -phoenix         Phoenix
 -magnet          Magnet
 -magnet2         Magnet2

More formulae

 -trice           Triceratops
 -catseye         Catseye
 -mbar            Mandelbar
 -mlambda         Lambda
 -manowar         Manowar
 -spider          Spider
 -sier            Sierpinski
 -carpet          S.Carpet
 -koch            Koch Snowflake
 -hornflake       Spidron hornflake
 -user            User defined

Palette

 -defpalette      Default palette
 -randompalette   Random palette
 -palette        integer integer integer 
                  Custom palette
 -cycling         Color cycling
 -cyclingspeed   integer 
                  Color cycling speed
 -shiftpalette   integer 
                  Shift palette

Dynamic resolution

 -fastmode       zero|never|animation|new|allways 
                  Dynamic resolution mode

Rotation

 -rotationspeed  real_number 
                  Rotation speed
 -autorotate     on|off 
                  Automatic rotation
 -fastrotate     on|off 
                  Fast rotation mode

Quit

 -quit            Exit now

Xaos 动画文件 (*.xaf ) 是一个包含用于生成图像序列的函数的文件

例如 

xaos-3.5/tutorial/julia.xaf

要创建 xaf 文件,请使用记录功能,语法 

(record bool [ file ])

示例 

 (record #t)

或 

(record #f)

如何从 xaf 文件渲染图像序列 

xaos -render [xpf_filename] -size 352x240 -antialiasing -renderframerate 24 -basename [basename]

xpf 代表 **Xaos 位置文件**。该文件是人类可读的,并且可以在保存后轻松地手动改进,或者用作动画的基础。[7]

例如,请参见 

标准视图(无缩放的 Mandelbrot 集 = 图像) 

;Position file automatically generated by XaoS 3.5
;  - a real-time interactive fractal zoomer
;Use xaos -load <filename> to display it
(initstate)
(defaultpalette 0)
(formula 'mandel)
(view -0.75 0 2.5 2.5)

当我们切换到 Julia 模式(禁用 Mandelbrot 模式)时 

(initstate)
(defaultpalette 0)
(formula 'mandel)
(julia #t)
(view -0.75 0 2.5 2.5)

或将 c 值(= **Julia 种子**)从 c=0 更改为 c= -1

(initstate)
(defaultpalette 0)
(formula 'mandel)
(juliaseed -1 0)
(julia #t)
(view -0.8434 0.07535 2.744 2.744)

或显示平面值(默认 = 0 不显示) 

(initstate)
(defaultpalette 0)
(formula 'mandel)
(juliaseed -1 0)
(julia #t)
(plane 0)
(view -0.9127 -0.09268 2.285 2.285)

minibrot.xpf 

(initstate)
(palette 1 860134713 0)
(formula 'mandel)
(outcoloring 1)
(view -1.9854567 -1.351727E-05 0.00029196024 0.00029196024)

其中视图[8] 描述了 视窗(平面的矩形部分)

 view float float float float
 view centerRe centerIm radius angle

xpf 文件列表 

为了描述 平面(视图),Xaos 使用

  • 脚本中的 4 个数字
  • 菜单中的 3 个数字

Xaos 用“半径”来称呼它,但它被定义为:” (x2-x1= 宽度) 和 y2-y1= 高度 的较大值。“ 这就是为什么在 Xaos 中可以将半径设置为 2/缩放的原因。

要使用 **菜单** 在 Xaos 中设置相同的视点,请设置 3 个数字来定义圆形

  • 中心的实部为 (x1+x2)/2
  • 中心的虚部为 (y1+y2)/2
  • “半径” = x2-x1 和 y2-y1 的较大值。

其中,可见点的左上角和右下角的坐标,指定坐标为四个数字 x1、y1、x2、y2。

在 **xpf 文件** 中,平面可以用 4 个浮点数描述:[9]

  • 中心的实部
  • 中心的虚部
  • 世界坐标系中的宽度 = x2-x1,称为“实际半径”。
  • 世界坐标系中的高度 = y2-y1,称为“虚半径”。

语法

(view float float float float)

示例

(view -0.75 0 2.5 2.5)
"People specify fractal coordinates in many ways. Some people use the coordinates of the upper-left and lower-right visible points, specifying the coordinates as four numbers x1, y1, x2, y2. 
To set the same viewpoint in XaoS, set the real portion of the center to (x1+x2)/2, the imaginary   part of center to (y1+y2)/2, and the radius to the greater of x2-x1 and y2-y1.
Other programs use a zoom factor instead of a radius. For these, you can set the radius to 2/zoom."[10]
" ... lets you specify an ellipse instead of a circle. You can specify both a real and an imaginary radius "
(initstate)
(defaultpalette 0)
(formula 'user)
(usrform "Z^2+C")
(usrformInit "")
(view -0.4641 0.01977 2.444 2.444)
(bailout 6)

逃逸值或逃逸半径。Xaos 在这里使用逃逸半径的平方,所以如果你想要逃逸值为 2,在这里输入 2*2 = 4。

语法:[11]

 (formula keyword)

示例

 (formula mandel)
名称 描述 教程 用户公式
mandel 标准曼德勃罗集或朱利亚集。 mset.xaf Z^2+C
mandel3 示例 power.xaf Z^3+C
mandel4 示例 power.xaf Z^4+C
mandel5 示例 power.xaf Z^5+C
mandel6 示例 power.xaf Z^6+C
newton 这是牛顿求解多项式根的近似方法。它使用多项式 x^3=1 newton.xaf
barnsley 示例 示例 示例
octo 示例 示例 示例
phenix 示例 示例 示例
magnet
trice

更改命名公式(菜单/分形/公式)不会更改用户公式!!!

语法

(plane integer)

允许的值:[12]

名称 描述
0 mu 普通复平面(默认)
1 1/mu 反演:旧的无穷大现在在 0,而旧的 0 现在在无穷大。
2 1/(mu+0.25) 类似于反演,但也会将中心移到曼德勃罗集之外,使其看起来像抛物线。
3 lambda lambda 平面
4 1/lambda lambda 平面的反演
5 1/(lambda-1) 具有移动中心的反演
6 1/(mu-1.40115) 具有移动中心的反演
// from xaos-3.5\src\engine\plane.c 
/* 
 *     XaoS, a fast portable realtime fractal zoomer 
 *                  Copyright (C) 1996,1997 by
 *
 *      Jan Hubicka          ([email protected])
 *      Thomas Marsh         ([email protected])
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
CONST char *CONST planename[] = {
    "mu",
    "1/mu",
    "1/(mu+0.25)",
    "lambda",
    "1/lambda",
    "1/(lambda-1)",
    "1/(mu-1.40115)",
    NULL
};

// include/complex.h:57:
// #define myabs(x) ((x)>0?(x):-(x))

REGISTERS(3)
void recalculate(int plane, number_t * x1, number_t * y1)
{
    number_t x = *x1, y = *y1;
    switch (plane) {
    case 1:
	{			/* 1/mu */
	    number_t t;
	    if (myabs(x) + myabs(y) < 0.000001)
		t = INT_MAX, y = INT_MAX;
	    else {

		c_div(1, 0, x, y, t, y);
	    }
	    x = t;
	}
	break;
    case 2:
	{			/* 1/(mu + 0.25) */
	    number_t t;
	    if (myabs(x) + myabs(y) < 0.000001)
		t = INT_MAX, y = INT_MAX;
	    else {

		c_div(1, 0, x, y, t, y);
	    }
	    x = t;
	    x += 0.25;
	}
	break;
    case 3:			/* lambda */
	{
	    number_t tr, ti, mr, mi;

	    mr = x, mi = y;
	    c_pow2(x, y, tr, ti);
	    c_div(tr, ti, 4, 0, x, y);
	    c_div(mr, mi, 2, 0, tr, ti);
	    c_sub(tr, ti, x, y, mr, mi);
	    x = mr, y = mi;
	}
	break;
    case 4:			/* 1/lambda */
	{
	    number_t tr, ti, mr, mi;

	    c_div(1, 0, x, y, tr, y);
	    x = tr;
	    mr = x, mi = y;
	    c_pow2(x, y, tr, ti);
	    c_div(tr, ti, 4, 0, x, y);
	    c_div(mr, mi, 2, 0, tr, ti);
	    c_sub(tr, ti, x, y, mr, mi);
	    x = mr, y = mi;
	}
	break;
    case 5:			/* 1/(lambda-1) */
	{
	    number_t tr, ti, mr, mi;

	    c_div(1, 0, x, y, tr, y);
	    x = tr + 1;
	    mr = x, mi = y;
	    c_pow2(x, y, tr, ti);
	    c_div(tr, ti, 4, 0, x, y);
	    c_div(mr, mi, 2, 0, tr, ti);
	    c_sub(tr, ti, x, y, mr, mi);
	    x = mr, y = mi;
	}
	break;
    case 6:
	{			/* 1/(mu + 0.25) */
	    number_t t;
	    if (myabs(x) + myabs(y) < 0.000001)
		t = INT_MAX, y = INT_MAX;
	    else {

		c_div(1, 0, x, y, t, y);
	    }
	    x = t;
	    x -= 1.40115;
	}
	break;
    default:
	break;
    }
    *x1 = x;
    *y1 = y;
}

perturbation

[编辑 | 编辑源代码]

它更改了轨道开始的点。传统上使用零。[13]

(perturbation complex)
 info xaosdev.info

如何渲染大图像?

[编辑 | 编辑源代码]

这并不简单。[14] 可以使用以下方法:

  • 使用菜单中的动画(“将分形保存到 .xpf 文件(文件->保存),然后使用 Misc->Render Animation 功能渲染它”。[15]
  • 使用命令行选项[16]


XaoS -render fractal.xpf -size 18000x12000

如何更改分辨率

[编辑 | 编辑源代码]

"XaoS 通常以低分辨率(约 320x200)启动,以加快计算速度。如果您有快速的计算机或需要保存更大的 .gif 图像,您可以更改分辨率。这可以通过在全屏驱动程序中按 '=' 或简单地调整 XaoS 窗口大小来完成。" [17]

  • 使用 xpf 文件
  • 使用主菜单/分形/用户公式
  • 添加内置公式[18]
  • 编辑 src/engine/formulas.c 中的源代码

formulas.c

[编辑 | 编辑源代码]
#define VARIABLES register number_t n,sqrr,sqri,zre1,zim1;
#define INIT sqri=zim*zim,n=zre,zre=pre,pre=n,n=zim,zim=pim,pim=n,n=(number_t)1;
#define BTEST greater_then_1Em6(n)
#define FORMULA \
    zre1 = zre; \
    zim1 = zim; \
    n = zim * zim; \
    sqri = zre * zre; \
    sqrr = sqri - n; \
    sqri = n + sqri; \
    n = 0.3333333333 / ((sqri * sqri)); \
    zim = (0.66666666) * zim - (zre + zre) * zim * n + pim; \
    zre = (0.66666666) * zre + (sqrr) * n + pre; \
    zre1 -= zre; \
    zim1 -= zim; \
    n = zre1 * zre1 + zim1 * zim1;
#define CALC newton_calc
#include "docalc.c"

修改代码后,您必须重新编译 XaoS 才能生效。[19]

参考文献

[编辑 | 编辑源代码]
  1. XaoS 手册页
  2. 由 Zoltán Kovács 编写的实时缩放数学引擎
  3. xaosdev.info:算法
  4. CS and Dance (PDF), archived from the original on 2005-12-20
  5. a b Hubička, Jan (1997), XaoS 算法, archived from the original on 2014-03-28.
  6. 复平面的可视化, archived from the original on 2006-10-17
  7. Xaos 格式说明
  8. Xaos - 视图
  9. Xaos - 平面说明
  10. Xaos - 视图
  11. Xaos 文档 - 公式
  12. GNU XaoS » 文档 » XaoS » 平面
  13. Xaos 文档 - 扰动
  14. 无法(轻松)渲染高分辨率静态图像 #53
  15. xaos-users 论坛:分辨率
  16. xaos-users 论坛:Mac OSX 上的更高分辨率
  17. Xaos 教程
  18. Xaos 文档:由阿帕德·费凯特添加内置公式
  19. xaos-users 论坛:牛顿分形
华夏公益教科书