> Ana Sayfa > Yazılar

Poligonlar ve Dönüşüm Matrisleri Uygulaması

Bu yazıda poligonlardan ve poligonların dönüşüm matrisi uygulamalarından bahsedeceğim. Poligonlar en az üç noktadan oluşan kenarları düz olacak şekilde birleşmiş şekillerdir. Poligonlar kullandığımız bir çok geometrik şekli kapsar. Kare, dikdörtgen, yedigen ve yamuklar poligon örnekleridir. Normalde poligonlnar son oluşturulan nokta ile ilk oluşturulan nokta ile bağlanarak kapalı bir alan oluştururlar. Ama bu yazıda işlemleri aynı olduğu için son nokta ile ilk noktanın birleşmediği şekle açık poligon ismini verdim.

Kapalı Poligon
Açık Poligon

Poligonları oluşturan eleman noktalarıdır. Noktalar sırayla birbirine bağlandığı için noktaları bilmemiz poligonun bilmemiz anlamına gelir.

  1. Nokta:(20.00,-25.00)
  2. Nokta:(30.00,0.00)
  3. Nokta:(10.00,25.00)
  4. Nokta:(-10.00,30.00)
  5. Nokta:(-30.00,-10.00)
  6. Nokta:(0.00,-30.00)
  1. Nokta:(20.00,-25.00)
  2. Nokta:(30.00,0.00)
  3. Nokta:(10.00,25.00)
  4. Nokta:(-10.00,30.00)
  5. Nokta:(-30.00,-10.00)
  6. Nokta:(0.00,-30.00)

Poligonların Matris şeklinde yazımı

Poligonları matrislere dönüştürmemiz bizim taşıma döndürme yada yansıtma işlemlerini kolaylıkla yapmamızı sağlayacaktır. Matrisin satır sayısı noktaların boyut sayısını, sütun sayısı poligonun sahip olduğu nokta sayısına eşittir. Aşağıdaki gibi noktaları 2 boyutlu, n tane noktalı poligonun noktaları yan yana yazarsak poligonun matrisini elde ederiz.

$$\begin{bmatrix}x_1 & x_2& x_3 & ... & x_n\\\ y_1 & y_2 & y_3 & ... & y_n\end{bmatrix}$$

Çeşitli poligonların matrislerini aşağıda örnek olarak gösterilmiştir.

Kırmızı noktaları sürükleyerek poligonun noktarının değişimini görebilirsiniz.

$$\begin{bmatrix}x_1 & x_2& x_3 & x_4 & x_5 & x_6 \\\ y_1 & y_2 & y_3 & y_4 & y_5 & y_6\end{bmatrix} =$$
$$\begin{bmatrix}20.0 & 30.0 & 10.0 & -10.0 & -30.0 & 0.0\\\ -25.0 & 0.0 & 25.0 & 30.0 & -10.0 & -30.0\end{bmatrix}$$
$$\begin{bmatrix}x_1 & x_2& x_3 & x_4 & x_5 & x_6 & x_7 & x_8 \\\ y_1 & y_2 & y_3 & y_4 & y_5 & y_6 & y_7 & y_8 \end{bmatrix} =$$
$$\begin{bmatrix}-20 & -32 & -25 & -10 & 10 & 20 & 30 & 0\\\ -25 & -5 & 15 & 35 & 30 & 10 & -30 & -40\end{bmatrix}$$

Matris yardımıyla şeklin dönüşümü

Öteleme

Poligona bütün noktalara öteleme miktarını (x,y) birimini ekleyerek ötelenmiş poligonu bulabiliriz.

$$\begin{bmatrix}x_1 & x_2& x_3 & ... & x_n\\\ y_1 & y_2 & y_3 & ... &y_n\end{bmatrix}+\begin{bmatrix}x_t\\\ y_t\end{bmatrix}=$$
$$\begin{bmatrix}x_1+x_t & x_2+x_t& x_3+x_t & ... & x_n+y_t\\\ y_1+y_t & y_2+y_t & y_3+y_t & ... & y_n+y_t\end{bmatrix}$$

Örnek olarak sırasıyla (100,150),(-50,100),(-150,-80),(70,-50) olan bir fonsiyonu (145,-176) boyunca kaydırmak istersek

$$\begin{bmatrix}100 & -50& -150 & 70 \\\ 150 & 100 & -80 & -50 \end{bmatrix}+$$
$$\begin{bmatrix}145\\\ -176\end{bmatrix}=$$
$$\begin{bmatrix}245 & 95& -5 & 215 \\\ -26 & -76 & -256 & -226 \end{bmatrix}$$

İşlemiyle çokgenimizi ötemiş oluruz.

Aşağıdaki Grafikte xt ve yt değerleri ile serbestçe oynayarak öteleme yapabilirsiniz.

$$x_t=$$
$$y_t=$$

Katlama

Poligonun bütün noktalarını matris çarpımıyla yardımıyla katlayabiliriz. Katlama noktasının referansı (0,0) noktasıdır.

