Dijital Nostalji: Python ile Lav Lambası (Metaballs) Yapımı

🔮 Dijital Nostalji: Python ile Lav Lambası (Metaballs) Yapımı

90’ların ve 2000’lerin vazgeçilmez dekoru Lav Lambaları, içindeki sıvının hipnotik dansıyla bizi büyülerdi. Peki, bu fiziksel hareketi kodlarla taklit edebilir miyiz?

Cevap: Evet! Bugün “Metaballs” (Meta Toplar) algoritmasını kullanarak kendi dijital plazma lambamızı yapıyoruz.

Sırrı: Enerji Alanları

Ekranda gördüğünüz şekiller katı birer top değil, birer Enerji Alanıdır. İki mum yaklaştığında ışıklarının nasıl birleştiğini düşünün; Metaballs da aynen böyle çalışır.

  • İki top uzakken ayrı ayrı görünürler.
  • Yaklaştıkça enerji alanları toplanır ve aralarında bir “köprü” oluşur.
  • Yeterince yaklaştıklarında ise tek bir büyük damla haline gelirler.

💻 Kodun Kalbi

Bu “yapışkan sıvı” etkisini yaratan formül şudur:

# Yarıçapın karesi / Uzaklığın karesi
energy += (radius**2) / (distance**2 + 1)
    
import cv2
import numpy as np

# --- AYARLAR (1080p Dikey Video) ---
# Çıktı boyutu
out_w, out_h = 1080, 1920
# Hesaplama boyutu (Daha düşük = Daha hızlı ve yumuşak görüntü)
sim_w, sim_h = 270, 480 

fps = 60
duration_sec = 15
total_frames = fps * duration_sec
filename = "digital_lava_lamp.mp4"

# Video Yazıcı
try:
    fourcc = cv2.VideoWriter_fourcc(*'avc1')
except:
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(filename, fourcc, fps, (out_w, out_h))

# --- TOPLARIN AYARLARI ---
num_balls = 12
balls = []

# Rastgele başlat
for _ in range(num_balls):
    balls.append({
        'x': np.random.randint(0, sim_w),
        'y': np.random.randint(0, sim_h),
        'vx': np.random.uniform(-1.5, 1.5),  # Hız X
        'vy': np.random.uniform(-1.5, 1.5),  # Hız Y
        'r': np.random.randint(30, 60)       # Yarıçap (Etki alanı)
    })

# Koordinat Izgarası (Vektörel hızlandırma için)
x = np.arange(sim_w)
y = np.arange(sim_h)
xx, yy = np.meshgrid(x, y)

print(f"🔮 Lav Lambası Simülasyonu Başlıyor: {filename}")
print("Enerji alanları hesaplanıyor...")

for i in range(total_frames):
    if i % 50 == 0:
        print(f"İşleniyor: %{int(i/total_frames*100)}")

    # Enerji haritasını sıfırla
    energy_map = np.zeros((sim_h, sim_w), dtype=np.float32)

    # Her top için enerji alanını hesapla ve topla
    for ball in balls:
        # 1. HAREKET
        ball['x'] += ball['vx']
        ball['y'] += ball['vy']

        # Duvarlardan Sekme (Bounce)
        if ball['x'] <= 0 or ball['x'] >= sim_w:
            ball['vx'] *= -1
        if ball['y'] <= 0 or ball['y'] >= sim_h:
            ball['vy'] *= -1

        # 2. ENERJİ HESAPLAMA (Metaball Formülü)
        # Formül: Yarıçap / Mesafe
        # (Sıfıra bölmeyi önlemek için +1 ekliyoruz)
        dist_sq = (xx - ball['x'])**2 + (yy - ball['y'])**2
        energy_map += (ball['r']**2) / (dist_sq + 1)

    # 3. GÖRSELLEŞTİRME
    # Enerji haritasını renklendirilebilir formata (0-255) çevir
    # Eşikleme (Threshold) yaparak keskin kenarlar yerine,
    # doğrudan yoğunluğu kullanıp "Glow" (Parıltı) efekti veriyoruz.
    
    # Değerleri biraz kısalım ki çok patlamasın
    img_float = np.clip(energy_map * 200, 0, 255)
    img_uint8 = img_float.astype(np.uint8)

    # 1080p'ye Yükselt (Yumuşak geçiş için Cubic Interpolation)
    frame_hd = cv2.resize(img_uint8, (out_w, out_h), interpolation=cv2.INTER_CUBIC)

    # Renklendirme:
    # JET: Klasik Isı Haritası (Mavi -> Kırmızı)
    # TURBO: Daha modern ve canlı renkler
    colored_frame = cv2.applyColorMap(frame_hd, cv2.COLORMAP_TURBO)

    out.write(colored_frame)

out.release()
print("🔮 Plazma Efekti Hazır! Dosyayı kontrol et.")

🎥 Sonuç: Retro Plazma

Python’un hesaplama gücü ve renk haritaları (Colormap) birleşince ortaya bu hipnotik görüntü çıkıyor:

