Transformasi Global dan Lokal

Transformasi global adalah transformasi yang berlaku untuk setiap item yang digambar oleh objek Grafis tertentu. Untuk membuat transformasi global, buat objek Grafis , lalu panggil metode Graphics::SetTransform-nya . Metode Graphics::SetTransform memanipulasi objek Matriks yang terkait dengan objek Grafis . Transformasi yang disimpan dalam objek Matriks tersebut disebut transformasi dunia. Transformasi dunia dapat menjadi transformasi affine sederhana atau urutan transformasi affine yang kompleks, tetapi terlepas dari kompleksitasnya, transformasi dunia disimpan dalam satu objek Matriks .

Kelas Grafis menyediakan beberapa metode untuk membangun transformasi dunia komposit: Graphics::MultiplyTransform, Graphics::RotateTransform, Graphics::ScaleTransform, and Graphics::TranslateTransform. Contoh berikut menggambar elips dua kali: sekali sebelum membuat transformasi dunia dan sekali setelahnya. Transformasi pertama kali diskalakan dengan faktor 0,5 ke arah y, lalu menerjemahkan 50 unit ke arah x, lalu memutar 30 derajat.

myGraphics.DrawEllipse(&myPen, 0, 0, 100, 50);
myGraphics.ScaleTransform(1.0f, 0.5f);
myGraphics.TranslateTransform(50.0f, 0.0f, MatrixOrderAppend);
myGraphics.RotateTransform(30.0f, MatrixOrderAppend);
myGraphics.DrawEllipse(&myPen, 0, 0, 100, 50);

Ilustrasi berikut menunjukkan elips asli dan elips yang diubah.

cuplikan layar jendela yang berisi dua elipsis yang tumpang tindih; satu lebih sempit dan diputar

Catatan

Dalam contoh sebelumnya, elips diputar tentang asal sistem koordinat, yang berada di sudut kiri atas area klien. Ini menghasilkan hasil yang berbeda dari memutar elips tentang pusatnya sendiri.

 

Transformasi lokal adalah transformasi yang berlaku untuk item tertentu yang akan digambar. Misalnya, objek GraphicsPath memiliki metode GraphicsPath::Transform yang memungkinkan Anda mengubah titik data jalur tersebut. Contoh berikut menggambar persegi tanpa transformasi dan jalur dengan transformasi rotasi. (Asumsikan bahwa tidak ada transformasi dunia.)

 
Matrix myMatrix;
myMatrix.Rotate(45.0f);
myGraphicsPath.Transform(&myMatrix);
myGraphics.DrawRectangle(&myPen, 10, 10, 100, 50);
myGraphics.DrawPath(&myPen, &myGraphicsPath);

Anda dapat menggabungkan transformasi dunia dengan transformasi lokal untuk mencapai berbagai hasil. Misalnya, Anda dapat menggunakan transformasi dunia untuk merevisi sistem koordinat dan menggunakan transformasi lokal untuk memutar dan menskalakan objek yang digambar pada sistem koordinat baru.

Misalkan Anda menginginkan sistem koordinat yang memiliki asal 200 piksel dari tepi kiri area klien dan 150 piksel dari bagian atas area klien. Selain itu, asumsikan bahwa Anda ingin unit pengukuran menjadi piksel, dengan sumbu x menunjuk ke kanan dan sumbu y menunjuk ke atas. Sistem koordinat default memiliki sumbu y yang menunjuk ke bawah, jadi Anda perlu melakukan pantulan di seluruh sumbu horizontal. Ilustrasi berikut menunjukkan matriks pantulan seperti itu.

ilustrasi memperlihatkan matriks tiga demi tiga

Selanjutnya, asumsikan Anda perlu melakukan terjemahan 200 unit di sebelah kanan dan 150 unit ke bawah.

Contoh berikut menetapkan sistem koordinat yang baru saja dijelaskan dengan mengatur transformasi dunia objek Grafis .

Matrix myMatrix(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
myGraphics.SetTransform(&myMatrix);
myGraphics.TranslateTransform(200.0f, 150.0f, MatrixOrderAppend);

Kode berikut (ditempatkan setelah kode dalam contoh sebelumnya) membuat jalur yang terdiri dari persegi panjang tunggal dengan sudut kiri bawahnya di asal sistem koordinat baru. Persegi panjang diisi sekali tanpa transformasi lokal dan sekali dengan transformasi lokal. Transformasi lokal terdiri dari penskalaan horizontal dengan faktor 2 diikuti oleh rotasi 30 derajat.

// Create the path.
GraphicsPath myGraphicsPath;
Rect myRect(0, 0, 60, 60);
myGraphicsPath.AddRectangle(myRect);

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

// Transform the path.
Matrix myPathMatrix;
myPathMatrix.Scale(2, 1);
myPathMatrix.Rotate(30, MatrixOrderAppend);
myGraphicsPath.Transform(&myPathMatrix);

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

Ilustrasi berikut menunjukkan sistem koordinat baru dan dua persegi panjang.

cuplikan layar sumbu x dan y, dan persegi biru dilapisi oleh rektagle semi transparan yang diputar di sudut kiri bawahnya