- Bağlantıyı al
- X
- E-posta
- Diğer Uygulamalar
- Bağlantıyı al
- X
- E-posta
- Diğer Uygulamalar
Bu projeyi tamamladığınızda, Python'ın bilimsel çizim ve veri görselleştirme kütüphanesi olan matplotlib'i ve matematiksel işlemleri yöneten numpy'ı, gerçek dünya standartlarını uygulamak için nasıl kullanacağınızı öğrenmiş olacaksınız.
Kodumuz, bayrağın tüm unsurlarını (Hilal, Ay ve Yıldız) oranlayarak çizecek. Hazırsanız, milli sembolümüzü bilimsel bir titizlikle kodlamaya başlayalım!
Bu projeyi çalıştırabilmek için matplotlib ve numpy kütüphanelerinin kurulu olması gerekir:
pip install matplotlib numpy
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import numpy as np
# Tüm oranlar G (genişlik) birimi üzerinden hesaplanır.
G = 1.0 # Bayrağın genişliği (Yüksekliği)
A = 0.5 * G # Ay dış merkezinin kaçak kenar uzaklığı
B = 0.5 * G # Ay dış dairesinin çapı
C = 0.0625 * G # Ay iç ve dış merkezler arası
D = 0.4 * G # Ay iç dairesinin çapı
E = (1/3) * G # Yıldız dairesinin ay iç dairesinden uzaklığı
F = 0.25 * G # Yıldız dairesinin çapı
L = 1.5 * G # Bayrağın boyu (uzunluk)
M = (1/30) * G # kaçak kenar genişliği
def draw_star(center_x, center_y, radius, rotation_angle=0):
coords = []
# Yıldızın iç ve dış yarıçaplarını hesapla
r_outer = radius
#Yıldızın matematiksel oranı
r_inner = radius * np.sin(np.deg2rad(18)) / np.sin(np.deg2rad(126))
for i in range(10):
# Açıları derece cinsinden 90 dereceden başlatıp 36 derece artırıyoruz.
angle = np.deg2rad(90 + i * 36 + rotation_angle)
# Tek (0, 2, 4...) köşeler dış yarıçap, çift (1, 3, 5...) köşeler iç yarıçap kullanır.
r = r_outer if i % 2 == 0 else r_inner
coords.append((center_x + r * np.cos(angle), center_y + r * np.sin(angle)))
return patches.Polygon(coords, closed=True, color ="white")
def draw_flag():
# Matplotlib figür ve eksen ayarları
fig, ax = plt.subplots()
ax.set_aspect('equal') # Oranları korumak için önemlidir
ax.set_xlim(0, L) # Bayrak boyuna göre x ekseni
ax.set_ylim(0, G) # Bayrak genişliğine göre y ekseni
ax.axis('off') # Eksen çizgilerini ve etiketlerini gizle
# Kırmızı Zemin
ax.add_patch(patches.Rectangle((0, 0), L, G, color='#E30a17'))
# Hilal (Ay) Konumları ve Yarıçapları
# (M + A): kaçak kenar genişliği + Ay'ın dış merkezinin kaçak kenar uzaklığı
outer_center = (M + A, G / 2)
outer_r = B / 2 # Dış daire yarıçapı
# İç daire merkezi, dış daire merkezinden C kadar kayıktır.
inner_center = (outer_center[0] + C, G / 2)
inner_r = D / 2 # İç daire yarıçapı
# 1. Beyaz Daire (Hilalin ana kısmı)
ax.add_patch(patches.Circle(outer_center, outer_r, color="white"))
# 2. Kırmızı Daire (Hilali oluşturan kesik kısım)
ax.add_patch(patches.Circle(inner_center, inner_r, color='#E30a17'))
# Yıldızın Konumlandırılması
# E: Ay iç dairesi ile yıldız dairesi arasındaki uzaklık
# F/6: Yıldızın yatay konumunun ince ayarı
star_center = (inner_center[0] + E + F / 6, G / 2)
star_rotation_angle = -40 # Yıldızın doğru açıda durması için döndürme
# Yıldızı çiz ve ekle
star = draw_star(star_center[0], star_center[1], F / 2, star_rotation_angle)
ax.add_patch(star)
plt.show()
# Programı başlat
if __name__ == "__main__":
draw_flag()
Bu proje, bir mühendislik projesi gibi düşünülebilir; önce tüm boyutları tanımladık, ardından bu boyutlara göre geometrik şekilleri yerleştirdik.
G = 1.0
A = 0.5 * G
# ...
L = 1.5 * G
Boyutlandırma Temeli (G): Türk Bayrağı, genişliği (yüksekliği) G kabul edilerek oranlanır. Biz G=1.0 kabul ettik, bu da tüm diğer boyutları G nin bir katı olarak hesaplamamızı sağlar. Örneğin, Bayrağın Boyu (L) daima 1.5 katıdır.
Oran Sabitleri: A, B, C, D, E, F ve M gibi değişkenler, kanunda belirtilen geometrik ölçülerdir. Örneğin Ay Dış Dairesinin Çapı (B), bayrak genişliğinin yarısıdır (0.5 \times G).
draw_star)def draw_star(center_x, center_y, radius, rotation_angle=0):
# ...
r = r_outer if i % 2 == 0 else r_inner
# ...
Matematiksel Titizlik: Yıldız çizimi projenin en teknik kısmıdır. 5 köşeli bir yıldızın kenarları ve iç girintileri arasında matematiksel bir oran vardır.
r_inner Hesaplaması: Kodunuz, yıldızın iç yarıçapını (r_inner), dış yarıçapına (r_outer) bağlı olarak trigonometrik fonksiyonlarla (np.sin ve np.deg2rad) doğru bir şekilde hesaplar.
coords Listesi: Yıldızın 10 köşesinin (5 dış, 5 iç) koordinatları, bir for döngüsü içinde hesaplanır. Bu koordinatlar, matplotlib.patches.Polygon fonksiyonuna aktarılır.
fig, ax = plt.subplots()
ax.set_aspect('equal')
ax.set_xlim(0, L)
ax.set_ylim(0, G)
ax.axis('off')
fig, ax = plt.subplots(): Bir çizim alanı (fig) ve bu alan üzerindeki eksenleri (ax) oluştururuz.
ax.set_aspect('equal'): En kritik ayar! Bu komut, x ve y eksenlerinin ölçeğinin birebir aynı olmasını sağlar. Bu sayede daireler gerçekten daire, oranlar da doğru kalır.
ax.set_xlim ve ax.set_ylim: Eksen sınırlarını bayrağın gerçek boy ve genişlik oranlarına göre (L ve G) ayarlarız.
ax.add_patch(patches.Rectangle((0,0), L, G, color='#E30a17')) ile 0,0 noktasından başlayarak L boyunda ve G genişliğinde kırmızı bir zemin çizilir.
Büyük Daire: İlk olarak, outer_center (dış merkez) konumuna beyaz bir daire çizilir.
Küçük Daire: Hemen ardından, inner_center (iç merkez) konumuna arka plan rengiyle (kırmızı) bir daire çizilir. Bu, beyaz daireyi keserek net bir hilal formu oluşturur.
star_center değişkeni, hilale göre resmi kanundaki E ve F oranları dikkate alınarak hesaplanır ve draw_star fonksiyonuna gönderilir. Yıldız, doğru optik duruşu sağlamak için -40 derecelik bir açıyla döndürülür.
Yorumlar
Yorum Gönder