Dönüştürme Sırası Neden Önemlidir

Tek bir Matrix nesne tek bir dönüştürmeyi veya bir dönüşüm dizisini depolar. İkinci seçenek bileşik dönüşüm olarak da adlandırılan bir yöntemdir. Bileşik dönüşümün matrisi, tek tek dönüşümlerin matrisleri çarparak elde edilir.

Bileşik Dönüşüm Örnekleri

Bileşik dönüşümde tek tek dönüşümlerin sırası önemlidir. Örneğin, önce döndürün, sonra ölçeklendirin, sonra çevirin, ilk kez çevirip döndürün ve ardından ölçeklendirin. Bu GDI+, bileşik dönüşümler soldan sağa doğru inşa edilmiştir. S, R ve T sırasıyla ölçek, döndürme ve çeviri matrisleri ise, ürün SRT (bu sırada) önce ölçeklendiren, sonra döndüren ve çeviren bileşik dönüşümün matrisidir. Ürün SRT tarafından üretilen matris, TRS ürünü tarafından üretilen matristen farklıdır.

Bunun nedenlerinden biri, döndürme ve ölçeklendirme gibi dönüştürmelerin koordinat sisteminin kaynağına göre yapılmasıdır. Kaynağı ortalayan bir nesneyi ölçeklendirmek, çıkış noktası dışında taşınmış bir nesneyi ölçeklendirmeden farklı bir sonuç üretir. Benzer şekilde, kaynağın ortası olan bir nesneyi döndürme, çıkış noktası dışında taşınmış bir nesneyi döndürmeden farklı bir sonuç üretir.

Aşağıdaki örnek, bileşik bir dönüşüm oluşturmak için ölçeklendirme, döndürme ve çeviriyi (bu sırayla) birleştirir. yöntemine Append geçirilen bağımsız RotateTransform değişken, döndürmenin ölçeklendirmeye uygun olduğunu gösterir. Benzer şekilde yöntemine Append geçirilen bağımsız TranslateTransform değişken, çevirinin döndürmeye uygun olduğunu gösterir. AppendPrependve, MatrixOrder numaralamanın üyeleridir.

Rectangle rect = new Rectangle(0, 0, 50, 50);
Pen pen = new Pen(Color.FromArgb(128, 200, 0, 200), 2);
e.Graphics.ResetTransform();
e.Graphics.ScaleTransform(1.75f, 0.5f);
e.Graphics.RotateTransform(28, MatrixOrder.Append);
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Append);
e.Graphics.DrawRectangle(pen, rect);
Dim rect As New Rectangle(0, 0, 50, 50)
Dim pen As New Pen(Color.FromArgb(128, 200, 0, 200), 2)
e.Graphics.ResetTransform()
e.Graphics.ScaleTransform(1.75F, 0.5F)
e.Graphics.RotateTransform(28, MatrixOrder.Append)
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Append)
e.Graphics.DrawRectangle(pen, rect)

Aşağıdaki örnek, önceki örnekle aynı yöntem çağrılarını yapar, ancak çağrıların sırası tersine çevrilir. Sonuçta elde edilen işlem sırası önce çeviri, sonra döndürme ve ölçeklendirmedir. Bu da ilk ölçeklendirmeden çok farklı bir sonuç üretir, sonra da döndürülür ve ardından çevrilir.

Rectangle rect = new Rectangle(0, 0, 50, 50);
Pen pen = new Pen(Color.FromArgb(128, 200, 0, 200), 2);
e.Graphics.ResetTransform();
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Append);
e.Graphics.RotateTransform(28, MatrixOrder.Append);
e.Graphics.ScaleTransform(1.75f, 0.5f);
e.Graphics.DrawRectangle(pen, rect);
Dim rect As New Rectangle(0, 0, 50, 50)
Dim pen As New Pen(Color.FromArgb(128, 200, 0, 200), 2)
e.Graphics.ResetTransform()
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Append)
e.Graphics.RotateTransform(28, MatrixOrder.Append)
e.Graphics.ScaleTransform(1.75F, 0.5F)
e.Graphics.DrawRectangle(pen, rect)

Bileşik dönüşümde tek tek dönüşümlerin sırasını tersine çevirmenin bir yolu, yöntem çağrılarının sırasını ters çevirmektir. İşlemlerin sıralamalarını denetlemenin ikinci bir yolu matris sırası bağımsız değişkenini değiştirmektir. Aşağıdaki örnek, olarak değiştirilmiş olması dışında önceki Append örnekle Prepend aynıdır. Matris çarpımı sırasıyla SRT'de yapılır; burada S, R ve T sırasıyla ölçeklendirme, döndürme ve çevirme matrisleridir. Bileşik dönüşümün sırası önce ölçeklendirme, sonra döndürme ve çevirmedir.

Rectangle rect = new Rectangle(0, 0, 50, 50);
Pen pen = new Pen(Color.FromArgb(128, 200, 0, 200), 2);
e.Graphics.ResetTransform();
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Prepend);
e.Graphics.RotateTransform(28, MatrixOrder.Prepend);
e.Graphics.ScaleTransform(1.75f, 0.5f);
e.Graphics.DrawRectangle(pen, rect);
Dim rect As New Rectangle(0, 0, 50, 50)
Dim pen As New Pen(Color.FromArgb(128, 200, 0, 200), 2)
e.Graphics.ResetTransform()
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Prepend)
e.Graphics.RotateTransform(28, MatrixOrder.Prepend)
e.Graphics.ScaleTransform(1.75F, 0.5F)
e.Graphics.DrawRectangle(pen, rect)

Hemen yukarıdaki örneğin sonucu, bu konudaki ilk örneğin sonucuyla aynıdır. Bunun nedeni yöntem çağrılarının hem sıralarını hem de matris çarpımlarının sıralamalarını tersine çevirmemizdir.

Ayrıca bkz.