Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

🎨 graphics - 2D Grafik ve Çizim

Vektör grafikleri, şekiller, renkler ve 2D render işlemleri

📦 163 Fonksiyon 📝 1624 Satır 💾 56.5 KB

📋 Genel Bakış

graphics modülü, 2D grafik çizimi, şekiller, renkler, dönüşümler ve render işlemleri için kapsamlı araçlar sağlar. Canvas üzerine çizim, animasyon ve görselleştirme yapın.

🖌️ Temel Çizim

  • graphics.Canvas() - Çizim yüzeyi oluşturma
  • graphics.çizgi() - Çizgi çizme
  • graphics.dikdörtgen() - Dikdörtgen çizme
  • graphics.daire() - Daire çizme
  • graphics.elips() - Elips çizme
  • graphics.çokgen() - Çokgen çizme

🎨 Renk ve Stil

  • graphics.renk_ayarla() - Çizim rengi ayarlama
  • graphics.dolgu_ayarla() - Dolgu rengi
  • graphics.çizgi_kalınlığı() - Çizgi kalınlığı
  • graphics.gradyan() - Gradyan dolgu
  • graphics.desen() - Desen dolgu

✏️ Metin ve Font

  • graphics.metin_yaz() - Metin çizme
  • graphics.font_ayarla() - Font ayarlama
  • graphics.metin_boyutu() - Metin ölçüsü hesaplama
  • graphics.metin_hizala() - Metin hizalama

🔄 Dönüşümler

  • graphics.çevir() - Koordinat çevirme
  • graphics.döndür() - Döndürme
  • graphics.ölçekle() - Ölçekleme
  • graphics.kaydır() - Kaydırma (skew)

🖼️ Görüntü ve Bitmap

  • graphics.görüntü_yükle() - Görüntü yükleme
  • graphics.görüntü_çiz() - Görüntü çizme
  • graphics.ekran_görüntüsü() - Canvas'ı kaydetme

💡 Kullanım Örnekleri

Temel Şekiller ve Renkler

kullan graphics
kullan color

// Canvas oluştur
değer canvas = graphics.Canvas(800, 600)
canvas.arkaplan_ayarla(color.BEYAZ)

// Renkli dikdörtgenler
canvas.dolgu_ayarla(color.rgb(255, 0, 0))  // Kırmızı
canvas.dikdörtgen(50, 50, 200, 150, dolgu: doğru)

canvas.dolgu_ayarla(color.rgb(0, 255, 0))  // Yeşil
canvas.dikdörtgen(300, 50, 200, 150, dolgu: doğru)

canvas.dolgu_ayarla(color.rgb(0, 0, 255))  // Mavi
canvas.dikdörtgen(550, 50, 200, 150, dolgu: doğru)

// Çerçeveli daireler
canvas.renk_ayarla(color.SİYAH)
canvas.çizgi_kalınlığı(3)
canvas.daire(150, 350, 80, dolgu: yanlış)

canvas.renk_ayarla(color.rgb(255, 165, 0))  // Turuncu
canvas.daire(400, 350, 80, dolgu: doğru)

// Yıldız şekli (çokgen)
değer yıldız_noktaları = [
    (650, 300), (670, 350), (720, 360),
    (680, 390), (690, 440), (650, 410),
    (610, 440), (620, 390), (580, 360),
    (630, 350)
]
canvas.dolgu_ayarla(color.rgb(255, 215, 0))  // Altın
canvas.çokgen(yıldız_noktaları, dolgu: doğru)

// Gradyan çizgi
değer gradyan = graphics.doğrusal_gradyan(
    100, 500, 700, 500,
    [(0.0, color.KIRMIZI), (0.5, color.SARI), (1.0, color.MAVİ)]
)
canvas.gradyan_ayarla(gradyan)
canvas.çizgi_kalınlığı(10)
canvas.çizgi(100, 500, 700, 500)

// Canvas'ı kaydet
canvas.png_olarak_kaydet("şekiller.png")
yazdır("✓ Grafik oluşturuldu: şekiller.png")

Grafik Çizimi (Chart)

kullan graphics
kullan color

