Konsol: fraktal (paralel şeritli 24-bit Mandelbrot/Julia + yakınlaşma), sudoku (geri izlemeli, canlı animasyon), fatura (JSON → terminal tablosu, PDF ve Excel). Masaüstü: hesap makinesi (işlem önceliği, canlı bağlama), odak (Pomodoro), parola atölyesi (entropi ölçer, SHA-256). Web: pano (Kanban REST API + SQLite), kisalt (302 yönlendirme, SVG istatistik), anket (adres başına tek oy, sunucuda çizilen grafik). Hepsi `kabalang calistir` ile derlenip çalışır; web uygulamaları yalnız 127.0.0.1'i dinler, SQL parametre bağlamalı, HTML çıktısı kaçırılır.
172 lines
7.5 KiB
Plaintext
172 lines
7.5 KiB
Plaintext
# ╔══════════════════════════════════════════════════════════════════╗
|
|
# ║ 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<metin>:
|
|
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)
|