Untitled

 avatar
unknown
plain_text
a year ago
5.7 kB
6
Indexable
import cv2
import numpy as np
import math #Matematiksel işlemler için standart Python kütüphanesi.

def create_canvas():
    return np.ones((500, 500, 3), dtype="uint8") * 255  # Beyaz bir tuval oluşturma

def draw_center_circle(canvas, center, radius=10):
    cv2.circle(canvas, center, radius, (0, 0, 0), -1)  # Daire oluşturma
    
def is_point_within_canvas(point, canvas):
    return 0 <= point[0] < canvas.shape[1] and 0 <= point[1] < canvas.shape[0]

def draw_star(canvas, center, size): #verilen canvas üzerinde merkezi center olan ve belirtilen size büyüklüğünde bir yıldız çizer.
    star_points = [] #Yıldızın köşe noktalarını tutacak boş bir liste oluşturulur.
    for i in range(5): #Beşgen yıldız için döngü oluşturulur.
        outer_angle = i * 2 * math.pi / 5 - math.pi / 2 #Dış açı hesaplanır.
        inner_angle = (i * 2 + 1) * math.pi / 5 - math.pi / 2 #İç açı hesaplanır.
        outer_point = (int(center[0] + size * math.cos(outer_angle)), int(center[1] + size * math.sin(outer_angle))) #Dış köşe noktasının merkezden uzaklığı ve açı kullanılarak koordinatları hesaplanır.
        inner_point = (int(center[0] + (size // 2) * math.cos(inner_angle)), int(center[1] + (size // 2) * math.sin(inner_angle))) #İç köşe noktasının merkezden uzaklığı ve açı kullanılarak koordinatları hesaplanır.

        if is_point_within_canvas(outer_point, canvas) and is_point_within_canvas(inner_point, canvas): #outer_point ve inner_point noktalarının tuval içinde olup olmadığını kontrol eder.
            star_points.append(outer_point) #Hesaplanan dış köşe noktası star_points listesine eklenir.
            star_points.append(inner_point) #Hesaplanan iç köşe noktası star_points listesine eklenir.
        else:
            return None #Eğer noktalar tuval içinde değilse, fonksiyon None döndürür ve çalışmayı sonlandırır.
        
    star_points = np.array(star_points, np.int32).reshape((-1, 1, 2)) #listesi bir numpy array'e dönüştürülür ve çizim için uygun şekilde yeniden şekillendirilir.
    cv2.polylines(canvas, [star_points], isClosed=True, color=(0, 0, 0), thickness=2) 
    #belirtilen noktalardan oluşan yıldızın çizgileri canvas üzerine çizilir. isClosed=True ile yıldızın kapalı bir şekilde çizilmesi sağlanır.
    #color=(0, 0, 0) ile yıldızın siyah renkte çizilmesi belirtilir. thickness=2 ile çizgi kalınlığı belirlenir.

    return star_points #Çizilen yıldızın köşe noktalarının oluşturduğu numpy array döndürülür.

def draw_expanding_stars(canvas, center, size): #belirtilen size değerine kadar genişleyen yıldızlar çizer.
    current_size = 50 #başlangıçta 50 olarak ayarlanır ve her adımda 50 birim artırılır.
    last_points = None #son genişleme adımının köşe noktalarını tutar ve döngü bittiğinde döndürülür.
    while current_size <= size: #belirtilen size değerine kadar olan adımlarda döngüyü çalıştırır.
        star_points = draw_star(canvas, center, current_size) #draw_star fonksiyonu çağrılır ve belirtilen canvas, center (merkez) ve current_size (geçerli boyut) kullanılarak bir yıldız çizilir. Bu fonksiyonun döndürdüğü köşe noktaları star_points değişkenine atanır.
        if star_points is not None: #Eğer star_points None değilse, yani yıldız başarıyla çizilmişse, bu koşul sağlanır.
            last_points = star_points #star_points değişkenindeki köşe noktaları last_points değişkenine atanır. Bu, bir sonraki adımda kullanılacak köşe noktalarını günceller.
        current_size += 50 #Her adımda current_size değeri 50 birim artırılarak yıldızın boyutu büyütülür.
    return last_points #Son genişleme adımının köşe noktalarını içeren bir numpy array olarak döndürülür.

def expand_stars(expansion_speed=500, duration=45): #yıldızların genişlemesini görselleştiren ana işlevi gerçekleştirir.
    size = 50 #Başlangıçta yıldızların boyutu 50 birim olarak ayarlanır.
    start_time = cv2.getTickCount() / cv2.getTickFrequency() # İşlevin başlangıç zamanı ölçülür.
    end_time = start_time + duration #  İşlevin çalışma süresi duration ile belirlenir.

    while cv2.getTickCount() / cv2.getTickFrequency() < end_time: # İşlev, belirtilen süre boyunca döngüyü çalıştırır.
        canvas = create_canvas() #Her döngü adımında yeni bir tuval oluşturulur.
        center = (canvas.shape[1] // 2, canvas.shape[0] // 2) #Tuvalin merkezi hesaplanır.
        draw_center_circle(canvas, center) # Merkez daire çizimi yapılır.
        last_points = draw_expanding_stars(canvas, center, size) #fonksiyonu çağrılarak genişleyen yıldızlar çizilir ve son köşe noktaları last_points değişkenine atanır. 
        
        if last_points is not None: #değişkeni boş değilse (yani yıldızlar çizilmişse):
            for point in last_points: #Her köşe noktası için:
                cv2.circle(canvas, tuple(point[0]), 8, (0, 0, 255), -1)  # Kırmızı noktalar ekleme
        
        cv2.imshow("Canvas", canvas)

        key = cv2.waitKey(expansion_speed)
        if key == 27:  # Esc tuşuna basıldığında döngü sonlandırılır
            break

        size += 50 #her adımda 50 birim artırılır ve yıldızların boyutunu kontrol eder.

    cv2.destroyAllWindows()

if __name__ == "__main__": # Python dosyasının doğrudan çalıştırıldığı zamanlarda belirli bir kod bloğunun çalıştırılmasını sağlar
    expand_stars()
Editor is loading...
Leave a Comment