sınıf ÇubukGrafik {
    değer canvas: graphics.Canvas
    değer genişlik: Tam
    değer yükseklik: Tam
    
    fonksiyon yeni(genişlik: Tam, yükseklik: Tam) -> ÇubukGrafik {
        değer canvas = graphics.Canvas(genişlik, yükseklik)
        canvas.arkaplan_ayarla(color.BEYAZ)
        
        dön ÇubukGrafik {
            canvas: canvas,
            genişlik: genişlik,
            yükseklik: yükseklik
        }
    }
    
    fonksiyon çiz(veri: Liste<(Dize, Gerçek)>, başlık: Dize) {
        değer kenar_boşluk = 50
        değer grafik_genişlik = bu.genişlik - 2 * kenar_boşluk
        değer grafik_yükseklik = bu.yükseklik - 2 * kenar_boşluk
        
        // Başlık
        bu.canvas.font_ayarla("Arial", 24, kalın: doğru)
        bu.canvas.renk_ayarla(color.SİYAH)
        bu.canvas.metin_yaz(başlık, bu.genişlik / 2, 30, hizalama: "merkez")
        
        // Maksimum değeri bul
        değer max_değer = 0.0
        için (_, değer) içinde veri {
            eğer değer > max_değer {
                max_değer = değer
            }
        }
        
        // Eksenler
        bu.canvas.çizgi_kalınlığı(2)
        bu.canvas.renk_ayarla(color.SİYAH)
        
        // Y ekseni
        bu.canvas.çizgi(kenar_boşluk, kenar_boşluk, kenar_boşluk, bu.yükseklik - kenar_boşluk)
        
        // X ekseni
        bu.canvas.çizgi(kenar_boşluk, bu.yükseklik - kenar_boşluk, 
                       bu.genişlik - kenar_boşluk, bu.yükseklik - kenar_boşluk)
        
        // Çubukları çiz
        değer çubuk_genişlik = grafik_genişlik / (veri.uzunluk * 2)
        değer boşluk = çubuk_genişlik / 2
        değer renkler = [
            color.rgb(255, 99, 132),   // Kırmızı-pembe
            color.rgb(54, 162, 235),   // Mavi
            color.rgb(255, 206, 86),   // Sarı
            color.rgb(75, 192, 192),   // Turkuaz
            color.rgb(153, 102, 255),  // Mor
            color.rgb(255, 159, 64)    // Turuncu
        ]
        
        için (i, (etiket, değer)) içinde veri.numaralandır() {
            değer x = kenar_boşluk + boşluk + i * (çubuk_genişlik + boşluk)
            değer çubuk_yükseklik = (değer / max_değer) * grafik_yükseklik
            değer y = bu.yükseklik - kenar_boşluk - çubuk_yükseklik
            
            // Çubuğu çiz
            bu.canvas.dolgu_ayarla(renkler[i % renkler.uzunluk])
            bu.canvas.dikdörtgen(x, y, çubuk_genişlik, çubuk_yükseklik, dolgu: doğru)
            
            // Etiket
            bu.canvas.font_ayarla("Arial", 12)
            bu.canvas.renk_ayarla(color.SİYAH)
            bu.canvas.metin_yaz(etiket, x + çubuk_genişlik / 2, 
                              bu.yükseklik - kenar_boşluk + 20, hizalama: "merkez")
            
            // Değer
            bu.canvas.metin_yaz(değer.dizgeye(), x + çubuk_genişlik / 2, y - 10, 
                              hizalama: "merkez")
        }
    }
    
    fonksiyon kaydet(dosya_adı: Dize) {
        bu.canvas.png_olarak_kaydet(dosya_adı)
    }
}

// Kullanım
değer satış_verileri = [
    ("Ocak", 12500.0),
    ("Şubat", 15800.0),
    ("Mart", 18200.0),
    ("Nisan", 14500.0),
    ("Mayıs", 21000.0),
    ("Haziran", 19500.0)
]

değer grafik = ÇubukGrafik.yeni(800, 500)
grafik.çiz(satış_verileri, "Aylık Satış Grafiği")
grafik.kaydet("satış_grafiği.png")

yazdır("✓ Grafik oluşturuldu!")

Animasyon ve Partikül Sistemi

kullan graphics
kullan color
kullan random
kullan math