Kodlarla Hipnoz: Newton Spiral Zoom Animasyonu

🌀 Kodlarla Hipnoz: Newton Spiral Zoom Animasyonu

Matematiksel bir denklemin içine düşseydiniz ne görürdünüz? Bugün Python kullanarak bu sorunun cevabını veriyoruz. Hazırsanız kemerlerinizi bağlayın, sonsuz bir tünele giriyoruz!

Daha önceki yazılarımızda Newton Fraktalı‘nın o akışkan, mermer benzeri yapısını incelemiştik. Bugün ise aynı yapıya “Sinematik Hareket” katıyoruz.

Tünel Etkisi Nasıl Yapılır?

Bu videodaki “içe doğru düşüş” hissini yaratmak için fraktal formülünü değiştirmedik. Bunun yerine Kamerayı (Koordinat Düzlemini) manipüle ettik.

Mantık şu: Her karede resmi biraz küçültüyoruz (Zoom) ve biraz döndürüyoruz (Rotation). Bu işlemi saniyede 30 kez tekrarladığımızda beynimiz bunu bir “tünel yolculuğu” olarak algılıyor.

💻 Kodun Kalbi

Python’da bu etkiyi yaratan sihirli satır şudur:

# Z_base: Ekran Koordinatları
# zoom_factor: Her karede artan yakınlaştırma oranı
# rotation: Karmaşık sayılarda döndürme işlemi

Z = (Z_base / zoom_factor) * rotation
    
import cv2
import numpy as np

# --- AYARLAR (720p - Hızlı ve Akıcı) ---
width, height = 720, 1280
fps = 30
duration_sec = 15
total_frames = fps * duration_sec
filename = "newton_spiral_zoom.mp4"

try:
    fourcc = cv2.VideoWriter_fourcc(*'avc1')
except:
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')

out = cv2.VideoWriter(filename, fourcc, fps, (width, height))

# --- TEMEL KOORDİNATLAR ---
# Burası sabit kalacak, zoom ve dönüşü döngü içinde yapacağız
x = np.linspace(-1.5, 1.5, width)
aspect_ratio = height / width
y = np.linspace(-1.5 * aspect_ratio, 1.5 * aspect_ratio, height)
X, Y = np.meshgrid(x, y)
Z_base = X + 1j * Y

print(f"🌀 Spiral Zoom Başlıyor: {filename}")

# --- ANİMASYON DÖNGÜSÜ ---
for i in range(total_frames):
    if i % 30 == 0:
        print(f"İşleniyor: %{int(i/total_frames*100)}")

    # 1. ZOOM EFEKTİ:
    # 1.0'dan başlayıp her karede %1 yaklaşıyoruz (Exponential Zoom)
    # zoom_factor ne kadar büyürse, görüntü o kadar yakınlaşır.
    zoom_factor = 1.0 * (1.01 ** i) 
    
    # 2. DÖNME EFEKTİ (ROTATION):
    # Her karede açıyı biraz değiştiriyoruz.
    angle_rot = -0.5 * np.pi * i / total_frames # Yavaşça saat yönünde dön
    
    # Karmaşık sayılarda dönme işlemi: Z * e^(i*theta)
    rotation = np.exp(1j * angle_rot)
    
    # Z_base'i (Ekranı) manipüle ediyoruz:
    # Önce küçültüyoruz (Zoom), sonra döndürüyoruz (Rotation)
    Z = (Z_base / zoom_factor) * rotation

    # Newton Parametresi (Hafif dalgalanma devam etsin)
    angle_anim = 2 * np.pi * i / total_frames
    A = 1.0 + 0.05 * np.sin(angle_anim)

    # --- NEWTON ITERASYONU ---
    max_iter = 15
    for _ in range(max_iter):
        denominator = 3 * Z**2 + 1e-6 
        Z = Z - A * (Z**3 - 1) / denominator

    # --- GÖRSELLEŞTİRME (HSV) ---
    angle_z = np.angle(Z)
    hue = (angle_z + np.pi) / (2 * np.pi) * 179
    saturation = np.ones_like(hue) * 255
    value = np.ones_like(hue) * 200
    
    hsv_img = np.dstack((hue, saturation, value)).astype(np.uint8)
    colored_frame = cv2.cvtColor(hsv_img, cv2.COLOR_HSV2BGR)

    out.write(colored_frame)

out.release()
print("🌀 Spiral Video Hazır! 'newton_spiral_zoom.mp4' dosyasını kontrol et.")

🎥 Sonuç: Sonsuz Sarmal

Kod çalıştığında ortaya çıkan görüntü, izleyiciyi ekranın merkezine kilitleyen hipnotik bir sarmaldır. İşte Python ve Matematiğin baş döndürücü işbirliği:

💡 Bilişimci İpucu:

Bu tür “Zoom” videolarında en büyük zorluk, piksellerin bozulmamasıdır. Fraktallar “sonsuz detay” içerdiği için ne kadar yaklaşırsanız yaklaşın görüntü asla bozulmaz, her zaman yeni detaylar ortaya çıkar.

