2009-02-07 57 views
5

我已經創建了一個Python文件來生成Mandelbrot設置圖像。原來的數學代碼不是我的,所以我不理解它 - 我只是對它進行了大量修改,使其速度提高了250倍(線程規則!)。如何在Mandelbrot集的一部分上「放大」?

無論如何,我想知道如何修改代碼的數學部分,使其渲染一個特定的位。這裏是數學部分:

for y in xrange(size[1]): 
     coords = (uleft[0] + (x/size[0]) * (xwidth),uleft[1] - (y/size[1]) * (ywidth)) 
     z = complex(coords[0],coords[1]) 
     o = complex(0,0) 
     dotcolor = 0 # default, convergent 
     for trials in xrange(n): 
      if abs(o) <= 2.0: 
       o = o**2 + z 
      else: 
       dotcolor = trials 
       break # diverged 
     im.putpixel((x,y),dotcolor) 

而且大小定義:

size1 = 500 
size2 = 500 
n=64 
box=((-2,1.25),(0.5,-1.25)) 
plus = size[1]+size[0] 
uleft = box[0] 
lright = box[1] 
xwidth = lright[0] - uleft[0] 
ywidth = uleft[1] - lright[1] 

我需要做什麼修改,使之呈現組中的特定部分?

+0

我錯過了如何使用線程來使代碼更快,因爲python bytecod由於GIL,線程上的e不會同時執行。 – nosklo 2009-02-08 09:28:10

回答

14

行:

box=((-2,1.25),(0.5,-1.25)) 

是定義座標所呈現空間的區域位,那麼你只需要改變這一行。第一個座標對是該區域的左上角,第二個是右下角。

從圖像中獲取新的座標應該非常簡單。您有兩個座標系,您的「圖像」系統尺寸爲100x100像素,原點爲(0,0)。而你的「複雜」平面座標系由「盒子」定義。對於X:

X_complex=X_complex_origin+(X_image/X_image_width)*X_complex_width 
+0

謝謝你!我如何將它們轉換爲X和Y值?可能嗎? – Lobe 2009-02-07 19:18:18

4

瞭解如何做到這一點的關鍵是要了解什麼coords =線做:

coords = (uleft[0] + (x/size[0]) * (xwidth),uleft[1] - (y/size[1]) * (ywidth)) 

實際上,你是循環的xy值通過對應屏幕上像素的座標正在被轉換到正在查看的複平面上的對應點。這意味着(0,0)的屏幕座標將轉換到左上角的區域被看作(-2,1.25),而(1,0)將是相同的,但在-20.5 x座標之間移動距離的1/500(假設500像素寬度的窗口)。

這正是該行正在做 - 我會擴大隻是更加說明變量名X座標位表示這樣的:

mandel_x = mandel_start_x + (screen_x/screen_width) * mandel_width 

(該mandel_變量參考座標在複平面上,screen_變量指的是正在繪製的像素的屏幕座標。)

如果你想然後取一個屏幕區域放大,你想要做的完全一樣:取屏幕座標左上角和右下角區域,將它們轉換爲複平面座標用餐,並使這些新的左右變量。即放大通過屏幕上的座標(X1,Y1)。(x2,y2),使用分隔框:

new_uleft = (uleft[0] + (x1/size[0]) * (xwidth), uleft[1] - (y1/size[1]) * (ywidth)) 
new_lright = (uleft[0] + (x2/size[0]) * (xwidth), uleft[1] - (y2/size[1]) * (ywidth)) 

(顯然,您需要重新計算大小,xwidth,ywidth和基於新座標的其他因變量)

如果您好奇,mandelbrot背後的數學並不複雜(只是複雜)。 它所做的只是採取一個特定的座標,將其視爲一個複數,然後重複對其進行平方並向其中添加原始數字。

對於某些數字,這樣做會導致結果發散,並在重複此過程時不斷向無限增長。對其他人來說,它總是會保持在一定的水平以下(例如,明顯(0.0,0.0))在這個過程中從來沒有變得更大,mandelbrot集合(黑色區域)是那些不發散的座標。任何數量得到的5平方根上面,它會發散 - 你的代碼是在運用2.0作爲其近似sqrt(5)(〜2.236),但是這不會有太大明顯的區別

通常是發散獲得的區域。繪製出他們需要超過這個值的過程的迭代次數(代碼中的trials變量),這就是產生彩色區域的原因。