sınıf Partikül {
    değer x: Gerçek
    değer y: Gerçek
    değer hız_x: Gerçek
    değer hız_y: Gerçek
    değer yarıçap: Gerçek
    değer renk: color.Renk
    değer ömür: Gerçek
    
    fonksiyon güncelle(delta_zaman: Gerçek) {
        bu.x += bu.hız_x * delta_zaman
        bu.y += bu.hız_y * delta_zaman
        bu.hız_y += 0.5  // Yerçekimi
        bu.ömür -= delta_zaman
    }
    
    fonksiyon çiz(canvas: graphics.Canvas) {
        değer alfa = (bu.ömür / 2.0).kısıtla(0.0, 1.0)
        değer renk_alfa = color.rgba(
            bu.renk.kırmızı(),
            bu.renk.yeşil(),
            bu.renk.mavi(),
            (alfa * 255).tam()
        )
        canvas.dolgu_ayarla(renk_alfa)
        canvas.daire(bu.x, bu.y, bu.yarıçap, dolgu: doğru)
    }
    
    fonksiyon canlı_mı() -> Mantıksal {
        dön bu.ömür > 0
    }
}

sınıf PartikülSistemi {
    değer canvas: graphics.Canvas
    değer partiküller: Liste<Partikül>
    
    fonksiyon yeni(genişlik: Tam, yükseklik: Tam) -> PartikülSistemi {
        dön PartikülSistemi {
            canvas: graphics.Canvas(genişlik, yükseklik),
            partiküller: []
        }
    }
    
    fonksiyon partikül_oluştur(x: Gerçek, y: Gerçek, sayı: Tam) {
        için _ içinde 0..sayı {
            değer açı = random.gerçek(0.0, 2.0 * math.PI)
            değer hız = random.gerçek(50.0, 150.0)
            
            değer partikül = Partikül {
                x: x,
                y: y,
                hız_x: math.cos(açı) * hız,
                hız_y: math.sin(açı) * hız,
                yarıçap: random.gerçek(2.0, 6.0),
                renk: color.rgb(
                    random.tam(100, 255),
                    random.tam(50, 150),
                    random.tam(0, 100)
                ),
                ömür: random.gerçek(1.0, 3.0)
            }
            
            bu.partiküller.ekle(partikül)
        }
    }
    
    fonksiyon güncelle(delta_zaman: Gerçek) {
        // Partikülleri güncelle
        için partikül içinde bu.partiküller {
            partikül.güncelle(delta_zaman)
        }
        
        // Ölü partikülleri temizle
        bu.partiküller = bu.partiküller.filtrele(|p| p.canlı_mı())
    }
    
    fonksiyon çiz() {
        // Arkaplanı temizle (solma efekti için)
        bu.canvas.dolgu_ayarla(color.rgba(0, 0, 0, 10))
        bu.canvas.dikdörtgen(0, 0, bu.canvas.genişlik, bu.canvas.yükseklik, dolgu: doğru)
        
        // Partikülleri çiz
        için partikül içinde bu.partiküller {
            partikül.çiz(bu.canvas)
        }
    }
    
    fonksiyon kare_kaydet(kare_no: Tam) {
        bu.canvas.png_olarak_kaydet(f"partikül_{kare_no:04}.png")
    }
}

// Animasyon oluştur (60 FPS, 5 saniye)
değer sistem = PartikülSistemi.yeni(800, 600)
değer fps = 60.0
değer toplam_kare = 300  // 5 saniye

yazdır("Animasyon oluşturuluyor...")

için kare içinde 0..toplam_kare {
    // Her 10 karede bir partikül patlaması
    eğer kare % 10 == 0 {
        sistem.partikül_oluştur(400.0, 300.0, 30)
    }
    
    sistem.güncelle(1.0 / fps)
    sistem.çiz()
    sistem.kare_kaydet(kare)
    
    eğer kare % 60 == 0 {
        yazdır(f"  {kare / 60 + 1}. saniye tamamlandı")
    }
}

yazdır("✓ Animasyon kareleri oluşturuldu!")
yazdır("ffmpeg ile video oluşturmak için:")
yazdır("  ffmpeg -framerate 60 -i partikül_%04d.png -c:v libx264 output.mp4")

🎯 İyi Uygulamalar

  • Büyük çizimler için canvas'ı katmanlara ayırın
  • Animasyonlarda double buffering kullanın
  • Renk geçişleri için gradyanları tercih edin
  • Performans için vektör yerine bitmap kullanmayı düşünün
  • Anti-aliasing ile daha pürüzsüz çizimler elde edin
  • Dönüşüm matrislerini save/restore ile yönetin

🔗 İlgili Modüller

  • gui - Grafik arayüz
  • image - Görüntü işleme
  • color - Renk işlemleri
  • math - Matematiksel hesaplamalar