跳轉到內容

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

來自 Wikibooks,開放世界中的開放書籍

曼德勃羅集的拓撲模型

曼德勃羅集的拓撲模型 = 曼德勃羅仙人掌
週期數高達12的弧線
  • Thurston 模型(抽象的曼德勃羅集)[1]
    • Lavaurs 演算法 [2]
    • 抽象的曼德勃羅樹 [3]
  • 仙人掌模型 [4](轉到 影像,其中包含演算法的原始碼和描述)
  • 偽曼德勃羅集 = 沒有毛髮、細絲和原始雙曲分量的 M 集[5]





Lavaurs 演算法

[編輯 | 編輯原始碼]
週期數高達12的曼德勃羅集層疊

該演算法展示了

  • 如何計算落在曼德勃羅集根點的外部射線的角度
  • 如何繪製圖(圓上的層疊)顯示曼德勃羅集的結構

落在曼德勃羅集週期 p 分量的根點的外部角(以轉為單位,模 1)為

弧線(弦)由以下部分組成:

  • 落在相同根點的兩個外部角
  • 根點。
  • 二次次要層疊 = QML.
    • 它是任何二次不變層疊的 次要葉 的集合。次要葉是層疊中最長葉的影像。[6] 二次次要層疊的近似值僅包含週期性次要葉。
    • 二次次要層疊 QML 包含樹枝狀二次多項式的次要標籤。
  • 與曼德勃羅集相關的圓上層疊
  • 抽象的曼德勃羅集(Thurston)
  • 曼德勃羅集的捏合圓盤模型:在捏合(粘合)圓上所有由弧線連線的點之後。它是與曼德勃羅集同胚的空間[7]

數學描述

[編輯 | 編輯原始碼]
  • 繪製單位圓
  • 用單位圓中垂直於邊界 的弧線連線週期為二的角度:1/3 和 2/3
  • 對於下一個週期,用弧線連線相同週期(第一和第二)的兩個角度,使得
    • 沒有弧線交叉任何其他(先前的)弧線,
    • 第一個角度是尚未連線的最小角度,第二個角度是尚未連線的下一個最小角度[8][9]

程式設計師描述

[編輯 | 編輯原始碼]
  • 在影像中間繪製以 (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
[編輯 | 編輯原始碼]

在 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)

程式碼示例

[編輯 | 編輯原始碼]

參考文獻

[編輯 | 編輯原始碼]
  1. 曼德勃羅集中的組合學 - Lavaurs 演算法
  2. Lavaurs 演算法 用 Lisp 實現 by Ruben Berenguel
  3. 抽象曼德勃羅樹
  4. 曼德勃羅仙人掌
  5. Burns A M : : 繪製逃逸 - 曼德勃羅集中拋物線分叉的動畫。數學雜誌:第 75 卷,第 2 期,第 104-116 頁,第 104 頁
  6. Freddie Exall : 等價交配簡介
  7. A. DOUADY,計算曼德勃羅集中角度的演算法(混沌動力學和分形,由 Barnsley 和 Demko 編輯,Acad. Press,1986 年,第 155-168 頁)。
  8. Lavaurs,P.,“M 在奇數分母有理數上定義的內卷的組合描述”,C. R. Acad. Sci. Paris 303(1986),143-146。
  9. 曼德勃羅集中的組合學 - Lavaurs 演算法
  10. 從耶魯大學的分形幾何構建正交圓
  11. planetmath.org 上的正交圓
  12. Postscript 運算子
  13. SVG 文件:橢圓弧曲線命令
  14. svg 基礎圓弧描述
  15. 橢圓弧實現說明
  16. Mozilla 開發者中心路徑
  17. Pilat Informative Educative 圓弧
  18. O'Reilly 文件
  19. 初始座標系 - w3.org 上的 SVG 文件
  20. Zach Beane 編寫的 Vecto Common Lisp 包中的 arcn 過程。
  21. Ruben Berenguel 的 Lavaurs 演算法

另請參閱

[編輯 | 編輯原始碼]
華夏公益教科書