Python ile Ayçiçeği Spiralleri

🌻 Doğanın Gizli Yazılımı: Python ile Ayçiçeği Spiralleri Çizmek

Hiç bir ayçiçeğinin göbeğine veya bir kaktüsün dikenlerine dikkatlice baktınız mı? O mükemmel dizilişin tesadüf olduğunu düşünüyorsanız yanılıyorsunuz. Doğa, milyonlarca yıllık evrim sürecinde, tohumları veya yaprakları en verimli şekilde dizebilmek için eşsiz bir matematiksel formül keşfetmiştir.

Bugün, doğanın kullandığı bu “gizli kodu” (Phyllotaxis) Python kullanarak bilgisayarımızda simüle edeceğiz. Sonuç mu? Kelimenin tam anlamıyla hipnotize edici!

Sırrı Çözüyoruz: 137.5 Derece

Bu sarmalın arkasındaki sihirli sayı 137.5 derece, yani Altın Açı‘dır.

Bitkiler, yeni bir tohum veya yaprak çıkarırken bir öncekinden tam olarak bu açı kadar dönerler. Eğer 90 derece dönselerdi “artı” işareti gibi, 180 derece dönselerdi düz bir çizgi gibi dizilirlerdi. Ancak 137.5 derece (Altın Oran’dan gelir), boşlukların en mükemmel şekilde dolmasını sağlar.

Biz de kodumuzda tam olarak bunu yaptık:

  • Merkeze bir nokta koy.
  • 137.5 derece dön.
  • Merkezden biraz uzaklaş ve yeni noktayı koy.
  • Bunu binlerce kez tekrarla!

💻 Kodlama Kısmı (Python & OpenCV)

Bu görsel şöleni oluşturmak için karmaşık kütüphanelere ihtiyacımız yok. Sadece matematik (trigonometri) ve görüntü işleme kütüphanesi OpenCV yeterli.

İşte o hipnotik videoyu oluşturan temel algoritma:

import cv2
import numpy as np
import math

# --- AYARLAR (720p HD & 60 FPS) ---
# Geometrik şekillerde 60 FPS çok daha akıcı görünür
width, height = 720, 1280
fps = 60
duration_sec = 15
total_frames = fps * duration_sec
filename = "golden_ratio_spiral.mp4"

try:
    fourcc = cv2.VideoWriter_fourcc(*'avc1')
except:
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')

out = cv2.VideoWriter(filename, fourcc, fps, (width, height))

# Siyah Arka Plan (Tuval)
# Her karede ekranı temizlemeyeceğiz, üstüne çizeceğiz (iz bırakarak büyüyecek)
canvas = np.zeros((height, width, 3), dtype=np.uint8)

print(f"🌻 Altın Oran Videosu Hazırlanıyor: {filename}")
print("Bu kod çok hızlı çalışır, arkanıza yaslanın...")

# --- PHYLLOTAXIS PARAMETRELERİ ---
n = 0  # Nokta sayısı sayacı
c = 6  # Ölçek katsayısı (Noktaların ne kadar ayrık olacağı)
total_dots = 4000 # Toplam kaç nokta çizeceğiz?

# Her karede kaç nokta ekleyelim? (Videonun hızını belirler)
dots_per_frame = int(total_dots / total_frames) + 2

# --- ANİMASYON DÖNGÜSÜ ---
for i in range(total_frames):
    if i % 100 == 0:
        print(f"İşleniyor: %{int(i/total_frames*100)}")

    # Bu karede eklenecek noktaları çiz
    for _ in range(dots_per_frame):
        # 1. ALTIN AÇI FORMÜLÜ:
        # Her yeni nokta, bir öncekinden 137.5 derece döner.
        # Radyan cinsinden: 137.5 * (pi / 180) ≈ 2.39996
        angle = n * 137.508 * (np.pi / 180)
        
        # 2. YARIÇAP FORMÜLÜ:
        # Yarıçap, nokta sayısının kareköküyle orantılı büyür (Verimli paketleme)
        radius = c * np.sqrt(n)
        
        # 3. KUTUPSAL -> KARTEZYEN KOORDİNAT DÖNÜŞÜMÜ
        x = int(radius * np.cos(angle) + width / 2)
        y = int(radius * np.sin(angle) + height / 2)
        
        # Ekranda yer kalmadıysa çizme
        if 0 <= x < width and 0 <= y < height:
            # 4. RENKLENDİRME (HSV):
            # Nokta sayısına (n) göre renk değişsin -> Gökkuşağı spirali
            # n % 256 ile rengi 0-255 arasında döndürüyoruz
            hue = int(n / 5) % 180 
            color_hsv = np.uint8([[[hue, 255, 255]]])
            color_bgr = cv2.cvtColor(color_hsv, cv2.COLOR_HSV2BGR)[0][0]
            
            # BGR formatına çevirip çiziyoruz (int'e çevirmeyi unutma)
            cv2.circle(canvas, (x, y), 4, (int(color_bgr[0]), int(color_bgr[1]), int(color_bgr[2])), -1)
        
        n += 1

    # Animasyon Efekti:
    # Tuvali (canvas) videoya yazıyoruz.
    # Her karede tuval biraz daha dolmuş oluyor.
    out.write(canvas)