$$\begin{bmatrix}k_x & 0\\\ 0 & k_y\end{bmatrix} *$$
$$ \begin{bmatrix}x_1 & x_2& x_3 & ... & x_n\\\ y_1 & y_2 & y_3 & ...&y_n\end{bmatrix} =$$
$$ \begin{bmatrix}x_1*k_x & x_2*k_x& x_3*k_x & ... &x_n*k_x\\\ y_1*k_y & y_2*k_y & y_3*k_y & ... & y_n*k_y\end{bmatrix} $$

Örnek olarak sırasıyla (70, 150), (-20, 180), (-140, -170), (120, -210), olan bir poligonu (1.4,-2.3) katına çıkartalım.

Ayrıca katlama işlemi sayesinde şekillerin x veya y ekseni üzerinde yansımasınıda bulabiliriz.

$$\begin{bmatrix}1.4 & 0\\\ 0 & -2.3\end{bmatrix} *$$
$$ \begin{bmatrix}70 & -20 & -140 & 120 \\\ 150 & 180 & -170 & -210 \end{bmatrix} =$$
$$ \begin{bmatrix}98 & -28 & -196 & 168 \\\ -345 & -414 & 390 & 482 \end{bmatrix}$$

Böylece çokgenimizi katlamış oluruz.

Dikkat ederseniz k değerine -1 vererek şeklimizi yansıtabiliriz. Matrisimizi

$$\begin{bmatrix}-1 & 0 \\\ 0 & 1\end{bmatrix}$$
ile çarparsak x ekseniz üzerinde yansımasını alırız. Aynı şekilde
$$\begin{bmatrix}1 & 0\\\ 0 & -1\end{bmatrix}$$
çarparsakta y ekseni üzerinde yansımasını buluruz. Her iki değeride -1 yaparsak hem x hem y eksenine göre yansımasını almış oluruz.

Yansıtılmamış hali
y eksenine göre yansıtılmış
x eksenine göre yansıtılmış
Hem y hem de x eksenine göre yansıtılmş

Aşağıdaki Grafikte xt ve yt değerleri ile serbestçe oynayarak öteleme yapabilirsiniz.

$$k_x=$$
$$k_y=$$

Dönme

Poligonunu dönüşüm matrisleri yardımıyla döndürebiliriz. Unutmayın dönme noktasının referansı (0,0) noktasıdır. Saat yönün tersi θ kadar döndürme işlemini aşağıdaki gibidir.

$$\begin{bmatrix}cos(θ) & sin(θ)\\\ -sin(θ) & cos(θ)\end{bmatrix} * \begin{bmatrix}x_1 & x_2 & ... & x_n\\\ y_1 & y_2 & ...&y_n\end{bmatrix}=$$
$$\begin{bmatrix}x_1 c(θ)-y_1 s(θ) & x_2 c(θ) - y_2 s(θ) & ... & x_n c(θ) - y_n s(θ) \\\ x_1 c(θ) + y_1 s(θ) & x_1 c(θ) + y_1 s(θ) & ... & x_n c(θ) + y_n s(θ)\end{bmatrix}$$
$$θ(radyan)=$$

Bu işlemler en çok kullanılan işlemlerdir. Bunların dışında sıkma(Squeezing), kesme(Shearing), yansıtma(Reflection) gibi işlemlerde vardır. Bunlar gibi anlatmadığım diğer dönüşümleri araştırıp uygulayabilirsiniz. Şimdiye kadar anlattığım dönüşümleri art arda birkaç tanesini aynı şekle uygulayabilirsiniz. Ayrıca dönüşümleri tek bir şekle uygulamak zorunda da değiliz.

$$x_t=$$
$$y_t=$$
$$θ(radyan)=$$
$$k_x=$$
$$k_y=$$

Yukarıdaki işlemler sırası ile öteleme, döndürme ve katlamadır. Unutmayın her bir işlem diğerinin üzerine yapılır. Önce ötemele işlemi yapılır, ötelenmiş matrisin üzerine dönme işlemi, dönmüş matrisin üzerine de katlama yapılır. Eğer farklı nokta etrafında dönme işlemi yapmak istiyorsanızda öncelikle şeklimizi öteleriz daha sonra uygulamak istediğimiz dönüşümü uygularız. Son olarak başta eklediğimiz öteleme matrisini çıkartırız. Böylece başka nokta etrafında da şeklimizi döndürebiliriz veya yansıtabiliriz.

Öncelikle yapılan işlemlerin çekirdek şekli değiştirmemesini isteriz çünkü yapılan işlemleri kolayca geri değiştirmek veya çıkarmak zorundayız. Bu yüzden şekillerde iki adet matris bulunmaktadır. Birincisi dönüştürülmemiş matris diğeri dönüştürülmüş matris. Her işlem uygulandığında veya tickte dönüştürülmemişten işlemlerle dönüştürülmüş matris elde edilir.

            
        

Şimdilik kulladığımız iki adet matris işlemi bulunmaktadır. İşlemleri dinamik olması için enumlarla kaydettim.

Şekillere sahip olan bir gövde sınıfı oluşturdum bu sınıfta ortak işleme tutulacak şekilleri işledim. Yukarıdaki örneklerden farklı olarak, aynı işlemleri 2 veya daha fazla şekile de uygulayabiliriz. Böylece daha sadece bir şekle sahip olma zorundalılığımız ortadan kalkar.

