سلام
اگر بخواهی پیشرفته تر عمل کنی،خوده دات نت ابزاری برای رسم گرافیکی خوبی با استفاده از نظریه ماتریس ها در اختیار قرار می ده.
اگر اطلاع داشته باشی،هر تغییر وضعیت شی در صفحه با یک ماتریس معادل است.مثلا انتقال شی (تغییر X یا Y یا هر دو در راستای خود به اندازه های متفاوت) یا دوران (چرخش شی حول یک نقطه) یا قرینه (نسبت به خط یا نقطه) و ... هر کدام یک ماتریس دارد (بحث پست قبل هم بر همین مبنا برای ماتریس دوران حول مبدا مختصات بود).
چنانچه از این مفاهیم اطلاع داری (با جستجو در اینترنت هم می توانی مقاله های خوبی در این زمینه پیدا کنی)،راه کار زیر را توصیه می کنم.
فرض کن می خواهی مربعی رسم کنی که اول یک بزرگ نمایی 2 به 1 در راستای X داشته باشد (راستای Y ثابت است) سپس 90 درچه حول محور مختصات بچرخد و در نهایت مبدا مختصات به نقطه (50و250) منتقل شود.هر کدام از این رفتار ها یک ماتریس دارد که به شکل زیر معرفی می شود:
Matrix myMatrix1 = new Matrix(2.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f); // Scale
Matrix myMatrix2 = new Matrix(0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f); // Rotate 90,
Matrix myMatrix3 = new Matrix(1.0f, 0.0f, 0.0f, 1.0f, 250.0f, 50.0f); // Translate
حالا اگر این ماتریس ها را به ترتیب در هم ضرب کنی،به ماتریسی می رسی که باید بر هر نقطه شی اثر کند تا همه این خصوصیات (به همین ترتیبی که گفته شد) در آن موجود باشد.در نهایت کد زیر (شکلش در ضمیمه آمده است) بدست می آید:
/*-----------------------------------------
* Use function Of MSDN.
* For find it,search program of enter each function.
* Note: Name of function may be changed.
------------------------------------------*/
private void MultiplyExample_SRT(PaintEventArgs e)
{
Pen myPen = new Pen(Color.Blue, 1);
Pen myPen2 = new Pen(Color.Red, 1);
// Set up the matrices.
Matrix myMatrix1 = new Matrix(2.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f); // Scale
Matrix myMatrix2 = new Matrix(0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f); // Rotate 90,
Matrix myMatrix3 = new Matrix(1.0f, 0.0f, 0.0f, 1.0f, 250.0f, 50.0f); // Translate
// Display the elements of the starting matrix.
ListMatrixElements_SRT(e, myMatrix1, "Beginning Matrix", 3, 30);
// Multiply Matrix1 by Matrix 2.
myMatrix1.Multiply(myMatrix2, MatrixOrder.Append);
// Display the result of the multiplication of Matrix1 and
// Matrix2.
ListMatrixElements_SRT(e, myMatrix1, "Matrix After 1st Multiplication", 3, 50);
// Multiply the result from the pervious multiplication by
// Matrix3.
myMatrix1.Multiply(myMatrix3, MatrixOrder.Append);
// Display the result of the previous multiplication
// multiplied by Matrix3.
ListMatrixElements_SRT(e, myMatrix1, "Matrix After 2nd Multiplication", 3, 70);
// Draw the rectangle prior to transformation.
e.Graphics.DrawRectangle(myPen, 20, 20, 40, 40);
// Make the transformation.
e.Graphics.Transform = myMatrix1;
// Draw the rectangle after transformation.
e.Graphics.DrawRectangle(myPen2, 20, 20, 40, 40);
myPen.Dispose();
myPen2.Dispose();
}
//-------------------------------------------------------
// The following function is a helper function to
// list the contents of a matrix.
//-------------------------------------------------------
private void ListMatrixElements_SRT(PaintEventArgs e, Matrix matrix, string matrixName, int numElements, int y)
{
// Set up variables for drawing the array
// of points to the screen.
int i;
float x = 10, X = 200;
Font myFont = new Font("Arial", 10);
SolidBrush myBrush = new SolidBrush(Color.Black);
// Draw the matrix name to the screen.
e.Graphics.DrawString(matrixName + ": ", myFont, myBrush, x, y);
// Draw the set of path points and types to the screen.
for (i = 0; i < numElements; i++)
{
e.Graphics.DrawString(
matrix.Elements[i].ToString() + ", ",
myFont, myBrush, X, y);
X += 30;
}
myFont.Dispose();
myBrush.Dispose();
}
در واقع باید از خصوصیات Transform در شی Graphics برای انجام این عمل استفاده کنی.در شکل زیر هر دو مستطیل با یک دستور رسم شده اند.ولی مستطیل اول (آبی) به شکل معمولی و مستطیل قرمز (دوم) با اعمال ماتریس بالا رسم شده است.
برای اطلاعات بیشتر به MSDN مراجعه کن.
موفق باشی