out.release()
print("🌻 Altın Oran hazır! 'golden_ratio_spiral.mp4' dosyasını kontrol et.")

Kodun Mantığı:

Kodun kalbinde iki temel formül yatıyor:

  • Açı (Angle): n * 137.5 (Her seferinde dönme miktarı)
  • Yarıçap (Radius): c * sqrt(n) (Merkezden uzaklaşma miktarı)

Neden karekök kullandık? Eğer karekök kullanmasaydık, noktalar dışarı doğru gittikçe birbirinden çok ayrılırdı. Karekök sayesinde spirallerin sıklığı merkezde de dışarıda da eşit görünür.

🎥 Sonuç: Matematiğin Dansı

Kodumuzu çalıştırdığımızda, noktaların merkezden patlayarak dışarı doğru rengarenk bir sarmal oluşturduğunu görüyoruz. Renkleri de (HSV renk uzayı kullanarak) noktaların sırasına göre gökkuşağı tonlarında ayarladık.

İşte Python ve Matematiğin ortak yapımı o video:

Kendin Dene!

Bu kodla oynamak çok zevkli. Eğer Python biliyorsanız şunları değiştirerek neler olacağını gözlemleyin:

  • Açıyı 137.5 yerine 137.3 yapın. (Sarmalların nasıl kaosa dönüştüğünü göreceksiniz!)
  • Renk paletini değiştirin.
🌿 Biliyor muydunuz?

Bu 137.5 derecelik açı sadece ayçiçeklerinde değil; çam kozalaklarında, ananasın üzerindeki desenlerde ve hatta bazı deniz kabuklarında bile bulunur. Doğa, “alan optimizasyonu” konusunda dünyanın en iyi yazılımcısıdır!

Kodlarla Ebru Sanatı: Newton Fraktalı ve Renklerin Dansı

Matematik her zaman katı kurallar ve siyah-beyaz denklemlerden ibaret değildir. Bazen, sayıların yolculuğunu izlediğimizde karşımıza Ebru sanatını andıran, rengarenk ve akışkan eserler çıkar.

Bugün kodlayacağımız Newton Fraktalı, diğerlerinin aksine “kaos” değil, “çözüm” arayan bir yapı. Bu yüzden izlemesi inanılmaz derecede rahatlatıcı ve hipnotik!

Kaçış Değil, Varış Hikayesi

Meşhur Mandelbrot kümesi, sonsuzluğa kaçan sayıları gösterir. Newton fraktalı ise bir denklemin (örneğin z³ - 1 = 0) kökünü bulmaya çalışan sayıları simüle eder.

Her nokta, hangi köke daha yakınsa o kökün rengini alır. Sınır bölgelerindeki noktalar ise “hangi köke gitsem?” diye kararsız kaldığı için o muazzam karmaşık desenleri oluşturur.

💻 Kodlama ve Renklerin Sırrı

Bu videoda gördüğünüz o pürüzsüz, gökkuşağı gibi geçişleri sağlamak için standart RGB yerine HSV (Hue-Saturation-Value) renk uzayını kullandık. Sayıların “açısına” göre renk atadık.

# Newton Iterasyonu (Kök Bulma Döngüsü)
# Formül: z = z - A * (f(z) / f'(z))

for _ in range(max_iter):
    denominator = 3 * Z**2 + 1e-6 
    Z = Z - A * (Z**3 - 1) / denominator
    
import cv2
import numpy as np

# --- HIZLANDIRILMIŞ AYARLAR (720p HD & 30 FPS) ---
# Çözünürlüğü düşürdük (Hız için en büyük etken)
width, height = 720, 1280
# Kare hızını 60'tan 30'a düşürdük (İş yükü yarıya indi)
fps = 30
duration_sec = 15
total_frames = fps * duration_sec
filename = "newton_marble_fast_720p.mp4"

# Codec Ayarı
try:
    fourcc = cv2.VideoWriter_fourcc(*'avc1')
except:
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')

out = cv2.VideoWriter(filename, fourcc, fps, (width, height))

# --- KOORDİNAT SİSTEMİ ---
x = np.linspace(-1.5, 1.5, width)
aspect_ratio = height / width
y = np.linspace(-1.5 * aspect_ratio, 1.5 * aspect_ratio, height)
X, Y = np.meshgrid(x, y)
Z_base = X + 1j * Y

print(f"🚀 Hızlı Render Başlıyor: {filename}")
print(f"Ayarlar: 720p HD @ 30 FPS (Toplam {total_frames} kare)")