Ters Dönüşüm

Şimdiye kadar sabit bir şekle sahip olduğumuzu düşündük ve bu şeklin aslını koruyarak çeşitli işlemler uygulayarak görüntüsünü yansıttık. Peki var olan görüntüden şekli değiştirmeye çalışsaydık nasıl yapmamız gerekirdi? Örneğin poligonun bir noktasını tutup kaydırarak şekli değiştirmek istedik. Bunun için şekle uyguladığımız işlemin tersini noktaya uygulayarak şekille aynı dönüşüme getirmemiz gerekir. Toplama işlemini aynı değerlerden çıkartarak kolayca tersine çevirebiliriz.

$$ \begin{bmatrix}x_t \\\ y_t \end{bmatrix} + \begin{bmatrix} x \\\ y \end{bmatrix} = \begin{bmatrix}x^{t} \\\ y^{t} \end{bmatrix} $$
$$ \begin{bmatrix}x_t \\\ y_t \end{bmatrix} - \begin{bmatrix}x^{t} \\\ y^{t} \end{bmatrix} = \begin{bmatrix}x \\\ y \end{bmatrix} $$

Çarpma işlemini tersine çevirmek için öncelikle uygulanan matrisi çarpma işlemine göre tersini almak gerekir. Ondan sonra dönüştürülmüş matrisle çarpılır istenen matris elde edilir.

$$ \begin{bmatrix}a & b\\\ c & d \end{bmatrix} * \begin{bmatrix}x \\\ y \end{bmatrix} = \begin{bmatrix}x^{t} \\\ y^{t} \end{bmatrix} $$
$$ \begin{bmatrix}A\end{bmatrix} * \begin{bmatrix}M\end{bmatrix} =\begin{bmatrix}M^{t}\end{bmatrix} \qquad \begin{bmatrix}A^{-1}\end{bmatrix} * \begin{bmatrix}M^{t}\end{bmatrix} =\begin{bmatrix}M\end{bmatrix}$$

İki boyutta dönüşüm işlemi yaptığımız için dönüştürme matrisleri ikiye iki boyutundadır. İkiye iki matrislerde dönüşüm aşağıdaki gibidir.

$$ \left(\dfrac{1}{|ad-bc|}*\begin{bmatrix}d & -b\\\ -c & a \end{bmatrix}\right) * \begin{bmatrix}x^{t} \\\ y^{t} \end{bmatrix} = \begin{bmatrix}x \\\ y \end{bmatrix} $$

Bir şekil birden fazla dönüşüme uğramış olabilir. Bunun için uygulanan işlemleri sondan başa doğru sırası ile tersini uygulamak gerekir.

$$ \begin{bmatrix}D \end{bmatrix} * (\ \begin{bmatrix}B\end{bmatrix}+( \ \begin{bmatrix}A\end{bmatrix} * \begin{bmatrix}M\end{bmatrix} \ ) \ ) =\begin{bmatrix}M^{t}\end{bmatrix} $$
$$ \begin{bmatrix}A\end{bmatrix}^{-1} * (\ \begin{bmatrix}B\end{bmatrix}-( \ \begin{bmatrix}D\end{bmatrix}^{-1} * \begin{bmatrix}M\end{bmatrix}^{t} \ ) \ ) =\begin{bmatrix}M\end{bmatrix} $$

Bu örneklerde özellikle noktanın ters dönüşümünü yaptım çünkü göstereceğim örnekte mouse pozisyonunu kullanacağım. Eğer Mouse pozisyonu değilde yine bir alanı kullanmak istiyorsanız ters dönüştürülecek matrisin colon sayısını arttırabilirsiniz.

$$k_x=$$
$$k_y=$$
$$θ(radyan)=$$

Son olarak gösterdiğim şekilde öncelikle katlama daha sonra da yansıtma işlemi uygulanmıştır. Yukarıdaki girişlere sayılar yazarak bu işlemlerin katsayısını belirleyebilirsiniz. Kırmızı Noktalarlada çokgenin köşelerini oynatabilirsiniz. Burada grafikte dikkat çekmek istediğim şey aslında mouse pozisyonunun çokgenin dönüştürülmemiş kordinatı ile eşleşmemektedir. Bize gösterilen görüntüde şekil aslın noktaları θ kadar döndürülmüş daha sonra da kx ve yk katı alınmış halidir. Mouse kordinatından şeklin kordinatına geçmek için şeklin dönüşümünde kullanılan işlermleri tersine çevirip mouse kordinatı için uygulamalıyız. Yukardaki örnekte köşe sürüklendiği zaman mouse kordinatı ters dönüşüm geçirir sonra değiştirilen noktanın üzerine kaydedilir.

Koda dönüştürme

Öncelikle matrisin tersini alma ve işaretini ters çevirme fonksiyonları eklendi. Burada yazılan matrisin tersini alma fonksiyonu sadece ikiye iki matrislerde geçerlidir.

            
        
Copyright © 2022