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?
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