Sierpinski Üçgeni (Sierpinski Triangle)
Orijinal ismi Sierpiński olan Polonyalı matematikçi tarafından 1915 yılında tanımlanan bu üçgen, yapı olarak özyineli (recursive) iç üçgenlerden oluşur.
Kısaca üçgenin her parçası, üç adet alt üçgen oluşturacak şekilde bölünür.
Örneğin aşağıdaki eşkenar üçgeni ele alalım:

Bu üçgenin üç köşesinde üç ayrı üçgen oluşturarak işlemimize başlayabiliriz.

Yukarıdaki şekilde görüldüğü üzere 3 adet siyah eşkenar üçgen oluştu. Bu üçgenlerin her birisini ilk başta ele aldığımız üçgen gibi bir adım daha ilerleyerek üç parçaya bölmeye çalışalım:

Görüldüğü üzere bölme işlemi sonucunda her alt üçgeninin üç köşesinde, ilk adımda yapılan işleme benzer şekilde 3 ayrı üçgen oluşturulmuştur.
Bu işlem sonsuza kadar devam ettirilebilir. Ancak bilindiği üzere bilgisayar bilimlerinde sonsuz yoktur. Dolayısıyla bu işlem için bir limit belirlenir ve belirlenen limite kadar işlem devam ettirilir.
Sierpinski üçgeninin kodlanması
Yukarıda anlatılan üçgeni, Scheme dilinde programlamaya çalışalım. Bu kodlama sırasında PLT Scheme kullanılacaktır.
Öncelikle gerekli olan bazı bilgilerimizi hatırlayalım. Çizim için draw.ss teachpackinin yüklü olması gerekiyor.
Bunun için Language menüsünden Add Teachpack seçeneğini seçip draw.ss paketini yüklüyoruz.
Ardından basit bir üçgenin scheme ile nasıl çizileceğine bakalım.
Ne yazık ki üçgen çizen hazır bir fonksiyonumuz bulunmuyor. Bunun için üçgeni oluşturan üç ayrı doğruyu ayrı ayrı çizdiren bir fonksiyonu bizim yazmamız gerekiyor.
(define (draw-triangle a b c)( and (draw-solid-line a b)(draw-solid-line b c)(draw-solid-line c a)))
Yukarıdaki draw-triangle fonksiyonu üç ayrı nokta almaktadır. Bu noktaları birleştiren üç ayrı doğruda fonksiyon içerisinde çizilmektedir. Bilindiği üzere draw-solid-line fonksiyonu verilen iki nokta arasında bir doğru çizer. Bu noktalar make-posn yapısında olmalıdır. Örneğin çizim ekranında (ki ekranın sol üst köşesi 0,0 olarak kabul edilir) 100, 150 koordinatlarından 200, 250 koordinatlarına bir doğru çizmek istiyorsak aşağıdaki şekilde komut vermemiz gerekir:
(draw-solid-line (make-posn 100 150) (make-posn 200 250))
Üçgen çizen fonksiyonumuz olduğuna göre artık sirepinski üçgenini kodlamaya geçebiliriz.

Kodumuzu yukarıdaki şekilde yazabiliriz. Kodda dikkat edilirse üçgen çizimi sırasında orta nokta bulma yöntemi kullanılmıştır. Buradaki amaç, üçgenin köşelerinde 3 ayrı üçgen elde etme işlemi sırasında üçgenin kenarlarının orta noktalarının birleştirilmesi ile bir ters üçgen oluşturulması olarak düşünülebilir.

Yukarıdaki şekilde de gösterildiği üzere alsında kenarların orta noktalarını birleştiren bir üçgen çizilmektedir.
İşte üçgeni meydana getiren 3 nokta ve bu noktaların oluşturduğu 3 doğru için orta noktalar bulunmakta ve bulunan bu orta noktaları birleştiren yeni bir üçgen çizilmektedir. Bu noktaları bulan kodumuz, yukarıda verilen mid-point fonksiyonudur. Bu mid-point fonksiyonu da, aritmetik ortalama kullanarak, nokta koordinatlarını toplayıp ikiye bölmekte ve bu işlem için yine yukarıdaki kodda verilen mid fonksiyonunu kullanmaktadır.
Ardından üçgenin 3 alt üçgeni yeniden sierpinski üçgeni çizen fonksiyonumuzu yeni noktalar ile verilmektedir.
Sierpinski üçgeninde dikkat edilirse, üçgeni oluştran 3 nokta (a b ve c) dışında ilave olarak bir n parametresi kullanıyoruz. Bu parametrenin amacı, fonksiyonun belirli bir yerde durmasıdır. Bu sayede kullanıcı, işlemimizin kaç adım gidilebileceğini parametre olarak girebilmekte ve belirtilen adım dolduğunda işlem durmaktadır.
Yukarıdaki kodun çalıştırılması aşağıdaki şekilde olabilir:

