Dönüştürme Sırası Neden Önemlidir
Tek bir nesne, tek Matrix 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. yöntemine RotateTransform geçirilen bağımsız değişkenAppend, döndürmenin ölçeklendirmeyi izleyeceğini gösterir. Benzer şekilde, yöntemine TranslateTransform geçirilen bağımsız değişken Append de çevirinin döndürmeyi izleyeceğini gösterir. Append ve Prepend sabit listesi üyeleridir MatrixOrder .
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 çevirin, sonra döndürün, sonra ölçeklendirin ve bu da ilk ölçeklendirmeden çok farklı bir sonuç verir, sonra döndürün ve çevirin.
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ı bağımsız değişkenini değiştirmektir. Aşağıdaki örnek, olarak değiştirilmiş Prependolması dışında Append önceki örnekle aynıdır. 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çeklendirilir, sonra 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.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