# --- ANİMASYON DÖNGÜSÜ ---
for i in range(total_frames):
    if i % 50 == 0: # Daha sık bilgi versin
        print(f"İşleniyor: %{int(i/total_frames*100)}")

    angle = 2 * np.pi * i / total_frames
    A = 1.0 + 0.05 * np.sin(angle) + 1j * 0.05 * np.cos(angle)

    Z = Z_base.copy()
    # Hız için iterasyonu da biraz kıstık (20 -> 15)
    max_iter = 15

    # --- NEWTON İTERASYONU (İşlemciyi yoran kısım) ---
    for _ in range(max_iter):
        denominator = 3 * Z**2 + 1e-6 
        Z = Z - A * (Z**3 - 1) / denominator

    # --- GÖRSELLEŞTİRME (HSV) ---
    angle_z = np.angle(Z)
    hue = (angle_z + np.pi) / (2 * np.pi) * 179
    saturation = np.ones_like(hue) * 255
    value = np.ones_like(hue) * 200
    
    hsv_img = np.dstack((hue, saturation, value)).astype(np.uint8)
    colored_frame = cv2.cvtColor(hsv_img, cv2.COLOR_HSV2BGR)

    out.write(colored_frame)

out.release()
print("✅ Hızlı video tamamlandı! 'newton_marble_fast_720p.mp4' dosyasını kontrol et.")

🎥 Sonuç: Eriyen Mermer Efekti

Bu kodun çıktısı, sert köşeler yerine sanki suyun üzerine damlatılmış boyalar gibi akışkan bir görüntü sunar. İşte Python ve Matematiğin en renkli işbirliği:

💡 Bilişimci Notu:

Bu videodaki “erime” efekti, Newton formülündeki sabit bir sayıyı (A parametresi) her karede çok az değiştirerek elde edilmiştir. Bu sayede statik bir resim yerine “nefes alan” bir animasyon ortaya çıkmıştır.

🔥 Kodların Karanlık Yüzü: Python ile “Yanan Gemi” Fraktalı

1. Nedir Bu “Yanan Gemi”?

Burning Ship, aslında meşhur Mandelbrot Kümesi’nin “asi kardeşi”dir. 1992 yılında Michael Michelitsch ve Otto E. Rössler tarafından tanımlanmıştır. Mandelbrot kümesi yumuşak ve simetrik hatlara sahipken, Burning Ship keskin, köşeli ve sanki “yanmış” veya “hasar görmüş” gotik bir mimariyi andırır. İsmini, şeklin sol tarafındaki ana yapının, yelkenleri yanan bir kalyona benzemesinden alır.

2. Matematiksel Sırrı (Mutlak Değer Farkı)

Mandelbrot ile formülü neredeyse aynıdır, tek bir farkla: Mutlak Değer.

  • Standart Mandelbrot: Z = Z² + c
  • Burning Ship: Z = (|Re(Z)| + i|Im(Z)|)² + c

Yani karmaşık sayının karesini almadan önce, hem Gerçel (Real) hem de Sanal (Imaginary) kısımlarının mutlak değerini alıyoruz. Bu işlem, koordinat düzlemindeki negatif bölgeleri pozitife katlar. Bu “katlama” işlemi, fraktalın o meşhur keskin kırıklarını ve “yanık” izlerini oluşturur.

3. Kodlamadaki Kritik Nokta (Python & OpenCV)

Bu görüntüyü oluştururken Python’da şu matematiksel hileyi kullandık:

# Burning Ship'in kalbi burasıdır:
# np.abs() fonksiyonu ile negatifleri pozitife çeviriyoruz
real_part = np.abs(Z[mask].real)
imag_part = np.abs(Z[mask].imag)

Z[mask] = (real_part + 1j * imag_part)**2 + c
import cv2
import numpy as np

# --- YÜKSEK KALİTE AYARLARI (1080p & 60 FPS) ---
width, height = 1080, 1920
fps = 60
duration_sec = 15
total_frames = fps * duration_sec
filename = "burning_ship_hd.mp4"

# Codec Ayarı
try:
    fourcc = cv2.VideoWriter_fourcc(*'avc1')
except:
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')

out = cv2.VideoWriter(filename, fourcc, fps, (width, height))

# --- KOORDİNAT SİSTEMİ ---
# Burning Ship için biraz daha geniş bir alana (zoom-out) ihtiyacımız olabilir
x = np.linspace(-1.8, 1.8, width)
aspect_ratio = height / width
y = np.linspace(-1.8 * aspect_ratio, 1.8 * aspect_ratio, height)
X, Y = np.meshgrid(x, y)
Z_base = X + 1j * Y

print(f"🔥 Burning Ship Videosu Hazırlanıyor: {filename}")
print(f"Çözünürlük: {width}x{height} | FPS: {fps}")
print("Bu işlem yüksek kalite nedeniyle 2-4 dakika sürebilir, lütfen bekleyin...")

