-DrawRectanglePen pen, float x,float y, float a, float b : hàm vẽ một hình chữ nhật bằng bút vẽ pen có tọa độ đỉnh trái trên là x,y, có chiều rộng là a, chiều dài là b.. -DrawElipseP
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN
****** BÁO CÁO BÀI TẬP LỚN
MÔN : ĐỒ HỌA MÁY TÍNH
Đề tài 12 :Viết chương trình thực hiện các phép tịnh tiến, phép quay, phép co dãn, phép đối xứng qua điểm M(x0,y0), đối xứng qua đường thẳng và cho thực hiện
từng chương trình tùy chọn
Giảng viên hướng dẫn : Ths.Nguyễn Cẩm Ngoan
Sinh viên thực hiện : Phạm Hồng Chung
Nguyễn Đức Thoan
Trang 2
MỤC LỤC
Lời nói đầu 3
Chương I Giới thiệu các hàm đồ họa C# và các phép biến đổi hình học 4
I Các hàm đồ họa trong C# 4
II Các phép biến đổi hình học cơ bản 5
1 Phép tịnh tiến: 5
2 Phép quay 6
3 Phép đối xứng 6
Chương II Thiết kế và cài đặt chương trình 9
I Thiết kế chương trình 9
1 Form chính 9
II Cài đặt chương trình 17
Chương III: Tổng kết 39
Trang 3Lời nói đầu
Có câu rằng “một hình ảnh bằng cả nghìn lời nói ” Điều đó thật không thể phủ nhận.
Và rõ ràng là nếu hiển thị thông tin chỉ với các ký hiệu, chữ cái, chữ số không thôi thì không thể hấp dẫn và dễ hiểu như khi có thêm biểu diễn đồ họa Kỹ thuật đồ hoạ cũng
là công cụ không thể thiếu trong các ngành khoa học kỹ thuật, giáo dục, nghệ thuật, giải trí, quảng cáo (để diễn đạt máy móc thiết bị, kiến trúc, cấu trúc cơ thể, thông tin thiên văn địa lý, hình ảnh minh hoạ ) Chính vì vậy, đồ họa là một vấn đề được quan tâm trong ngành công nghệ thông tin.
Cùng với sự phát triển của tin học, kỹ thuật đồ họa trên máy vi tính, ngày càng trở nên tinh xảo Giao diện các phần mềm ngày nay trở nên thân thiện, đẹp mắt nhờ các thể hiện đồ họa Sự hổ trợ của tin học cho các ngành khác trở nên đắc lực hơn nhờ khả năng đồ họa vi tính, trong đó có ngành giáo dục Mục tiêu để tài chúng em làm là xây dựng một chương trình trợ giúp các em học sinh Trung học cơ sở học các phép biến đổi hình học cơ sở.
Tuy nhiên,trong quá trình nghiên cứu không thể không tránh khỏi những hạn chế và thiếu sót, nên rất mong được sự chỉ bảo, góp ý của quý Thầy Cô và bạn bè Chúng em cũng xin chân thành cảm ơn cô giáo Vũ Minh Yến giảng viên khoa công nghệ thông tin trường Đại học Công Nghiệp Hà Nội đã giúp đỡ chúng em hoàn thành đề tài này
Trang 4Chương I Giới thiệu các hàm đồ họa C# và các phép biến đổi hình học.
I Các hàm đồ họa trong C#.
-Point(float x, float y) : với x, y là tọa độ của một điểm để xác định một điểm -Pen(Color color,float x ): bút vẽ vói màu color và độ rộng nét vẽ bằng x.
-Brush(Color color): cọ vẽ dùng để vẽ và tô một hình nào đó bằng màu tô color -DrawLine( Pen pen,float x1, float y1,float x2, float y2): hàm vẽ một đoạn thẳng bằng bút vẽ pen nối hai điểm a(x1,y1) và b(x2,y2).
-DrawRectangle(Pen pen, float x,float y, float a, float b) : hàm vẽ một hình chữ nhật bằng bút vẽ pen có tọa độ đỉnh trái trên là (x,y), có chiều rộng là a, chiều dài là b -DrawElipse(Pen pen, float x,float y, float a, float b): hàm vẽ một hình elip bằng bút vẽ pen nội tiếp hình chữ nhật có tọa độ đỉnh trái trên là (x,y), có chiều rộng là a, chiều dài là b.
-DrawPolygon(Pen pen,Point[] dagiac):hàm vẽ các đường thẳng nối liền các điểm có trong mảng dagiac thành một hình đa giác lồi.
-FillRectangle(Brush brush, float x,float y, float a, float b) : hàm vẽ và tô màu một hình chữ nhật như DrawRectangle bằng cọ vẽ brush.
-FillElipse(Brush brush, float x,float y, float a, float b): : hàm vẽ và tô màu một hình elip như DrawElipse bằng cọ vẽ brush.
Trang 5Trong đó: M x y ' ', ' là ảnh của phép tịnh tiến M x y , theo vector v dx dy ,
*Chú ý: các phép biến đổi phải thực hiện theo thứ tự trên vì ta có dùng các phép nhân giữa các ma trận,nếu thay đổi vị trí có thể thay đổi ma trận của phép biến đổi.
2 Phép quay
- Phép quay làm thay đổi hướng của đối tượng Một phép quay đòi hỏi phải có
Trang 6Ta có công thức biến đổi của phép quay điểm P(x,y) quanh gốc tọa độ góc θ:
Hình 2: phép quay điểm M một góc α qunah tâm của hệ trục
*Chú ý: các phép biến đổi phải thực hiện theo thứ tự trên vì ta có dùng các phép nhân giữa các ma trận,nếu thay đổi vị trí có thể thay đổi ma trận của phép biến đổi.
Trang 7Ma trận biến đổi tương ứng là:
10
+ Phép đối xứng qua đường thẳng song song với Ox:
Hình 4 Phép đối xứng qua đường thẳng song song với Ox Công thức biến đổi:
2 ' '
Ma trận biến đổi tương ứng:
010
001
+ Phép đối xứng qua đường thẳng song song với Oy:
Hình 5 Phép đối xứng qua đường thẳng song song với Oy Công thức biến đổi:
Trang 8Ma trận biến đổi tương ứng:
010
001
Trang 9Chương II Thiết kế và cài đặt chương trình.
g.DrawRectangle(p, new Rectangle(new Point(Convert.ToInt32(x0+x),
Convert.ToInt32(y0-y)), new Size(1, 1)));
}
Trang 10+ Vẽ tam giác:
Người dùng chọn vẽ tam giác sau đó điền đầy đủ thông tin của hình tam giác như tọa độ 3 đỉnh tam giác rồi nhấn nút vẽ hình.
- Hàm vẽ hình tam giác:
void VeTamGiac(Pen p,float x1,float y1,float x2,float y2,float x3,float y3)
{
g.DrawLine(p, x1+x0, -y1+y0, x2+x0, -y2+y0);
g.DrawLine(p, x2+x0, -y2+y0, x3+x0, -y3+y0);
g.DrawLine(p, x3+x0, -y3+y0, x1+x0, -y1+y0);
}
Trang 11+Vẽ tứ giác:
Người dùng chọn vẽ tam giác sau đó điền đầy đủ thông tin của hình tam giác như tọa độ 3 đỉnh tam giác rồi nhấn nút vẽ hình.
- Hàm vẽ tứ giác:
void VeTuGiac(Pen p,float x1, float y1, float x2, float y2, float x3, float y3,
float x4, float y4)
{
g.DrawLine(p, x1 + x0, -y1 + y0, x2 + x0, -y2 + y0);
g.DrawLine(p, x2 + x0, -y2 + y0, x3 + x0, -y3 + y0);
g.DrawLine(p, x3 + x0, -y3 + y0, x4 + x0, -y4 + y0);
g.DrawLine(p, x4 + x0, -y4 + y0, x1 + x0, -y1 + y0);
}
Trang 12- Các phép biến đổi hình học:
+ Phép tịnh tiến:
Người dùng chọn Phép tịnh tiến sau đó nhập tọa độ điểm đầu và điểm cuối của vectơ mà ta cần tịnh tiến theo rồi nhấn thực hiện.
Trang 13+ Phép quay:
Người dùng chọn Phép quay sau đó nhập tọa độ tâm quay và góc quay rồi nhấn thực hiện.
Trang 14+ Phép đối xứng:
Phép đối xứng có 3 trường hợp:
- TH1: Đối xứng qua tâm bất kì:
Người dùng chọn Phép đối xứng qua tâm bất kì sau đó nhập tọa độ tâm đối xứng rồi nhấn thực hiện.
Trang 15- TH2: Đối xứng qua đường thẳng song song với Ox.
Người dùng chọn Phép đối xứng qua đường thẳng song song với Ox sau đó nhập tung độ vào rồi nhấn thực hiện.
Trang 16- TH3: Đối xứng qua đường thẳng song song với Oy.
Người dùng chọn Phép đối xứng qua đường thẳng song song với Oy sau đó nhập hoành độ vào rồi nhấn nút thực hiện.
Trang 17II Cài đặt chương trình
Brush b = new SolidBrush(Color.Blue);
Pen p = new Pen(Color.Blue);
float xmax, ymax, x0, y0, tlx, tly;
float ghtrai, ghphai, ghtren, ghduoi;
float x1, x2, x3, x4, y1, y2, y3, y4, r;
float x11, x12, x13, x14, y11, y12, y13, y14;
cbxDoiXung.Items.Add("Qua tâm bâHt kì");
cbxDoiXung.Items.Add("Qua đường thẳMng song song với Ox");
cbxDoiXung.Items.Add("Qua đường thẳMng song song với Oy");
Trang 18g.DrawLine(Pens.Black, x0, 0, x0, ymax);
g.DrawLine(Pens.Black, x0 + 5, 5, x0, 0);
g.DrawLine(Pens.Black, x0 - 5, 5, x0, 0);
g.DrawLine(Pens.Black, 0, y0, xmax, y0);
g.DrawLine(Pens.Black, xmax-5, y0 - 5, xmax, y0);
g.DrawLine(Pens.Black, xmax-5, y0 + 5, xmax, y0);
g.DrawString("O", new Font("Times New Roman", 18), Brushes.Red, x0-20, y0); g.DrawString("x", new Font("Times New Roman", 15), Brushes.Red, xmax-20, y0); g.DrawString("y", new Font("Times New Roman", 15), Brushes.Red, x0, 10); for (int i = 1; i < ghtrai + ghphai; i++)
g.DrawLine(Pens.Black, i * tlx, y0 + 2, i * tlx, y0 - 2);
for (int i = 1; i < ghtren + ghduoi; i++)
Trang 19void VeTuGiac(Pen p,float x1, float y1, float x2, float y2, float x3, float y3,
float x4, float y4)
{
g.DrawLine(p, x1 + x0, -y1 + y0, x2 + x0, -y2 + y0);
g.DrawLine(p, x2 + x0, -y2 + y0, x3 + x0, -y3 + y0);
g.DrawLine(p, x3 + x0, -y3 + y0, x4 + x0, -y4 + y0);
g.DrawLine(p, x4 + x0, -y4 + y0, x1 + x0, -y1 + y0);
MessageBox.Show("Dữ liệu nhập vào chưa đuM", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
txtx1.Focus();
}
else
{
VeHinhTron(Pens.Blue, tlx * float.Parse(txtx1.Text), tly *
float.Parse(txty1.Text), tly * float.Parse(txtR.Text));
g.DrawString("I", new Font("Times New Roman", 15), Brushes.Blue,x0 + tlx * float.Parse(txtx1.Text), y0 - tly * float.Parse(txty1.Text));
MessageBox.Show("Dữ liệu nhập vào chưa đuM", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
txtx1.Focus();
}
else
{
Trang 20g.DrawString("A", new Font("Times New Roman", 12), Brushes.Blue,x0 + tlx * float.Parse(txtx1.Text), y0 - tly * float.Parse(txty1.Text));
g.DrawString("B", new Font("Times New Roman", 12), Brushes.Blue,x0 + tlx * float.Parse(txtx2.Text), y0 - tly * float.Parse(txty2.Text));
g.DrawString("C", new Font("Times New Roman", 12), Brushes.Blue,x0 + tlx * float.Parse(txtx3.Text), y0 - tly * float.Parse(txty3.Text));
x11 = x1 = float.Parse(txtx1.Text);
x12 = x2 = float.Parse(txtx2.Text);
x13 = x3 = float.Parse(txtx3.Text);
y11 = y1 = float.Parse(txty1.Text);
y12 = y2 = float.Parse(txty2.Text);
y13 = y3 = float.Parse(txty3.Text);
{
MessageBox.Show("Dữ liệu nhập vào chưa đuM", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
txtx1.Focus();
}
else
{
VeTuGiac(Pens.Blue, tlx * float.Parse(txtx1.Text), tly *
float.Parse(txty1.Text), tlx * float.Parse(txtx2.Text), tly * float.Parse(txty2.Text),tlx * float.Parse(txtx3.Text), tly * float.Parse(txty3.Text), tlx *
float.Parse(txtx4.Text), tly * float.Parse(txty4.Text));
g.DrawString("A", new Font("Times New Roman", 12), Brushes.Blue,x0 + tlx * float.Parse(txtx1.Text), y0 - tly * float.Parse(txty1.Text));
g.DrawString("B", new Font("Times New Roman", 12), Brushes.Blue,x0 + tlx * float.Parse(txtx2.Text), y0 - tly * float.Parse(txty2.Text));
g.DrawString("C", new Font("Times New Roman", 12), Brushes.Blue,x0 + tlx * float.Parse(txtx3.Text), y0 - tly * float.Parse(txty3.Text));
g.DrawString("D", new Font("Times New Roman", 12), Brushes.Blue,x0 + tlx * float.Parse(txtx4.Text), y0 - tly * float.Parse(txty4.Text));
x11 = x1 = float.Parse(txtx1.Text);
x12 = x2 = float.Parse(txtx2.Text);
x13 = x3 = float.Parse(txtx3.Text);
x14 = x4 = float.Parse(txtx4.Text);
y11 = y1 = float.Parse(txty1.Text);
y12 = y2 = float.Parse(txty2.Text);
Trang 21ghtrai = float.Parse(txtGioiHanTrai.Text);
ghphai = float.Parse(txtGioiHanPhai.Text);
ghtren = float.Parse(txtGioiHanTren.Text);
ghduoi = float.Parse(txtGioiHanDuoi.Text);
tlx = xmax / (ghtrai + ghphai);
tly = ymax / (ghtren + ghduoi);
Trang 22ghtrai = float.Parse(txtGioiHanTrai.Text);
ghphai = float.Parse(txtGioiHanPhai.Text);
ghtren = float.Parse(txtGioiHanTren.Text);
ghduoi = float.Parse(txtGioiHanDuoi.Text);
tlx = xmax / (ghtrai + ghphai);
tly = ymax / (ghtren + ghduoi);
Trang 23if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar)&&e.KeyChar!
=(Convert.ToChar("-"))&&e.KeyChar!=(Convert.ToChar(".")))
Trang 24private void txtx4_KeyPress(object sender, KeyPressEventArgs e)
Trang 26if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar !=(Convert.ToChar("-")) && e.KeyChar != (Convert.ToChar(".")))
if (MessageBox.Show("Bạn chẳHc chẳHn muốHn thoát?", "Thống báo",
MessageBoxButtons.OKCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1) ==
float CosAlpha, SinAlpha,rads;
rads = (float)Math.PI/180;
MessageBox.Show("Xin nhập tọa độ 2 điểMm", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
Trang 27g.DrawString("M'", new Font("Times New Roman", 12),
Brushes.Green, x0 + tlx * x1, y0 - tly * y1);
g.DrawString("N'", new Font("Times New Roman", 12),
Brushes.Green, x0 + tlx * (x1 + xT), y0 - tly * (y1 + yT));
g.DrawString("M'", new Font("Times New Roman", 12),
Brushes.Green, x0 + tlx * x1, y0 - tly * y1);
g.DrawString("N'", new Font("Times New Roman", 12),
Brushes.Green, x0 + tlx * (x1 + xT), y0 - tly * (y1 + yT));
g.DrawString("A'", new Font("Times New Roman", 12), Brushes.Red,x0 + tlx * (x1 + xT), y0 - tly * (y1 + yT));
g.DrawString("B'", new Font("Times New Roman", 12), Brushes.Red,x0 + tlx * (x2 + xT), y0 - tly * (y2 + yT));
g.DrawString("C'", new Font("Times New Roman", 12), Brushes.Red,x0 + tlx * (x3 + xT), y0 - tly * (y3 + yT));
g.DrawString("D'", new Font("Times New Roman", 12), Brushes.Red,x0 + tlx * (x4 + xT), y0 - tly * (y4 + yT));
g.DrawLine(Pens.Green, x0 + tlx * x1, y0 - tly * y1, x0 + tlx *(x1 + xT), y0 - tly * (y1 + yT));
g.DrawString("M'", new Font("Times New Roman", 12),
Brushes.Green, x0 + tlx * x1, y0 - tly * y1);
g.DrawString("N'", new Font("Times New Roman", 12),
Brushes.Green, x0 + tlx * (x1 + xT), y0 - tly * (y1 + yT));
MessageBox.Show("Xin nhập tọa độ và góc quay", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
Trang 28CosAlpha = (float)Math.Cos(rads * double.Parse(txtAlpha.Text));
SinAlpha = (float)Math.Sin(rads * double.Parse(txtAlpha.Text));
if (cbxHinhVe.Text == "Hình tròn")
{
xq1 = (CosAlpha * (x1 - float.Parse(txtxM.Text)) - SinAlpha * (y1
- float.Parse(txtyM.Text))) + float.Parse(txtxM.Text);
yq1 = (SinAlpha * (x1 - float.Parse(txtxM.Text)) + CosAlpha * (y1
- float.Parse(txtyM.Text))) + float.Parse(txtyM.Text);
VeHinhTron(Pens.Red, tlx * xq1, tly * yq1, tly * r);
g.DrawString("I'", new Font("Times New Roman", 12), Brushes.Red,x0 + tlx * xq1, y0 - tly * yq1);
g.DrawLine(Pens.Green, x0 + tlx * x1, y0 - tly * y1, x0 + tlx *
float.Parse(txtxM.Text), y0 - tly * float.Parse(txtyM.Text));
g.DrawLine(Pens.Green, x0 + tlx * xq1, y0 - tly * yq1, x0 + tlx *
float.Parse(txtxM.Text), y0 - tly * float.Parse(txtyM.Text));
g.DrawString(txtAlpha.Text + " độ", new Font("Times New Roman",14), Brushes.Red, x0 + tlx * float.Parse(txtxM.Text) - 20, y0 - tly *
float.Parse(txtyM.Text) - 20);
}
if (cbxHinhVe.Text == "Tam giác")
{
xq1 = (CosAlpha * (x1 - float.Parse(txtxM.Text)) - SinAlpha * (y1
- float.Parse(txtyM.Text))) + float.Parse(txtxM.Text);
yq1 = (SinAlpha * (x1 - float.Parse(txtxM.Text)) + CosAlpha * (y1
- float.Parse(txtyM.Text))) + float.Parse(txtyM.Text);
xq2 = (CosAlpha * (x2 - float.Parse(txtxM.Text)) - SinAlpha * (y2
- float.Parse(txtyM.Text))) + float.Parse(txtxM.Text);
yq2 = (SinAlpha * (x2 - float.Parse(txtxM.Text)) + CosAlpha * (y2
- float.Parse(txtyM.Text))) + float.Parse(txtyM.Text);
xq3 = (CosAlpha * (x3 - float.Parse(txtxM.Text)) - SinAlpha * (y3
- float.Parse(txtyM.Text))) + float.Parse(txtxM.Text);
yq3 = (SinAlpha * (x3 - float.Parse(txtxM.Text)) + CosAlpha * (y3
- float.Parse(txtyM.Text))) + float.Parse(txtyM.Text);
VeTamGiac(Pens.Red, tlx * xq1, tly * yq1, tlx * xq2, tly * yq2,tlx * xq3, tly * yq3);
g.DrawString("A'", new Font("Times New Roman", 12), Brushes.Red,x0 + tlx * xq1, y0 - tly * yq1);
g.DrawString("B'", new Font("Times New Roman", 12), Brushes.Red,x0 + tlx * xq2, y0 - tly * yq2);
g.DrawString("C'", new Font("Times New Roman", 12), Brushes.Red,x0 + tlx * xq3, y0 - tly * yq3);
g.DrawLine(Pens.Green, x0 + tlx * x1, y0 - tly * y1, x0 + tlx *
float.Parse(txtxM.Text), y0 - tly * float.Parse(txtyM.Text));
g.DrawLine(Pens.Green, x0 + tlx * xq1, y0 - tly * yq1, x0 + tlx *