2009-02-07 19 views
5

Mandelbrot ayar görüntüsü oluşturmak için bir Python dosyası oluşturdum. Orijinal matematik kodu benim değildi, bu yüzden anlamıyorum - sadece 250x daha hızlı yapmak için ağır bir değişiklik yaptım (Threads rule!).Mandelbrot setinin bir bölümünde 'zoom' nasıl yapılır?

Neyse, belirli bir bit oluşturmak için kodun matematik bölümünü nasıl değiştirebileceğimi merak ediyordum.

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) 

Ve boyut tanımları: İşte matematik parçasıdır

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] 

ya ben kümesinin belirli bir bölümünü işlemek yapmak değiştirmek gerekiyor?

+0

Kodu daha hızlı yapmak için konuları nasıl kullandığınızı özledim python bytecod iş parçacığı üzerinde e GIL nedeniyle aynı anda yürütülmez. – nosklo

cevap

14

hattı:

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

oluşturulmakta olan uzay koordinat alanını tanımlayan bit, yani sadece bu hat değiştirmek gerekir. İlk koordinat çifti, alanın sol üst köşesi, ikincisi sağ alttır.

Görüntüden yeni bir koordinat almak için görüntü çok basit olmalıdır. İki koordinat sisteminiz var, "image" sisteminiz 100x100 piksel boyutunda, (0,0). Ve "kutu" ile tanımlanan "karmaşık" düzlem koordinat sisteminiz. X için:

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

Teşekkürler adamım! Bunları X ve Y değerlerine nasıl dönüştürebilirim? Mümkün mü? – Lobe

+0

Kutu iki adet x, y çifti içeriyor: kutu = ((x, y), (x, y)) Sorunuza cevap veriyor mu? –

+0

Ahh, bunun için üzgünüm, çubuğun yanlış ucunu aldım. Demek istediğim, tam işlenmiş resmin boyutlarına sahip olsaydım (100x100 Say), 100x100 görüntüsünün bir bölümünün x ve y değerlerini x ve y değerine "zumlamak" için nasıl dönüştürebilirim? Mümkün olduğundan şüphe duyuyorum - cevap verdiğiniz için teşekkürler! – Lobe

4
Bunun nasıl anlamada anahtar coords = hat ne yaptığını anlamaktır

:

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

Etkili, sen döngü vardır x ve y değerleri geçtiği karşılık Ekrandaki pikselin koordinatları, bakılmakta olan karmaşık düzlemde karşılık gelen noktaya çevrilir. Bu, (0,0) ekran koordinatının (-2,1.25)'a bakıldığında üst sol bölgeye çevrileceği ve (1,0)'un aynı olacağı, ancak -2 ve 0.5 x-koordinatı arasındaki mesafenin 1/500'ünü (500 piksel genişliğinde bir pencere varsayılarak) değiştireceği anlamına gelir.

tam olarak bu hat bunu yapıyor Yani - Sadece biraz daha açıklayıcı değişken adları ile X-koordinatı biraz bunu belirtmek genişleteceğiz:

mandel_x = mandel_start_x + (screen_x/screen_width) * mandel_width 

(mandel_ değişkenler karmaşık düzlemde koordinatlara bakın screen_ değişkenleri, çizilen pikselin ekran koordinatlarını ifade eder.)

Eğer yakınlaştırmak için ekranın bir bölgesini almak isterseniz, tam olarak aynısını yapmak istersiniz: Üst sol ve sağ alt bölge, onları karmaşık düzlemli coor'a çevirir dinler ve yeni uleft ve lright değişkenlerini yapar.

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)) 
boyut, xwidth, tabakasının genişliği yeniden hesaplamak gerekir Açıkçası

(ve: yani ekrandaki koordinatlar (x1, y1) .. (x2, y2), kullanım ile sınırlanmış kutuda yakınlaştırmak için yeni bağımlı değişkenlere dayalı diğer bağımlı değişkenler)

Merak ettiyseniz, mandelbrot setinin arkasındaki matematik karmaşık değildir (sadece karmaşık). Tüm yapmak, belirli bir koordinat almak, karmaşık bir sayı olarak ele almak ve sonra tekrar tekrar kare çizmek ve orijinal numarasını eklemek.

Bazı numaralar için, bu işlem sonucunda sonuç farklılaşmaya neden olacak ve işlemi tekrarlarken sürekli olarak sonsuza doğru büyüyecektir. Diğerleri için, her zaman belli bir seviyenin altında kalacaktır (ör. Belli ki (0.0, 0.0) bu süreçte asla büyüyemez. Mandelbrot seti (siyah bölge) birbirinden uzaklaşmayan koordinatlardır. kodunuzu sadece sqrt(5) (~ 2.236) onun yakınlaştırılması olarak 2.0 kullanıyor, ancak bu kadar fark edilir değişiklikler yapmaz

olsun sapmak Genellikle bölgeler - herhangi bir sayı 5 kare kökü yukarıda alır, bu sapacaktır. Bu değerleri aşması için işlemin yineleme sayısı ile (kodunuzdaki trials değişkeni) kaç kez çizilir?

İlgili konular