分形/複平面上的迭代/曼德勃羅集/lavaurs
曼德勃羅集的拓撲模型



該演算法展示了
- 如何計算落在曼德勃羅集根點的外部射線的角度
- 如何繪製圖(圓上的層疊)顯示曼德勃羅集的結構
落在曼德勃羅集週期 p 分量的根點的外部角(以轉為單位,模 1)為
弧線(弦)由以下部分組成:
- 落在相同根點的兩個外部角
- 根點。
- 二次次要層疊 = QML.
- 與曼德勃羅集相關的圓上層疊
- 抽象的曼德勃羅集(Thurston)
- 曼德勃羅集的捏合圓盤模型:在捏合(粘合)圓上所有由弧線連線的點之後。它是與曼德勃羅集同胚的空間[7]
- 繪製單位圓
- 用單位圓中垂直於邊界 的弧線連線週期為二的角度:1/3 和 2/3
- 對於下一個週期,用弧線連線相同週期(第一和第二)的兩個角度,使得
-
週期 2
-
週期 3
-
週期 4
-
週期 5
- 在影像中間繪製以 (x0, y0) 為圓心、r0 為半徑的主圓
- 選擇週期,例如 p=3
- 計算角度對(以轉為單位)
- 對於每個角度對 (alpha,beta),使用新圓的一部分繪製一條弧線,該圓在 2 個點 c1、c2 處與主圓正交[10][11]
(待辦事項)
第一個單位是轉(角度對列表)
使用 ttr 函式
(defun ttr (turn)
" Turns to Radians"
(* turn (* 2 pi) ))
將它們轉換為弧度
(alpha (ttr ( first angle-list)))
主圓 (x0,y0,r0) 和新的正交圓 (x,y,r) 有 2 個公共點
- c1 = (a,b) = (x0 + r0 * cos(alpha) , y0 + r0 * sin(alpha))
- c2 = (x0 + r0 * cos(beta) , y0 + r0 * sin(beta))
(ca (cos alpha))
(sa (sin alpha))
; first common point
(a (+ x0 (* r0 ca))) ; a = x0 + r0 * cos(alpha)
(b (+ y0 (* r0 sa))) ; b = y0 + r0 * sin(alpha)
在交點處,半徑 r0 和新半徑或正交圓也正交。新圓的圓心 (x,y) 位於透過點 (x0,y0) 且斜率由角度 gamma 定義的直線上。
gamma = alpha + (balpha - alpha)/2
(gamma (+ alpha (/ (- balpha alpha) 2))) ; angle between alpha and balpha
利用這些資訊,可以計算新的圓:(x,y,r)
我們有
- 主圓 (x0, y0, r0)
- 新圓 (x, y, r)
- 交點 c1 和 c2 及其角度:alpha 和 beta
因為圓弧將使用新圓繪製,所以必須計算(轉換)新角度(在新圓中測量的角度)。
點 c1 = (a,b) 在新圓單位中的角度。
(phi (atan r0 r))) ; phi = (new-alpha - new-balpha)
(balha (+ pi gamma phi)) ; new balpha
(alpha (- (+ pi gamma) phi)) ; new alpha
這取決於可用的過程。
最簡單的情況是從點 c1 到 c2 繪製圓弧。
在 Postscript 中,有 arct 過程:[12]
x1 y1 x2 y2 r arct
因此,在 Lisp 中,可以直接建立 ps 檔案並使用此過程。
; code by Copyright 2009 Rubén Berenguel
; http://www.mostlymaths.net/2009/08/lavaurs-algorithm.html
(defun DrawArc (alpha balpha R)
"Generate the postscript arcs using arct
x1 y1 x2 y2 r arct "
(format t "newpath ~A ~A moveto 300 300 ~A ~A ~A arct"
(+ 300 (* 100 (cos balpha)))
(+ 300 (* 100 (sin balpha)))
(+ 300 (* 100 (cos alpha)))
(+ 300 (* 100 (sin alpha)))
R))
在 SVG 中,有橢圓弧曲線命令。[13][14][15][16][17][18]
它是路徑命令的一個版本,用於從當前點到 (x, y) 繪製橢圓弧。
橢圓的大小和方向由兩個半徑 (rx, ry) 和一個 x 軸旋轉定義,它指示橢圓整體相對於當前座標系的旋轉方式。
橢圓的中心 (cx, cy) 是自動計算的,以滿足其他引數施加的約束。
large-arc-flag 和 sweep-flag 有助於自動計算並幫助確定如何繪製圓弧。
rx ry x-axis-rotation large-arc-flag sweep-flag x y
<path d="M 100,100 a100,100 0 0,0 100,50" fill="none" stroke="red" stroke-width="6" />
<?xml version="1.0" standalone="no"?>
<svg width="800px" height="800px" version="1.1" xmlns="http://www.w3.org/2000/svg">
<path d="M100 100
A 100 100 0 0 0 162.55 162.45
" stroke="black" fill="none" stroke-width="2" fill-opacity="0.5"/>
</svg>
SVG 路徑元素
- M100 100 指定圓弧的絕對起點 (100,100)
- A 100 100 表示此圓弧的長軸和短軸長度相同 = 100
- 0 0 0 分別是 x 軸旋轉、large-arc-flag 和 sweep-flag
- 162.55 162.45 是圓弧的終點
因此,可以透過像這樣向 svg 檔案寫入路徑命令來繪製圓弧。
(format stream-name "<path d=\"M~,0f ~,0f A~,0f ~,0f 0 0 0 ~,0f ~,0f\" />~%"
(first arc-list)
(second arc-list)
(third arc-list)
(third arc-list)
(fourth arc-list) ;
(fifth arc-list))
請記住,SVG 中的**初始座標系**原點位於左上角,x 軸指向右側,y 軸指向下方。[19]對於繪製所有圓弧,這可能並不重要,但帶有角度的標籤將不正確。
這種情況比較困難,因為必須將角度從主圓轉換為新的正交圓。當角度轉換後,
- 將當前點移動到圓弧的第一個點(交點)。此處 c1 = (a,b)
- 繪製圓弧。順時針繪製圓弧比逆時針繪製更容易。
在 Vecto Common Lisp 包中,有 arcn 過程 [20]
(vecto:move-to ( sixth arc-list) (seventh arc-list)) ; beginning of arc is point (a,b)
(vecto:arcn
( first arc-list) ; x
(second arc-list) ; y
(third arc-list) ; radius
(fourth arc-list) ; angle1
(fifth arc-list))) ; angle2
(vecto:stroke)
- Common Lisp 程式碼
- 用於由 Ruben Berenguel 繪製 poscript 檔案[21]
- 用於使用 Vecto 包繪製 png 檔案
- 用於繪製 svg 檔案
- Claude Heiland-Allen 編寫的帶有 SVG 輸出的 Haskell 程式碼
- 來自程式 Mandel by Wolf Jung 第 4 頁第 7 頁的 c++ 程式碼
- ↑ 曼德勃羅集中的組合學 - Lavaurs 演算法
- ↑ Lavaurs 演算法 用 Lisp 實現 by Ruben Berenguel
- ↑ 抽象曼德勃羅樹
- ↑ 曼德勃羅仙人掌
- ↑ Burns A M : : 繪製逃逸 - 曼德勃羅集中拋物線分叉的動畫。數學雜誌:第 75 卷,第 2 期,第 104-116 頁,第 104 頁
- ↑ Freddie Exall : 等價交配簡介
- ↑ A. DOUADY,計算曼德勃羅集中角度的演算法(混沌動力學和分形,由 Barnsley 和 Demko 編輯,Acad. Press,1986 年,第 155-168 頁)。
- ↑ Lavaurs,P.,“M 在奇數分母有理數上定義的內卷的組合描述”,C. R. Acad. Sci. Paris 303(1986),143-146。
- ↑ 曼德勃羅集中的組合學 - Lavaurs 演算法
- ↑ 從耶魯大學的分形幾何構建正交圓
- ↑ planetmath.org 上的正交圓
- ↑ Postscript 運算子
- ↑ SVG 文件:橢圓弧曲線命令
- ↑ svg 基礎圓弧描述
- ↑ 橢圓弧實現說明
- ↑ Mozilla 開發者中心路徑
- ↑ Pilat Informative Educative 圓弧
- ↑ O'Reilly 文件
- ↑ 初始座標系 - w3.org 上的 SVG 文件
- ↑ Zach Beane 編寫的 Vecto Common Lisp 包中的 arcn 過程。
- ↑ Ruben Berenguel 的 Lavaurs 演算法
- 層疊
- Julia 集的層疊
- 圓的無交叉劃分
-
Mandelbrot 集的拓撲模型(反映物件的結構)。沒有迷你 Mandelbrot 集和 Misiurewicz 點的 Mandelbrot 集的拓撲模型(仙人掌模型)
-
分形旋轉裁剪
-
Mandelbrot 集的灌木模型