Görüldüğü üzere, üçgenin içerisine çizileceği üç nokta belirlenmiştir. Burada noktaları belirlerken, üçgenin eşkenar üçgen olması için ufak bir hesaplama yapılmıştır. Çizim tuvalimiz, 400 400 olarak verilmiş yani bize ekranda 400e 400 pixellik (imgecik) bir alan açılmaktadır. Bu alanı nispeten ortalayan bir üçgende A B ve C noktalarının birleştirilmesi ile teşekkül etmiş olur.
Son olarak sierpinski üçgenini çizen özyineli (recursive) fonksiyonumuzu bu üç noktanın koordinatları ve 10 adım gidileceğini belirten 10 sabit sayısı ile çağırıyoruz.
Sonuç olarak ekrana çizilen görüntü aşağıdaki şekildedir:

Yukarıdaki şekilde, 10 adım ilerlenmiş ve 10 adım sonunda detaylı bir görüntü oluşmuştur. Örneğin aynı üçgeni 3 parametresi ile, yani 3 adım ilerleyecek şekilde çağırsaydık:

Yukarıda verilen biraz daha ilkel halini görecektik.
« C ile programlamaya giriş final sınavı çözümleri | Diferansiyel Kriptoanalizi ( Fark Tecessüsü , Differential Cryptoanalysis) »
Yorumlar
Bilgisayar Kavramları üzerinde şu anda okumakta olduğunuz 'Sierpinski Üçgeni (Sierpinski Triangle)' isimli yazı 29 Jan 2010 tarihinde, saat: 17:05 'de Şadi Evren ŞEKER tarafından gönderilmiş, toplam 250 defa okunmuştur.
Benzer yazıları Bilgisayar Grafiği (Computer Graphics), Scheme (Lisp) kategorilerinden okuyabilirsiniz. Yazar ile irtibat kurmak için email gönderebilirsiniz. Yazıya yorum yapabilir ya da yapılan yorumları RSS 2.0 ile takibe alabilirsiniz.
Yazarın Kitabı
Bu yazının yazarı Şadi Evren ŞEKER'in son çıkan kitabı "Programlama ve Veri Yapılarına giriş (C, C++ ve JAVA ile)" hakkında bilgi almak için Buraya tıklayabilirsiniz.
Eklenen Son Yazılar
- Visual Basic ile Gösterici (Pointer) Kullanımı
- Hasse Çizgeleri (Hasse Diagrams)
- Zeki Vekiller (Akıllı Ajanlar, Intelligent Agents, Zeki Etmenler )
- Integral Kriptoanalizi ( Toplam Tecessüsü , Integral Cryptoanalysis)
- Diferansiyel Kriptoanalizi ( Fark Tecessüsü , Differential Cryptoanalysis)
- Sierpinski Üçgeni (Sierpinski Triangle)
- C ile programlamaya giriş final sınavı çözümleri
- Çok Seviyeli Sıralar (Multi Level Queues)
- Çift Özetleme (Double Hashing)
- İkinci Dereceden Sondalama (Quadratic Probing)
Yapılan Son Yorumlar
- Şadi Evren ŞEKER: Sıralama işleminiz poligonu...
- Şadi Evren ŞEKER: bahsettiğiniz sıralama algoritması...
- Abdurrahman ulusoy: merhaba hocam. gelişigüzel...
- Oguz Okutan: Merhaba hocam.. Fonksiyonlarda degere göre...
- Şadi Evren ŞEKER: Null, NULL, nil veya null olarak...
- Fatih Kabakci: hocam merhabalar,...
- kara: Çok güzel anlatılmış gerçekten teşekkürler...
- Şadi Evren ŞEKER: Bahsettiğiniz şekil dönüşümü...
- Caner: Kullanıcıdan açı girdisi almıyorsanız...
- Furkan Yediyildiz: Algoritmanin mantigi cok güzel...
- havva: çok sağolun çok güzel açıklamalar var tşk...
- Şadi Evren ŞEKER: typedef komutu, bir yapıdan yeni bir...
- fatih kabakci: hocam ben structures ile ilgili bir sorum...
- Şadi Evren ŞEKER: evet, yukarıda açıklanan, herhangi...
- Abdurrahman ulusoy: fi açısından teta kadar döndürme...
- Şadi Evren ŞEKER: Hayır yok, bir noktanın, herhangi...
- Abdurrahman ulusoy: Bu durumda yukarıdaki formüllerin...
- Abdurrahman ulusoy: Merhaba hocam Üstteki mesajımda...
- mustafa ekmekcioğlu: merhaba şadi bey ben hacettepe...
- Şadi Evren ŞEKER: Talebiniz üzerine...
Yakın Yazılar
Sierpinski Üçgeni (Sierpinski Triangle)
Paskal Üçgeni (Pascal’s Triangle)
Parçalı Eşleme Çarprazlaması (Partially Match Crossover)
Kenar Sıralama Çarprazlaması (Edge Recombination Crossover, ERX)
Bezier Eğrileri (Bezier Curves)
Bağlantılar