# --- ANİMASYON DÖNGÜSÜ ---
for i in range(total_frames):
    if i % 50 == 0:
        print(f"İşleniyor: %{int(i/total_frames*100)}")

    # Parametre Değişimi
    # Burning Ship'te 'c' parametresi çok hassastır, daha küçük bir çemberde döndürüyoruz
    angle = 2 * np.pi * i / total_frames
    
    # Koordinatları biraz kaydırarak geminin "yüzüyormuş" gibi görünmesini sağlıyoruz
    c = -1.75 + 0.03 * np.exp(1j * angle) 

    Z = Z_base.copy()
    img_data = np.zeros(Z.shape, dtype=float)
    max_iter = 40  # Burning ship çok karmaşık olduğu için iterasyonu az tutabiliriz

    # --- BURNING SHIP FORMÜLÜ ---
    # Normal Julia: Z = Z^2 + c
    # Burning Ship: Z = (|Re(Z)| + i|Im(Z|)^2 + c
    # Mutlak değer (abs) kullanımı o "keskin/yanık" kenarları oluşturur.
    
    for _ in range(max_iter):
        mask = np.abs(Z) <= 4 # Taşanları 4'te yakalıyoruz
        
        # Matematiksel Sihir Burada:
        # Gerçel ve Sanal kısımların mutlak değerini alıyoruz
        real_part = np.abs(Z[mask].real)
        imag_part = np.abs(Z[mask].imag)
        
        Z[mask] = (real_part + 1j * imag_part)**2 + c
        img_data[mask] += 1

    # --- GÖRSELLEŞTİRME ---
    # Logaritmik yumuşatma
    img_norm = np.log(img_data + 1) / np.log(max_iter) * 255
    img_uint8 = img_norm.astype(np.uint8)
    
    # Renk Paleti: INFERNO (Siyah -> Kırmızı -> Sarı -> Beyaz)
    # Tam "yanma" efekti verir.
    colored_frame = cv2.applyColorMap(img_uint8, cv2.COLORMAP_INFERNO)

    out.write(colored_frame)

out.release()
print("🔥 Video bitti! 'burning_ship_hd.mp4' dosyasını kontrol et.")

4. Renk Paleti Tercihi

Bu videoda atmosferi desteklemek için OpenCV’nin INFERNO (Cehennem) renk haritası (cv2.COLORMAP_INFERNO) kullanıldı. Bu palet, siyah zemin üzerine koyu mor, kırmızı ve sarı tonlarını kullanarak tam bir “yangın” efekti yaratır.

5. Anahtar Kelimeler

Burning Ship Fractal Chaos Theory Python Art OpenCV Inferno Complex Numbers

🎥 Sonuç: Kaosun Estetiği

Kodumuzu çalıştırdığımızda ortaya çıkan görüntü, standart fraktalların aksine yumuşak değil; köşeli, agresif ve son derece etkileyicidir. İşte Python ile oluşturduğumuz o ateşli simülasyon:

https://youtube.com/shorts/ZwGzojNic4k

Piksellerin Kaçış Oyunu: Python ve OpenCV ile Hipnotik Fraktal Videoları Nasıl Yapılır?

Bugün sizlerle, Python kullanarak oluşturduğum ve YouTube kanalımda yayınladığım o hipnotik “Julia Kümesi” videosunun mutfağına gireceğiz. Ama korkmayın! Karmaşık matematik formülleri veya sıkıcı denklemler yok. Bunun yerine piksellerin oynadığı basit bir “kaçış oyunu”ndan bahsedeceğiz.

Hazırsanız, Python ve OpenCV kütüphanelerini kullanarak kendi dijital sanatımızı üretelim.

Olayın Mantığı: Piksellerin “Kaçış Oyunu”

Ekranda gördüğünüz o karmaşık ve büyüleyici desenler, aslında bilgisayarın her bir piksel (nokta) için oynadığı basit bir oyundan ibaret.

Bu fraktalın (Julia Kümesi) mantığını şöyle hayal edin:

  • Oyun Sahası: Ekranınızdaki her piksel bir oyuncu.
  • Kural: Her oyuncuya (piksele) bir sayısal görev veriyoruz. Sonra çıkan sonucu alıp tekrar aynı işleme sokuyoruz. Buna “Geri Besleme” (Feedback Loop) deniyor. Tıpkı mikrofonu hoparlöre yaklaştırdığınızda oluşan o sonsuz döngü sesi gibi.
  • Sonuç: Bazı pikseller bu işlem sırasında sabit kalıyor, yerinden kımıldamıyor (bunları siyah/koyu renk yapıyoruz). Bazıları ise hızla büyüyüp merkezden kaçıyor (bunları parlak renklerle boyuyoruz).

Peki neden hareket ediyor?
Videoda gördüğünüz o “nefes alma” etkisi ise oyunun kuralını (sihirli bir sayıyı) her karede çok az değiştirmemizden kaynaklanıyor. Kural milim değişince, piksellerin kaderi de değişiyor ve ortaya o akışkan görüntü çıkıyor.

Neden OpenCV Kullanıyoruz?

