🎨 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