Bài tập lớn môn: Đồ họa máy tính
TRƯỜ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
1
Lớp Khoa học máy tính 3 k4 - Khoa CNTT - Trường ĐH Công nghiệp Hà Nội
Bài tập lớn môn: Đồ họa máy tính
MỤC LỤC
Lời nói đầu 3
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 4
1. Phép tịnh tiến: 4
2. Phép quay 5
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 40
2
Lớp Khoa học máy tính 3 k4 - Khoa CNTT - Trường ĐH Công nghiệp Hà Nội
Bài tập lớn môn: Đồ họa máy tính
-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.
-FillPolygon(Brush brush, Point[] dagiac ): hàm vẽ và tô màu một hình đa giác
như DrawPolygon bằng cọ vẽ brusII.2.Các phép biến đổi trong không gian hai chiều:
II. Các phép biến đổi hình học cơ bản.
1. Phép tịnh tiến:
- Là phép biến đổi dùng để chuyển đối tượng từ vị trí này sang vị trí khác theo
vectơ cho trước.
4
Lớp Khoa học máy tính 3 k4 - Khoa CNTT - Trường ĐH Công nghiệp Hà Nội
Bài tập lớn môn: Đồ họa máy tính
Hình 1. Tịnh tiến
Ví dụ như trong hình minh họa trên, tịnh tiến 1 đối tượng đồ họa cũng tương tự
như đối với 1 điểm.
Với công thức biến đổi:
{
'
'
x x dx
y y dy
= +
= +
Tương ứng là ma trận biến đổi:
{
x' = x.cos - y.sin
y' = x.sin + y.cos
θ θ
θ θ
Ma trận biến đổi:
os sin 0
sin cos 0
0 0 1
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.
3. Phép đối xứng
- Phép đối xứng trục có thể xem là phép quay quanh trục hoặc tâm đối xứng một
góc 180
0
.
+ Đối xứng qua tâm:
Hình 3: Phép đối xứng qua tâm bất kì
Công thức biến đổi:
Công thức biến đổi:
−=
=
yyMy
xx
.2'
'
Ma trận biến đổi tương ứng:
−
100
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
7
Lớp Khoa học máy tính 3 k4 - Khoa CNTT - Trường ĐH Công nghiệp Hà Nội
Bài tập lớn môn: Đồ họa máy tính
1. Form chính
• Các chức năng của chương trình:
- Vẽ hình:
+ Vẽ hình tròn:
Người dùng chọn vẽ hình tròn sau đó điền đầy đủ thông tin của hình tròn như
tọa độ tâm, bán kính rồi nhấn nút vẽ hình.
Hàm vẽ hình tròn:
void VeHinhTron(Pen p,float x, float y, float r)
{
g.DrawEllipse(p, x + x0 - r, y0 - y - r, 2 * r, 2 * r);
g.DrawRectangle(p, new Rectangle(new Point(Convert.ToInt32(x0+x), Convert.ToInt32(y0-y)), new Size(1, 1)));
}
9
Lớp Khoa học máy tính 3 k4 - Khoa CNTT - Trường ĐH Công nghiệp Hà Nội
Bài tập lớn môn: Đồ họa máy tính
+ 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);
}
10
Lớp Khoa học máy tính 3 k4 - Khoa CNTT - Trường ĐH Công nghiệp Hà Nội
Bài tập lớn môn: Đồ họa máy tính
+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
14
Lớp Khoa học máy tính 3 k4 - Khoa CNTT - Trường ĐH Công nghiệp Hà Nội
Bài tập lớn môn: Đồ họa máy tính
- 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.
15
Lớp Khoa học máy tính 3 k4 - Khoa CNTT - Trường ĐH Công nghiệp Hà Nội
Bài tập lớn môn: Đồ họa máy tính
- 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.
16
Lớp Khoa học máy tính 3 k4 - Khoa CNTT - Trường ĐH Công nghiệp Hà Nội
Bài tập lớn môn: Đồ họa máy tính
II. Cài đặt chương trình
CODE:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace BTL_DHMT
{
public partial class Form1 : Form
{
public Form1()
txtx2.Enabled = false;
txtx3.Enabled = false;
txtx4.Enabled = false;
txty2.Enabled = false;
txty3.Enabled = false;
txty4.Enabled = false;
txtR.Enabled = true;
lbThongBao.Text = "Nh p t a đ tâm và bán kính"ậ ọ ộ ;
}
if (cbxHinhVe.Text == "Tam giác")
{
txtx2.Enabled = true;
txty2.Enabled = true;
txtx3.Enabled = true;
txtx4.Enabled = false;
txty3.Enabled = true;
txty4.Enabled = false;
txtR.Enabled = false;
lbThongBao.Text = "Nh p t a đ 3 đ nh"ậ ọ ộ ỉ ;
}
if (cbxHinhVe.Text == "T giác"ứ )
{
txtx2.Enabled = true;
txty2.Enabled = true;
txtx3.Enabled = true;
txtx4.Enabled = true;
txty3.Enabled = true;
txty4.Enabled = true;
txtR.Enabled = false;
lbThongBao.Text = "Nh p t a đ 4 đ nh"ậ ọ ộ ỉ ;
void VeHinhTron(Pen p,float x, float y, float r)
{
g.DrawEllipse(p, x + x0 - r, y0 - y - r, 2 * r, 2 * r);
g.DrawRectangle(p, new Rectangle(new Point(Convert.ToInt32(x0+x), Convert.ToInt32(y0-y)), new Size(1, 1)));
}
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);
}
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);
}
private void btnVe_Click(object sender, EventArgs e)
{
if (txtGioiHanTrai.Text=="")
{
MessageBox.Show("Ch a v h t a đ "ư ẽ ệ ọ ộ , "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
txtGioiHanTrai.Focus();
19
Lớp Khoa học máy tính 3 k4 - Khoa CNTT - Trường ĐH Công nghiệp Hà Nội
Bài tập lớn môn: Đồ họa máy tính
}
if (cbxHinhVe.Text == "")
{
}
else
{
VeTamGiac(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));
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));
x11 = x1 = float.Parse(txtx1.Text);
20
Lớp Khoa học máy tính 3 k4 - Khoa CNTT - Trường ĐH Công nghiệp Hà Nội
Bài tập lớn môn: Đồ họa máy tính
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);
btnVe.Enabled = false;
cbxHinhVe.Enabled = false;
}
}
if (cbxHinhVe.Text == "T giác"ứ )
{
if (txtx1.Text == "" || txtx2.Text == "" || txty1.Text == "" || txty2.Text == "" || txtx3.Text == "" || txty3.Text == "" ||
txtx4.Text == "" || txty4.Text == "")
{
MessageBox.Show("D li u nh p vào ch a đ "ữ ệ ậ ư ủ , "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
Lớp Khoa học máy tính 3 k4 - Khoa CNTT - Trường ĐH Công nghiệp Hà Nội
Bài tập lớn môn: Đồ họa máy tính
private void btnReset_Click(object sender, EventArgs e)
{
txtx1.ResetText();
txtx2.ResetText();
txty1.ResetText();
txty2.ResetText();
txtGioiHanDuoi.ResetText();
txtGioiHanPhai.ResetText();
txtGioiHanTrai.ResetText();
txtGioiHanTrai.Focus();
txtGioiHanTren.ResetText();
txtR.ResetText();
txtx4.ResetText();
txtx3.ResetText();
txty4.ResetText();
txty3.ResetText();
g.Clear(Color.White);
txtx2.Enabled = true;
txty2.Enabled = true;
txtx3.Enabled = true;
txtx4.Enabled = true;
txty3.Enabled = true;
txty4.Enabled = true;
txtR.Enabled = true; ;
cbxHinhVe.ResetText();
cbxDoiXung.ResetText();
txtxA.ResetText();
txtyA.ResetText();
btnVe.Enabled = true;
cbxHinhVe.Enabled = true;
txtx1.ResetText();
txtx1.Focus();
txtx2.ResetText();
txty1.ResetText();
txty2.ResetText();
txtR.ResetText();
txtx4.ResetText();
txtx3.ResetText();
txty4.ResetText();
txty3.ResetText();
}
private void btnVeTruc_Click(object sender, EventArgs e)
{
try
{
xmax = pictureBox1.Width;
ymax = pictureBox1.Height;
ghtrai = 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);
x0 = tlx * ghtrai;
y0 = tly * ghtren;
VeTrucToaDo();
23
Lớp Khoa học máy tính 3 k4 - Khoa CNTT - Trường ĐH Công nghiệp Hà Nội
txtGioiHanTrai.Text = txtGioiHanDuoi.Text;
txtGioiHanPhai.Text = txtGioiHanDuoi.Text;
}
private void txtGioiHanTrai_KeyPress(object sender, KeyPressEventArgs e)
{
if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
e.Handled = true;
}
private void txtGioiHanPhai_KeyPress(object sender, KeyPressEventArgs e)
{
if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
24
Lớp Khoa học máy tính 3 k4 - Khoa CNTT - Trường ĐH Công nghiệp Hà Nội
Bài tập lớn môn: Đồ họa máy tính
e.Handled = true;
}
private void txtGioiHanTren_KeyPress(object sender, KeyPressEventArgs e)
{
if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
e.Handled = true;
}
private void txtGioiHanDuoi_KeyPress(object sender, KeyPressEventArgs e)
{
if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
e.Handled = true;
}
private void txtx1_KeyPress(object sender, KeyPressEventArgs e)
{
if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar)&&e.KeyChar!=(Convert.ToChar("-"))&&e.KeyChar!
=(Convert.ToChar(".")))