Genelde Python ile grafik çizerken Matplotlib kullanılır. Ancak biz video yapmak istiyoruz. Matplotlib video oluştururken biraz yavaş kalabilir. Bu projede OpenCV kütüphanesini seçtim çünkü:

  • Görüntüleri çok daha hızlı işler.
  • Doğrudan .mp4 video dosyası oluşturabilir.
  • Görüntü işleme dünyasının “İsviçre Çakısı”dır.

Python Kodu

Bu projeyi kendi bilgisayarınızda çalıştırmak için terminale şu komutu yazarak gerekli kütüphaneleri kurun:
pip install opencv-python numpy

İşte o “Sonsuz Döngü” videosunu oluşturan kodlar:

import cv2
import numpy as np

# --- YÜKSEK KALİTE AYARLARI ---
# YouTube'un sevdiği çözünürlük (1080p Full HD)
width, height = 1080, 1920  
# Akıcılık için 60 FPS
fps = 60
duration_sec = 15
total_frames = fps * duration_sec
filename = "julia_hd_60fps.mp4"

# Codec Ayarı:
# Windows'ta bazen 'avc1' çalışmayabilir, hata alırsan burayı tekrar 'mp4v' yap.
try:
    fourcc = cv2.VideoWriter_fourcc(*'avc1')
except:
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')

out = cv2.VideoWriter(filename, fourcc, fps, (width, height))

# --- KOORDİNAT SİSTEMİ ---
x = np.linspace(-1.5, 1.5, width)
aspect_ratio = height / width
y = np.linspace(-1.5 * aspect_ratio, 1.5 * aspect_ratio, height)
X, Y = np.meshgrid(x, y)
Z_base = X + 1j * Y

print(f"Video oluşturuluyor: {filename}")
print(f"Çözünürlük: {width}x{height} | FPS: {fps}")
print("Bu işlem yüksek kalite nedeniyle biraz uzun sürebilir...")

# --- ANİMASYON DÖNGÜSÜ ---
for i in range(total_frames):
    if i % 50 == 0:
        print(f"İşleniyor: %{int(i/total_frames*100)}")

    angle = 2 * np.pi * i / total_frames
    c = 0.7885 * np.exp(1j * angle)

    Z = Z_base.copy()
    img_data = np.zeros(Z.shape, dtype=float)
    max_iter = 50

    for _ in range(max_iter):
        mask = np.abs(Z) <= 10
        Z[mask] = Z[mask]**2 + c
        img_data[mask] += 1

    # Renklendirme
    img_norm = np.log(img_data + 1) / np.log(max_iter) * 255
    img_uint8 = img_norm.astype(np.uint8)
    
    # MAGMA renk haritası
    colored_frame = cv2.applyColorMap(img_uint8, cv2.COLORMAP_MAGMA)

    out.write(colored_frame)

out.release()
print("Yüksek kaliteli video hazır!")

Kodun Kısa Özeti

  1. numpy: Tüm ekranı tek tek piksellerle uğraşmak yerine dev bir ızgara (grid) gibi yönetmemizi sağlar. İşlemi hızlandıran kahramanımız budur.
  2. for döngüsü: Videonun her bir karesini tek tek çizer.
  3. cv2.applyColorMap: Sayısal verileri (hangi piksel kaç puan aldı) insan gözüne hoş gelen renklere dönüştürür.

Python Turtle ile Renkli Spirograph Deseni (Kod Yolculuğu)

Kod yazarken ortaya görsel olarak hoş desenler çıkarmak, üretme hissini çok net yaşatan şeylerden biri.
Bu çalışmada Python’un turtle kütüphanesini ve renk geçişleri için colorsys modülünü kullanarak dönen, renkli bir spirograph (çiçek benzeri) desen oluşturdum.

Aynı desenin çizim sürecini YouTube kanalım Kod Yolculuğu’nda kısa bir video olarak da paylaştım.
Burada ise kullanılan kodu arşivlemek istiyorum.

import turtle
import colorsys

t = turtle.Turtle()
t.speed(0)
turtle.bgcolor(“black”)

n = 60
h = 0

for i in range(360):
color = colorsys.hsv_to_rgb(h, 1, 1)
t.color(color)
t.circle(120)
t.left(5)
h += 1/n

turtle.done()

Bu kodda:

  • colorsys.hsv_to_rgb ile renkler HSV uzayında yumuşak geçişle üretilir.
  • Her adımda biraz döndürülerek aynı daire tekrar tekrar çizilir.
  • Renk tonu her turda değiştiği için ortaya çiçek benzeri, dönen bir desen çıkar.
  • speed(0) ayarı çizimi mümkün olan en hızlı şekilde yapar, bu da video için akıcı bir animasyon sağlar.

Bu tarz “koddan çıkan desenleri” ve küçük görsel denemeleri Kod Yolculuğu serisi altında paylaşmaya devam edeceğim.

PHP kod yapısı ve yorum satırları

