# ╔══════════════════════════════════════════════════════════════════╗ # ║ FRAKTAL — terminalde 24 bit renkli Mandelbrot ve Julia kümesi ║ # ║ ║ # ║ Her karakter hücresi İKİ piksel taşır: üst yarım blok `▀`'nin ║ # ║ ön plan rengi üst pikseli, arka plan rengi alt pikseli çizer. ║ # ║ Görüntü dört şeride bölünür ve şeritler AYNI ANDA hesaplanır. ║ # ║ ║ # ║ kabalang calistir fraktal.kbl → Mandelbrot ║ # ║ kabalang calistir fraktal.kbl --tur julia → Julia kümesi ║ # ║ kabalang calistir fraktal.kbl --yakinlas → derinlere dalış║ # ╚══════════════════════════════════════════════════════════════════╝ kullan kaba.sistem sayilabilir Kume: MANDELBROT JULIA # Kameranın baktığı yer: karmaşık düzlemde merkez ve görüş genişliği. yapi Kamera: merkez_x = -0.65 merkez_y = 0.0 genislik = 3.2 sinir = 120 # en fazla kaç yineleme # ── Renk ───────────────────────────────────────────────────────────── # Palet, renk duraklarından bir kez üretilir: derin uzay → gece mavisi → # KabaForce mavisi → camgöbeği → lavanta → beyaz. Aradaki 256 ton doğrusal # karışımdır; her piksel yalnız listeden bir ton seçer. yapi Durak: konum = 0.0 r = 0 g = 0 b = 0 fonksiyon karistir(a: sayi, b: sayi, t: ondalik) -> sayi: don a + sayi(ondalik(b - a) * t) fonksiyon palet_uret() -> liste: duraklar = [Durak(0.00, 10, 13, 21), Durak(0.18, 26, 42, 108), Durak(0.40, 55, 126, 244), Durak(0.62, 34, 211, 238), Durak(0.82, 167, 139, 250), Durak(1.00, 250, 245, 255)] palet = [] # boş liste sabiti metin listesidir i = 0 iken i < 256: t = ondalik(i) / 255.0 k = 0 iken t > duraklar[k + 1].konum: k = k + 1 a = duraklar[k] b = duraklar[k + 1] oran = (t - a.konum) / (b.konum - a.konum) palet.ekle(f"{karistir(a.r, b.r, oran)};{karistir(a.g, b.g, oran)};{karistir(a.b, b.b, oran)}") i = i + 1 don palet PALET = palet_uret() fonksiyon renk(t: ondalik) -> metin: eger t < 0.0: # kümenin içi: derin uzay laciverti don "6;8;14" don PALET[sayi(t * 255.0)] # ── Kaçış süresi ───────────────────────────────────────────────────── # z ← z² + c. |z| 2'yi aşarsa nokta kümeden kaçmıştır; ne kadar # çabuk kaçtığı rengini belirler. Hiç kaçmazsa -1 döner (kümenin içi). # Renk yineleme sayısının üçgen dalgasıdır (0 → 1 → 0, her 80 adımda): # böylece 20 yinelemede de 500 yinelemede de palet baştan sona kullanılır. fonksiyon kacis(zx: ondalik, zy: ondalik, cx: ondalik, cy: ondalik, sinir: sayi) -> ondalik: i = 0 iken i < sinir: x2 = zx * zx y2 = zy * zy eger x2 + y2 > 4.0: dalga = ondalik(i % 80) / 40.0 eger dalga > 1.0: dalga = 2.0 - dalga don matematik.karekok(dalga) zy = 2.0 * zx * zy + cy zx = x2 - y2 + cx i = i + 1 don -1.0 fonksiyon piksel(kume: Kume, kam: Kamera, px: sayi, py: sayi, sutun: sayi, satir: sayi) -> ondalik: # Terminal hücresi kare değil; iki piksel ≈ bir sütun genişliği. olcek = kam.genislik / ondalik(sutun) x = kam.merkez_x + (ondalik(px) - ondalik(sutun) / 2.0) * olcek y = kam.merkez_y + (ondalik(py) - ondalik(satir)) * olcek eger kume == Kume.JULIA: don kacis(x, y, -0.8, 0.156, kam.sinir) don kacis(0.0, 0.0, x, y, kam.sinir) # Bir şerit: [bas, son) arasındaki karakter satırlarını tek metin olarak üretir. fonksiyon serit(kume: Kume, kam: Kamera, bas: sayi, son: sayi, sutun: sayi, satir: sayi) -> metin: cikti = "" j = bas iken j < son: px = 0 iken px < sutun: ust = renk(piksel(kume, kam, px, 2 * j, sutun, satir)) alt = renk(piksel(kume, kam, px, 2 * j + 1, sutun, satir)) cikti = cikti + "\033[38;2;" + ust + "m\033[48;2;" + alt + "m▀" px = px + 1 cikti = cikti + "\033[0m\n" j = j + 1 don cikti # Dört şeridi dört görevde birlikte hesapla; sıra korunarak birleştir. fonksiyon kare_ciz(kume: Kume, kam: Kamera, sutun: sayi, satir: sayi) -> metin: d = satir // 4 resim = "" # birlikte: kendi kapsamıdır, sonucu dışarıda tut birlikte: a = baslat serit(kume, kam, 0, d, sutun, satir) b = baslat serit(kume, kam, d, 2 * d, sutun, satir) c = baslat serit(kume, kam, 2 * d, 3 * d, sutun, satir) e = baslat serit(kume, kam, 3 * d, satir, sutun, satir) resim = a.bekle() + b.bekle() + c.bekle() + e.bekle() don resim fonksiyon baslik(kume: Kume, kam: Kamera, sure: sayi) -> metin: ad = "MANDELBROT" eger kume == Kume.JULIA: ad = "JULIA c = -0.8 + 0.156i" yakinlik = 3.2 / kam.genislik don f"\033[1;38;2;125;170;255m ◆ {ad}\033[0m\033[38;2;110;120;150m · merkez {kam.merkez_x:.5f}{kam.merkez_y:+.5f}i · ×{yakinlik:.1f} · {kam.sinir} yineleme · {sure} ms\033[0m" # ── Komut satırı ───────────────────────────────────────────────────── ks = KomutSatiri("fraktal", "Terminalde 24 bit renkli fraktal çizer") ks.secenek("tur", "t", "mandelbrot ya da julia") ks.bayrak("yakinlas", "y", "Mandelbrot'un derinliklerine kare kare dal") ks.secenek("sutun", "s", "çizim genişliği (karakter, varsayılan 100)") ks.secenek("satir", "r", "çizim yüksekliği (karakter satırı, varsayılan 36)") c = ks.coz() eger c.yardim_mi(): c.yardim_yaz() cikis(0) eger c.hatali_mi(): c.hata_yaz_ve_cik() SUTUN = sayi(c.secenek("sutun").deger_veya("100")) SATIR = sayi(c.secenek("satir").deger_veya("36")) # 36 karakter satırı = 72 piksel satırı eger SUTUN < 8 veya SATIR < 4: konsol.hata_yaz("fraktal: --sutun en az 8, --satir en az 4 olmalı\n") cikis(2) kume = Kume.MANDELBROT kam = Kamera() eger c.secenek("tur").deger_veya("mandelbrot") == "julia": kume = Kume.JULIA kam.merkez_x = 0.0 kam.genislik = 3.0 eger c.bayrak("yakinlas"): # Denizatı vadisine dalış: her karede görüş %8 daralır. kam.merkez_x = -0.743643887 kam.merkez_y = 0.131825904 konsol.yaz("\033[?25l\033[2J") # imleci gizle, ekranı temizle kare = 0 iken kare < 120: t0 = zaman.milisaniye() resim = kare_ciz(kume, kam, SUTUN, SATIR) konsol.yaz("\033[H" + baslik(kume, kam, zaman.milisaniye() - t0) + "\033[K\n" + resim) kam.genislik = kam.genislik * 0.92 kam.sinir = kam.sinir + 5 uyu(40) # hesap ~3 ms sürüyor; göz için yavaşlat kare = kare + 1 konsol.yaz("\033[?25h") degilse: t0 = zaman.milisaniye() resim = kare_ciz(kume, kam, SUTUN, SATIR) yazdir(baslik(kume, kam, zaman.milisaniye() - t0)) konsol.yaz(resim)