Genel ve Yerel Dönüştürmeler

Genel dönüşüm, belirli bir nesne tarafından çizilen her öğe için geçerli olan bir Graphics dönüşümdür. Buna karşılık yerel dönüştürme, çizilecek belirli bir öğe için geçerli olan bir dönüşümdür.

Genel Dönüşümler

Genel bir dönüşüm oluşturmak için bir nesnesi Graphics oluşturun ve ardından özelliğini Transform işin. Transformözelliği bir Matrix nesnesidir, bu nedenle herhangi bir affine dönüştürme dizisini tutabilir. özelliğinde depolanan Transform dönüştürmeye dünya dönüşümü denir. sınıfı, Graphics bileşik dünya dönüşümü için çeşitli yöntemler sağlar: , , ve MultiplyTransformRotateTransformScaleTransformTranslateTransform . Aşağıdaki örnekte üç nokta iki kez çizildi: bir kez dünya dönüşümü oluşturmadan önce ve bir kez sonra. Dönüştürme ilk olarak y yönünde 0,5 kat ölçeğini ölçeklendirerek x yönünde 50 birim çevirir ve ardından 30 derece döndürülür.

myGraphics.DrawEllipse(myPen, 0, 0, 100, 50);
myGraphics.ScaleTransform(1, 0.5f);
myGraphics.TranslateTransform(50, 0, MatrixOrder.Append);
myGraphics.RotateTransform(30, MatrixOrder.Append);
myGraphics.DrawEllipse(myPen, 0, 0, 100, 50);
myGraphics.DrawEllipse(myPen, 0, 0, 100, 50)
myGraphics.ScaleTransform(1, 0.5F)
myGraphics.TranslateTransform(50, 0, MatrixOrder.Append)
myGraphics.RotateTransform(30, MatrixOrder.Append)
myGraphics.DrawEllipse(myPen, 0, 0, 100, 50)

Aşağıdaki çizimde dönüştürmeye dahil olan matrisler gösterilmiştir.

Transformations

Not

Önceki örnekte, üç nokta koordinat sisteminin kaynağı hakkında döndürülür ve bu da istemci alanı sol üst köşesindedir. Bu, üç noktayı kendi merkezi hakkında döndürmeden farklı bir sonuç üretir.

Yerel Dönüşümler

Yerel dönüştürme, çizilecek belirli bir öğe için geçerlidir. Örneğin, bir GraphicsPath nesnenin bu yolun veri noktalarını Transform dönüştürmeye olanak sağlayan bir yöntemi vardır. Aşağıdaki örnek, dönüştürmesiz bir dikdörtgeni ve döndürme dönüştürmesi olan bir yolu çizer. (Dünya dönüşümü olmadığını varsayalım.)

Matrix myMatrix = new Matrix();
myMatrix.Rotate(45);
myGraphicsPath.Transform(myMatrix);
myGraphics.DrawRectangle(myPen, 10, 10, 100, 50);
myGraphics.DrawPath(myPen, myGraphicsPath);
Dim myMatrix As New Matrix()
myMatrix.Rotate(45)
myGraphicsPath.Transform(myMatrix)
myGraphics.DrawRectangle(myPen, 10, 10, 100, 50)
myGraphics.DrawPath(myPen, myGraphicsPath)

Çeşitli sonuçlar elde etmek için dünya dönüşümlerini yerel dönüşümlerle birleştirin. Örneğin, koordinat sistemini gözden geçirmek için dünya dönüşümlerini kullanabilir ve yeni koordinat sisteminde çizilen nesneleri döndürmek ve ölçeklendirmek için yerel dönüşümleri kullanabilirsiniz.

başlangıç noktası istemci alanı sol kenarından 200 piksel ve istemci alanı üst kısmından 150 piksel olan bir koordinat sistemi istediğinizi varsayalım. Ayrıca, ölçü biriminin piksel, x ekseninin sağa, y ekseninin yukarıya işaret ediyor olması da istediğiniz varsayın. Varsayılan koordinat sisteminde y ekseni aşağı işaret eder, bu nedenle yatay eksende bir yansıma gerçekleştirmeniz gerekir. Aşağıdaki çizimde böyle bir yansımanın matrisi gösterilmiştir.

Transformations

Ardından, sağa 200 birim ve 150 birim aşağıda çeviri gerçekleştirmeniz gerekir.

Aşağıdaki örnek, bir nesnenin dünya dönüşümlerini ayarlıyor ve koordinat sistemini Graphics oluşturur.

Matrix myMatrix = new Matrix(1, 0, 0, -1, 0, 0);
myGraphics.Transform = myMatrix;
myGraphics.TranslateTransform(200, 150, MatrixOrder.Append);
Dim myMatrix As New Matrix(1, 0, 0, -1, 0, 0)
myGraphics.Transform = myMatrix
myGraphics.TranslateTransform(200, 150, MatrixOrder.Append)

Aşağıdaki kod (önceki örneğin sonuna yerleştirilir) yeni koordinat sisteminin kaynağında sol alt köşesine sahip tek bir dikdörtgenden oluşan bir yol oluşturur. Dikdörtgen bir kez yerel dönüştürme ile, bir kez de yerel dönüştürme ile doldurulur. Yerel dönüşüm, 2 faktörüyle yatay ölçeklendirme ve ardından 30 derece döndürmeden oluşur.

// Create the path.
GraphicsPath myGraphicsPath = new GraphicsPath();
Rectangle myRectangle = new Rectangle(0, 0, 60, 60);
myGraphicsPath.AddRectangle(myRectangle);

// Fill the path on the new coordinate system.
// No local transformation
myGraphics.FillPath(mySolidBrush1, myGraphicsPath);

// Set the local transformation of the GraphicsPath object.
Matrix myPathMatrix = new Matrix();
myPathMatrix.Scale(2, 1);
myPathMatrix.Rotate(30, MatrixOrder.Append);
myGraphicsPath.Transform(myPathMatrix);

// Fill the transformed path on the new coordinate system.
myGraphics.FillPath(mySolidBrush2, myGraphicsPath);
' Create the path.
Dim myGraphicsPath As New GraphicsPath()
Dim myRectangle As New Rectangle(0, 0, 60, 60)
myGraphicsPath.AddRectangle(myRectangle)

' Fill the path on the new coordinate system.
' No local transformation
myGraphics.FillPath(mySolidBrush1, myGraphicsPath)

' Set the local transformation of the GraphicsPath object.
Dim myPathMatrix As New Matrix()
myPathMatrix.Scale(2, 1)
myPathMatrix.Rotate(30, MatrixOrder.Append)
myGraphicsPath.Transform(myPathMatrix)

' Fill the transformed path on the new coordinate system.
myGraphics.FillPath(mySolidBrush2, myGraphicsPath)

Aşağıdaki çizimde yeni koordinat sistemi ve iki dikdörtgen gösterilmiştir.

Transformations

Ayrıca bkz.