PHP kodları sunucu (server) tarafında çalıştırılır ve HTML üretilip çağıran tarayıcıya gönderilir. PHP dosyaları metin dosyalarıdır. Varsayılan dosya uzantısı “.php” dir.

Yazdığımız kodların PHP kodları olduğunu belirtmek için aşağıdaki yapıyı kullanırız:

<?php
   // Kodlar buraya 
?>

“Kodlar buraya” kısmına yazdıklarımız PHP kodları olarak değerlendirilir. PHP’nin kurallarına uyarak yazılan kodların HTML çıktıları tarayıcıya gönderilir. Bir örnek üzerinde ne demek istediğimi anlatayım. Aşağıdaki php kodlarını yazıp çalıştırın. (Nasıl yapılacağı ile ilgili PHP dosyalarımızı nasıl çalıştırırız? makalemize bakabilirsiniz)

<!DOCTYPE html>
<html>
<body>

<h1>PHP Öğreniyorum</h1>

<?php
//echo komutu birşeyleri yazdırmak için kullanılır.
echo 5*3;
?>

</body>
</html>

Tarayıcıda görüntüsü şu şekilde olacaktır:

echo satırının sonucu

PHP kodlarınız çalıştırılıyor ve üretilen HTML tarayıcıda görüntüleniyor. 3*5 ifadesi 3 ile 5’in çarpımı demektir. Sonuç olarak 15 sayısı echo ile yazdırılmıştır.

PHP satırları noktalı virgül (;) ile biter.

Yorum Satırı // , # , /* */

Yukarıdaki kodda görülen

//echo komutu birşeyleri yazdırmak için kullanılır.
# Bu şekilde de yazılabilir.

satırı PHP tarafından dikkate alınmaz, yani çalıştırılıp sonuç üretilmez, yorum satırıdır. Tek satır yorum yazmak için // veya # kullanılır.

Birden fazla satır yorum yazmak için ise aşağıdaki ifade kullanılır.

/*
Birden fazla satır kullanılarak 
yazılmış olan 
yorum satırları
*/

Büyük / Küçük Harf Duyarlılığı

PHP için ayrılmış olan kelimeler (if, else, for, echo vb.) kullanılırken büyük / küçük harf ayrımı yapmadan yazabilirsiniz. Yani ECHO, echo, Echo aynı şeyi ifade eder.

Fakat değişken isimleri büyük / küçük harf duyarlıdır. Yani $numara, $Numara, $NUMARA veya $NuMaRa farklı birer değişkendir.

Görüşmek üzere…

PHP dosyalarımızı nasıl çalıştırırız?

Bu makale, kendi bilgisayarınızda PHP dosyalarınızı nasıl çalıştırılacağınızı anlatır.

HTML sayfalarımızı yazdıktan sonra denemek için tarayıcı (Chrome, Microsoft Edge, Firefox vb.) ile açıp inceleyebiliyoruz. PHP dosyaları bu şekilde incelenemiyor, çünkü yazılan PHP kodlarının değerlendirilip sonuç üretilmesi için web server üzerinde çalıştırılması gerekiyor.

Ben bu iş için XAMPP tercih ediyorum. Kendi ifadeleri ile “XAMPP en popüler PHP geliştirme ortamı”. Bu paket Apache web server programı, MariaDB (MySQL), PHP ve Perl içeriyor. Tek program kuruyoruz ve her birinin ayarları ile tek tek uğraşmaya gerek kalmıyor. Bu adresi ziyaret edip işletim sisteminize uygun olan sürümü indirebilirsiniz.

Bu videoda kurulum ve kullanım adımları anlatılıyor

PHP yazmak için herhangi bir metin editörü yeterli. Biraz daha özellik isterseniz (kod renklendirme, tamamlama vb.) Atom ya da Sublime Text deneyebilirsiniz.

XAMPP çalışırken Ekran Görüntüsü

İlk PHP scriptimizi yazalım

Tercih ettiğiniz editörü kullanarak aşağıdaki kodları yazın:

<?php

echo "Merhaba Dünya!"

?>

Bunu bir hello.php ismi ile kayıt edeceğiz. Fakat herhangi bir yere değil!

Kayıt edeceğimiz yer XAMPP programının sunucu ana klasörü olan “C:\xampp\htdocs” klasörü (Windows kullanıcıları için geçerli). Dosyanızı buraya kayıt edin.

Favori tarayıcınız açın. Adres çubuğuna http://localhost/hello.php yazın.

hello.php ekran görüntüsü

Tarayıcınıza yazdığınız localhost kendi bilgisayarınızı temsil ediyor. (127.0.0.1 de yazabilirsiniz.) hello.php dosyasını ana klasörde olduğu için doğrudan yazabiliyoruz. Dosyayı eğer htdocs klasörünün içinde başka bir klasöre (varsayalım deneme olsun) koyarsanız o zaman adres çubuğuna localhost/deneme/hello.php yazmanız gerekir.

Tebrikler, ilk PHP scriptinizi yazdınız ve çalıştırdınız.

Görüşmek üzere…