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 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 cho thực 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 : Lớp Khoa học máy tính 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 I Các hàm đồ họa C# .4 II Các phép biến đổi hình học .4 Phép tịnh tiến: Phép quay Phép đối xứng Chương II Thiết kế cài đặt chương trình .9 I Thiết kế chương trình Form II Cài đặt chương trình 17 Chương III: Tổng kết 40 Lớp Khoa học máy tính 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 Lời nói đầu Có câu “một hình ảnh nghìn lời nói ” Điều thật khơng thể phủ nhận Và rõ ràng hiển thị thông tin với ký hiệu, chữ cái, chữ số không khơng thể hấp dẫn dễ hiểu có thêm biểu diễn đồ họa Kỹ thuật đồ hoạ công cụ thiếu 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 thể, thông tin thiên văn địa lý, hình ảnh minh hoạ ) Chính vậy, đồ họa vấn đề quan tâm ngành công nghệ thông tin Cùng với phát triển tin học, kỹ thuật đồ họa máy vi tính, ngày trở nên tinh xảo Giao diện phần mềm ngày trở nên thân thiện, đẹp mắt nhờ thể đồ họa Sự hổ trợ tin học cho ngành khác trở nên đắc lực nhờ khả đồ họa vi tính, có ngành giáo dục Mục tiêu để tài chúng em làm xây dựng chương trình trợ giúp em học sinh Trung học sở học phép biến đổi hình học sở Tuy nhiên,trong trình nghiên cứu không tránh khỏi hạn chế thiếu sót, nên mong bảo, góp ý quý Thầy Cô bạn bè Chúng em 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 Lớp Khoa học máy tính 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 Chương I Giới thiệu hàm đồ họa C# phép biến đổi hình học I Các hàm đồ họa 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 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 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ó 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 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 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 DrawPolygon bằng cọ vẽ brusII.2.Các phép biến đổi không gian hai chiều: II Các phép biến đổi hình học Phép tịnh tiến: - Là phép biến đổi dùng để chuyển đối tượng từ vị trí sang vị trí khác theo vectơ cho trước Lớp Khoa học máy tính 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 Tịnh tiến Ví dụ hình minh họa trên, tịnh tiến đối tượng đồ họa tương tự điểm Với công thức biến đổi: { Tương x '= x + dx y '= y + dy ứng ma trận biến 0 0 dx dy đổi: r Trong đó: M ' ( x ', y ') ảnh 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ự 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 Phép quay - Phép quay làm thay đổi hướng đối tượng Một phép quay địi hỏi phải có tâm quay, góc quay Góc quay dương thường qui ước chiếu ngược chiều kim đồng hồ Lớp Khoa học máy tính 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 Ta có cơng thức biến đổi phép quay điểm P(x,y) quanh gốc tọa độ góc θ: { x' = x.cosθ - y.sinθ y' = x.sinθ + y.cosθ Ma trận biến đổi: cosθ − sin θ sin θ cos θ 0 0 1 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ự 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 Phép đối xứng - Phép đối xứng trục xem phép quay quanh trục tâm đối xứng góc 1800 + Đối xứng qua tâm: Hình 3: Phép đối xứng qua tâm x' = 2.xM − x y ' = yM − y Công thức biến đổi: Lớp Khoa học máy tính 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 − 0 Ma trận biến đổi tương ứng là: − − 0 1 + Phép đối xứng qua đường thẳng song song với Ox: Hình Phép đối xứng qua đường thẳng song song với Ox x' = x y ' = yM − y Công thức biến đổi: 1 0 Ma trận biến đổi tương ứng: 0 − 0 0 + Phép đối xứng qua đường thẳng song song với Oy: Hình Phép đối xứng qua đường thẳng song song với Oy Lớp Khoa học máy tính 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 x' = 2.xM − x y' = y Công thức biến đổi: − 0 Ma trận biến đổi tương ứng: 0 0 1 Lớp Khoa học máy tính 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 Chương II Thiết kế cài đặt chương trình I Thiết kế chương trình Form • Các chức 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 hình trịn tọa độ tâm, bán kính 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, * r, * r); g.DrawRectangle(p, new Rectangle(new Point(Convert.ToInt32(x0+x), Convert.ToInt32(y0-y)), new Size(1, 1))); } Lớp Khoa học máy tính 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 hình tam giác tọa độ đỉnh tam giác 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 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); 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); y13 = y3 = float.Parse(txty3.Text); y14 = y4 = float.Parse(txty4.Text); btnVe.Enabled = false; cbxHinhVe.Enabled = false; } } } } 21 Lớp Khoa học máy tính 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(); txtxB.ResetText(); txtyB.ResetText(); txtxM.ResetText(); txtyM.ResetText(); txtAlpha.ResetText(); txtx.ResetText(); txty.ResetText(); btnVeTruc.Enabled = true; btnVe.Enabled = true; cbxHinhVe.Enabled = true; lbThongBao.Visible = false; } 22 Lớp Khoa học máy tính 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 btnNhapLai_Click(object sender, EventArgs e) { g.Clear(Color.White); 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(); btnVeTruc.Enabled = false; 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 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 btnVeTruc.Enabled = false; } catch(Exception) { MessageBox.Show("Chưa nhập giới hạn trục tọa độ","Error",MessageBoxButtons.OK,MessageBoxIcon.Error); txtGioiHanTrai.Focus(); } } private void txtGioiHanTrai_TextChanged(object sender, EventArgs e) { txtGioiHanPhai.Text = txtGioiHanTrai.Text; txtGioiHanTren.Text = txtGioiHanTrai.Text; txtGioiHanDuoi.Text = txtGioiHanTrai.Text; } private void txtGioiHanPhai_TextChanged(object sender, EventArgs e) { txtGioiHanTrai.Text = txtGioiHanPhai.Text; txtGioiHanTren.Text = txtGioiHanPhai.Text; txtGioiHanDuoi.Text = txtGioiHanPhai.Text; } private void txtGioiHanTren_TextChanged(object sender, EventArgs e) { txtGioiHanDuoi.Text = txtGioiHanTren.Text; txtGioiHanTrai.Text = txtGioiHanTren.Text; txtGioiHanPhai.Text = txtGioiHanTren.Text; } private void txtGioiHanDuoi_TextChanged(object sender, EventArgs e) { txtGioiHanTren.Text = txtGioiHanDuoi.Text; 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 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("."))) e.Handled = true; } private void txty1_KeyPress(object sender, KeyPressEventArgs e) { if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != (Convert.ToChar("-")) && e.KeyChar != (Convert.ToChar("."))) e.Handled = true; } private void txtx2_KeyPress(object sender, KeyPressEventArgs e) { if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != (Convert.ToChar("-")) && e.KeyChar != (Convert.ToChar("."))) e.Handled = true; } private void txty2_KeyPress(object sender, KeyPressEventArgs e) { if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != (Convert.ToChar("-")) && e.KeyChar != (Convert.ToChar("."))) e.Handled = true; } private void txtx3_KeyPress(object sender, KeyPressEventArgs e) { 25 Lớp Khoa học máy tính 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 (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != (Convert.ToChar("-")) && e.KeyChar != (Convert.ToChar("."))) e.Handled = true; } private void txty3_KeyPress(object sender, KeyPressEventArgs e) { if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != (Convert.ToChar("-")) && e.KeyChar != (Convert.ToChar("."))) e.Handled = true; } private void txtx4_KeyPress(object sender, KeyPressEventArgs e) { if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != (Convert.ToChar("-")) && e.KeyChar != (Convert.ToChar("."))) e.Handled = true; } private void txty4_KeyPress(object sender, KeyPressEventArgs e) { if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != (Convert.ToChar("-")) && e.KeyChar != (Convert.ToChar("."))) e.Handled = true; } private void txtR_KeyPress(object sender, KeyPressEventArgs e) { if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != (Convert.ToChar("."))) e.Handled = true; } private void rbtnTinhTien_CheckedChanged(object sender, EventArgs e) { if (rbtnTinhTien.Checked) { txtxA.Enabled = true; txtyA.Enabled = true; txtxB.Enabled = true; txtyB.Enabled = true; txtxM.Enabled = false; txtyM.Enabled = false; txtAlpha.Enabled = false; cbxDoiXung.Enabled = false; 26 Lớp Khoa học máy tính 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 txtx.Enabled = false; txty.Enabled = false; } } private void rbtnPhepQuay_CheckedChanged(object sender, EventArgs e) { if (rbtnPhepQuay.Checked) { txtxA.Enabled = false; txtyA.Enabled = false; txtxB.Enabled = false; txtyB.Enabled = false; txtxM.Enabled = true; txtyM.Enabled = true; txtAlpha.Enabled = true; cbxDoiXung.Enabled = false; txtx.Enabled = false; txty.Enabled = false; } } private void rbtnDoiXung_CheckedChanged(object sender, EventArgs e) { txtxA.Enabled = false; txtyA.Enabled = false; txtxB.Enabled = false; txtyB.Enabled = false; txtxM.Enabled = false; txtyM.Enabled = false; txtAlpha.Enabled = false; cbxDoiXung.Enabled = true; txtx.Enabled = true; txty.Enabled = true; } private void rbtnBienDang_CheckedChanged(object sender, EventArgs e) { txtxA.Enabled = false; 27 Lớp Khoa học máy tính 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 txtyA.Enabled = false; txtxB.Enabled = false; txtyB.Enabled = false; txtxM.Enabled = false; txtyM.Enabled = false; txtAlpha.Enabled = false; cbxDoiXung.Enabled = false; ; txtx.Enabled = false; txty.Enabled = false; } private void txtxA_KeyPress(object sender, KeyPressEventArgs e) { if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != (Convert.ToChar("-")) && e.KeyChar != (Convert.ToChar("."))) e.Handled = true; } private void txtyA_KeyPress(object sender, KeyPressEventArgs e) { if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != (Convert.ToChar("-")) && e.KeyChar != (Convert.ToChar("."))) e.Handled = true; } private void txtxB_KeyPress(object sender, KeyPressEventArgs e) { if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != (Convert.ToChar("-")) && e.KeyChar != (Convert.ToChar("."))) e.Handled = true; } private void txtyB_KeyPress(object sender, KeyPressEventArgs e) { if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != (Convert.ToChar("-")) && e.KeyChar != (Convert.ToChar("."))) e.Handled = true; } private void txtxM_KeyPress(object sender, KeyPressEventArgs e) { if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != (Convert.ToChar("-")) && e.KeyChar != (Convert.ToChar("."))) 28 Lớp Khoa học máy tính 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 txtyM_KeyPress(object sender, KeyPressEventArgs e) { if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != (Convert.ToChar("-")) && e.KeyChar != (Convert.ToChar("."))) e.Handled = true; } private void txtAlpha_KeyPress(object sender, KeyPressEventArgs e) { if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != (Convert.ToChar("-"))) e.Handled = true; } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (MessageBox.Show("Bạn chắn muốn thốt?", "Thơng báo", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1) == DialogResult.Cancel) { e.Cancel = true; } } private void btnThoat_Click(object sender, EventArgs e) { Application.Exit(); } private void btnThucHien_Click(object sender, EventArgs e) { float xT, yT,xq1,xq2,xq3,xq4,yq1,yq2,yq3,yq4; float CosAlpha, SinAlpha,rads; rads = (float)Math.PI/180; if (rbtnTinhTien.Checked) { if (txtxA.Text == "" || txtyA.Text == "" || txtxB.Text == "" || txtyB.Text == "") { MessageBox.Show("Xin nhập tọa độ điểm", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } else { xT = float.Parse(txtxB.Text) - float.Parse(txtxA.Text); yT = float.Parse(txtyB.Text) - float.Parse(txtyA.Text); 29 Lớp Khoa học máy tính 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 g.DrawLine(Pens.Red, x0 + tlx * float.Parse(txtxA.Text), y0 - tly * float.Parse(txtyA.Text), x0 + tlx * float.Parse(txtxB.Text), y0 - tly * float.Parse(txtyB.Text)); g.DrawString("M", new Font("Times New Roman", 12), Brushes.Red, x0 + tlx * float.Parse(txtxA.Text), y0 - tly * float.Parse(txtyA.Text)); g.DrawString("N", new Font("Times New Roman", 12), Brushes.Red, x0 + tlx * float.Parse(txtxB.Text), y0 - tly * float.Parse(txtyB.Text)); if (cbxHinhVe.Text == "Hình trịn") { VeHinhTron(Pens.Red, tlx * (x1 + xT), tly * (y1 + yT), tly * float.Parse(txtR.Text)); g.DrawString("I'", new Font("Times New Roman", 12), Brushes.Red, x0 + tlx * (x1 + xT) + 20, y0 - tly * (y1 + yT) 20); 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)); } if (cbxHinhVe.Text == "Tam giác") { VeTamGiac(Pens.Red, tlx * (x1 + xT), tly * (y1 + yT), tlx * (x2 + xT), tly * (y2 + yT), tlx * (x3 + xT), tly * (y3 + 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.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)); } if (cbxHinhVe.Text == "Tứ giác") { VeTuGiac(Pens.Red, tlx * (x1 + xT), tly * (y1 + yT), tlx * (x2 + xT), tly * (y2 + yT), tlx * (x3 + xT), tly * (y3 + yT), tlx * (x4 + xT), tly * (y4 + 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)); } } } if (rbtnPhepQuay.Checked) { if (txtxM.Text == "" || txtyM.Text == "" || txtAlpha.Text == "") 30 Lớp Khoa học máy tính 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 { MessageBox.Show("Xin nhập tọa độ góc quay", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } else { CosAlpha = (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)); 31 Lớp Khoa học máy tính 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 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 == "Tứ 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); xq4 = (CosAlpha * (x4 - float.Parse(txtxM.Text)) - SinAlpha * (y4 - float.Parse(txtyM.Text))) + float.Parse(txtxM.Text); yq4 = (SinAlpha * (x4 - float.Parse(txtxM.Text)) + CosAlpha * (y4 - float.Parse(txtyM.Text))) + float.Parse(txtyM.Text); VeTuGiac(Pens.Red, tlx * xq1, tly * yq1, tlx * xq2, tly * yq2, tlx * xq3, tly * yq3, tlx * xq4, tly * yq4); 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.DrawString("D'", new Font("Times New Roman", 12), Brushes.Red, x0 + tlx * xq4, y0 - tly * yq4); 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 (rbtnDoiXung.Checked) { if (cbxHinhVe.Text == "Hình trịn") { if (cbxDoiXung.Text == "Qua tâm bất kì") { 32 Lớp Khoa học máy tính 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 (txtx.Text == "" || txty.Text == "") { MessageBox.Show("Xin nhập tọa độ tâm đối xứng", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } else { g.DrawString("M(" + txtx.Text + "," + txty.Text + ")", new Font("Times New Roman", 12), Brushes.Green, x0 + tlx * float.Parse(txtx.Text), y0 - tly * float.Parse(txty.Text)); g.DrawRectangle(Pens.Green, new Rectangle(new Point(Convert.ToInt32(x0 + tlx * float.Parse(txtx.Text)), Convert.ToInt32(y0 - tly * float.Parse(txty.Text))), new Size(1, 1))); g.DrawString("I'", new Font("Times New Roman", 12), Brushes.Red, x0 + tlx * (2 * float.Parse(txtx.Text) - x1), y0 - tly * (2 * float.Parse(txty.Text) - y1)); VeHinhTron(Pens.Red, tlx * (2 * float.Parse(txtx.Text) - x1), tly * (2 * float.Parse(txty.Text) - y1), tly * float.Parse(txtR.Text)); } } if (cbxDoiXung.Text == "Qua đường thẳng song song với Ox") { if (txty.Text == "") { MessageBox.Show("Xin nhập tung độ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } else { g.DrawString("y = " + txty.Text, new Font("Times New Roman", 12), Brushes.Green, 10, y0 - tly * float.Parse(txty.Text)); g.DrawString("I'", new Font("Times New Roman", 12), Brushes.Red, x0 + tlx * x1, y0 - tly * (2 * float.Parse(txty.Text) - y1)); g.DrawLine(Pens.Green, 0, y0 - tly * float.Parse(txty.Text), xmax, y0 - tly * float.Parse(txty.Text)); VeHinhTron(Pens.Red, tlx * x1, tly * (2 * float.Parse(txty.Text) - y1), tly * float.Parse(txtR.Text)); } } if (cbxDoiXung.Text == "Qua đường thẳng song song với Oy") { if (txtx.Text == "") { MessageBox.Show("Xin nhập hoành độ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } else { g.DrawString("x = " + txtx.Text, new Font("Times New Roman", 12), Brushes.Green, x0 + tlx * float.Parse(txtx.Text) - 50, 10); 33 Lớp Khoa học máy tính 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 g.DrawString("I'", new Font("Times New Roman", 12), Brushes.Red, x0 + tlx * (2 * float.Parse(txtx.Text) - x1), y0 - tly * y1); g.DrawLine(Pens.Green, x0 + tlx * float.Parse(txtx.Text), 0, x0 + tlx * float.Parse(txtx.Text), ymax); VeHinhTron(Pens.Red, tlx * (2 * float.Parse(txtx.Text) - x1), tly * y1, tly * float.Parse(txtR.Text)); } } } if (cbxHinhVe.Text == "Tam giác") { if (cbxDoiXung.Text == "Qua tâm bất kì") { if (txtx.Text == "" || txty.Text == "") { MessageBox.Show("Xin nhập tọa độ tâm đối xứng", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } else { g.DrawString("M(" + txtx.Text + "," + txty.Text + ")", new Font("Times New Roman", 12), Brushes.Green, x0 + tlx * float.Parse(txtx.Text), y0 - tly * float.Parse(txty.Text)); g.DrawRectangle(Pens.Green, new Rectangle(new Point(Convert.ToInt32(x0 + tlx * float.Parse(txtx.Text)), Convert.ToInt32(y0 - tly * float.Parse(txty.Text))), new Size(1, 1))); VeTamGiac(Pens.Red, tlx * (2 * float.Parse(txtx.Text) - x1), tly * (2 * float.Parse(txty.Text) - y1), tlx * (2 * float.Parse(txtx.Text) - x2), tly * (2 * float.Parse(txty.Text) - y2), tlx * (2 * float.Parse(txtx.Text) - x3), tly * (2 * float.Parse(txty.Text) - y3)); g.DrawString("A'", new Font("Times New Roman", 12), Brushes.Red, x0 + tlx * (2 * float.Parse(txtx.Text) - x1), y0 - tly * (2 * float.Parse(txty.Text) - y1)); g.DrawString("B'", new Font("Times New Roman", 12), Brushes.Red, x0 + tlx * (2 * float.Parse(txtx.Text) - x2), y0 - tly * (2 * float.Parse(txty.Text) - y2)); g.DrawString("C'", new Font("Times New Roman", 12), Brushes.Red, x0 + tlx * (2 * float.Parse(txtx.Text) - x3), y0 - tly * (2 * float.Parse(txty.Text) - y3)); } } if (cbxDoiXung.Text == "Qua đường thẳng song song với Ox") { if (txty.Text == "") { MessageBox.Show("Xin nhập tung độ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } else { g.DrawString("y = " + txty.Text, new Font("Times New Roman", 12), Brushes.Green, 10, y0 - tly * float.Parse(txty.Text)); g.DrawLine(Pens.Green, 0, y0 - tly * float.Parse(txty.Text), xmax, y0 - tly * float.Parse(txty.Text)); 34 Lớp Khoa học máy tính 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 VeTamGiac(Pens.Red, tlx * x1, tly * (2 * float.Parse(txty.Text) - y1), tlx * x2, tly * (2 * float.Parse(txty.Text) - y2), tlx * x3, tly * (2 * float.Parse(txty.Text) - y3)); g.DrawString("A'", new Font("Times New Roman", 12), Brushes.Red, x0 + tlx * x1, y0 - tly * (2 * float.Parse(txty.Text) - y1)); g.DrawString("B'", new Font("Times New Roman", 12), Brushes.Red, x0 + tlx * x2, y0 - tly * (2 * float.Parse(txty.Text) - y2)); g.DrawString("C'", new Font("Times New Roman", 12), Brushes.Red, x0 + tlx * x3, y0 - tly * (2 * float.Parse(txty.Text) - y3)); } } if (cbxDoiXung.Text == "Qua đường thẳng song song với Oy") { if (txtx.Text == "") { MessageBox.Show("Xin nhập hoành độ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } else { g.DrawString("x = " + txtx.Text, new Font("Times New Roman", 12), Brushes.Green, x0 + tlx * float.Parse(txtx.Text) - 50, 10); g.DrawLine(Pens.Green, x0 + tlx * float.Parse(txtx.Text), 0, x0 + tlx * float.Parse(txtx.Text), ymax); VeTamGiac(Pens.Red, tlx * (2 * float.Parse(txtx.Text) - x1), tly * y1, tlx * (2 * float.Parse(txtx.Text) - x2), tly * y2, tlx * (2 * float.Parse(txtx.Text) - x3), tly * y3); g.DrawString("A'", new Font("Times New Roman", 12), Brushes.Red, x0 + tlx * (2 * float.Parse(txtx.Text) - x1), y0 - tly * y1); g.DrawString("B'", new Font("Times New Roman", 12), Brushes.Red, x0 + tlx * (2 * float.Parse(txtx.Text) - x2), y0 - tly * y2); g.DrawString("C'", new Font("Times New Roman", 12), Brushes.Red, x0 + tlx * (2 * float.Parse(txtx.Text) - x3), y0 - tly * y3); } } } if (cbxHinhVe.Text == "Tứ giác") { if (cbxDoiXung.Text == "Qua tâm bất kì") { if (txtx.Text == "" || txty.Text == "") { MessageBox.Show("Xin nhập tọa độ tâm đối xứng", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } else { 35 Lớp Khoa học máy tính k4 - Khoa CNTT - Trường ĐH Cơng nghiệp Hà Nội ... môn: Đồ họa máy tính + Phép đối xứng: Phép đối xứng có 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 sau nhập tọa độ tâm đối xứng nhấn thực 14 Lớp Khoa học máy... 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 nhấn thực 15 Lớp Khoa học máy tính... 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 hồnh độ vào nhấn nút thực 16 Lớp Khoa học máy tính