Dönüşüm Sırası Neden Önemlidir?
Tek bir Matrix nesnesi, tek bir dönüşümü veya bir dizi dönüştürmeyi depolayabilir. İkincisi bileşik dönüştürme olarak adlandırılır. Bileşik dönüştürme matrisi, bireysel dönüşümlerin matrisleri çarpılarak elde edilir.
Bileşik Dönüşüm Örnekleri
Bileşik dönüştürmede, tek tek dönüştürmelerin sırası önemlidir. Örneğin, önce döndürdükten sonra ölçeklendikten sonra çeviri yaparsanız, önce çevirip, sonra döndürdükten sonra ölçeklendirmekten farklı bir sonuç elde edersiniz. GDI+ dilinde bileşik dönüştürmeler soldan sağa oluşturulur. S, R ve T sırasıyla ölçek, döndürme ve çeviri matrisleriyse, ürün SRT'si (bu sırayla) önce ölçeklendirilen, sonra döndüren, sonra çeviren bileşik dönüşümün matrisidir. Ürün SRT tarafından üretilen matris, ÜRÜN TRS tarafından üretilen matristen farklıdır.
Sıralamanın önemli bir nedeni, döndürme ve ölçeklendirme gibi dönüştürmelerin koordinat sisteminin kaynağına göre yapılmasıdır. Kaynakta ortalanmış bir nesneyi ölçeklendirmek, kaynaktan uzağa taşınan bir nesneyi ölçeklendirmekten farklı bir sonuç üretir. Benzer şekilde, kaynakta ortalanmış bir nesneyi döndürmek, kaynaktan uzaklaşmış bir nesneyi döndürmekten farklı bir sonuç verir.
Aşağıdaki örnek, bileşik dönüştürme oluşturmak için ölçeklendirme, döndürme ve çeviriyi (bu sırayla) birleştirir. RotateTransform yöntemine geçirilen Append bağımsız değişkeni, döndürmenin ölçeklendirmeyi izleyeceğini gösterir. Benzer şekilde, Append bağımsız değişkeninin TranslateTransform yöntemine geçirilmesi, çevirinin rotasyonu izleyeceğini gösterir. Append ve Prepend, MatrixOrder numaralandırmasını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. İşlem sırası, önce çevir, sonra döndür, sonra ölçeklendir şeklindedir ve bu, önce ölçeklendir, sonra döndür, sonra çevir şeklindeki işlem sırasından çok farklı bir sonuç üretir.
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üştürmede tek tek dönüştürmelerin sırasını tersine çevirmenin bir yolu, yöntem çağrıları dizisinin sırasını tersine çevirmektir. İşlem sırasını denetlemenin ikinci bir yolu matris sırası argümanını değiştirmektir. Aşağıdaki örnek, önceki örnekle aynıdır, ancak AppendPrependolarak değiştirilmiştir. Matris çarpması SRT sırasına göre 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çekleme, sonra döndürme ve ardından taşıma şeklindedir.
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 önceki örneğin sonucu, bu konudaki ilk örneğin sonucuyla aynıdır. Bunun nedeni hem yöntem çağrılarının sırasını hem de matris çarpma sırasını tersine çevirmemizdir.
Ayrıca bkz.
.NET Desktop feedback