Xây dựng chương trình vẽ đồ họa hai chiều
Trang 1ĐẠI HỌC MỎ ĐỊA CHẤT KHOA CÔNG NGHỆ THÔNG TIN
Bài tập lớn môn học
Đồ Họa Máy Tính
Đề tài: Xây dựng chương trình vẽ đồ họa hai chiều
Ngô Thị Liên
Phạm Thị Ngân
Vũ Thị Thắm
Phạm Đức Thịnh
0921050120 0921050275 0921050065 0921050154
TS Nguyễn Quang Khánh
Mục Lục
Trang 2I Lời giới thiệu 3
II Nội dung báo cáo 4
1) Thông tin các thành viên trong nhóm 4
2) Bảng phân chia công việc 4
3) Chức năng được xây dựng trong chương trình 4
a) Chức năng trong chương trình 4
b) Lưu đồ thuật toán 5
4) Giới thiệu chức năng đặc biệt trong chương trình 6
5) Môi trường và ngôn ngữ đã sử dụng 6
6) Cài đặt chương trình 7
a) Giao diện của chương trình 7
b) Cài đặt chương trình 9
7) Danh sách thư viện và tài liệu tham khảo 20
Sự phát triển của khoa học, kĩ thuật, nghệ thuật, kinh doanh và công nghệ luôn luôn phụ thuộc vào khả năng truyền đạt thông tin của chúng ta, hoặc thông qua các bit dữ
Trang 3liệu lưu trữ trong microchip hoặc thông qua giao tiếp bằng tiếng nói Câu châm ngôn từ
xa xưa “một hình ảnh có giá trị hơn cả vạn lời" hay "trăm nghe không bằng một thấy" cho thấy ý nghĩa rất lớn của hình ảnh trong việc chuyển tải thông tin Hình ảnh bao giờ cũng được cảm nhận nhanh và dễ dàng hơn, đặc biệt là trong trường hợp bất đồng về ngôn ngữ Do đó không có gì ngạc nhiên khi mà ngay từ khi xuất hiện máy tính, các nhà nghiên cứu đã cố gắng sử dụng nó để phát sinh các ảnh trên màn hình Trong suốt gần 50 năm phát triển của máy tính, khả năng phát sinh hình ảnh bằng máy tính của chúng ta đã đạt tới mức mà bây giờ hầu như tất cả các máy tính đều có khả năng đồ họa.Đồ họa máy tính là một trong những lĩnh vực lí thú nhất và phát triển nhanh nhất của tin học Ngay từ khi xuất hiện, đồ họa máy tính đã có sức lôi cuốn mãnh liệt, cuốn hút rất nhiều người ở nhiều lĩnh vực khác nhau như khoa học, nghệ thuật, kinh doanh, quản lí, Tính hấp dẫn
và đa dạng của đồ họa máy tính có thể được minh họa rất trực quan thông qua việc khảo sát các ứng dụng của nó.
Ngày nay, đồ họa máy tính được sử dụng trong rất nhiều lĩnh vực khác nhau như công nghiệp, thương mại, quản lí, giáo dục, giải trí, … Số lượng các chương trình đồ họa ứng dụng thật khổng lồ và phát triển liên tục.Trong lĩnh vực công nghiệp,CAD(computer-aided design) đã được sử dụng hầu hết trong việc thiết kế các cao ốc, ô tô, máy bay, tàu thủy, tàu vũ trụ, máy tính,…Trong lĩnh vực giải trí,nghệ thuật, đồ họa máy tính giúp ta tạo ra các chương trình trò chơi,các kĩ xảo điện ảnh cho các nhà làm phim,hay ngay chính giao diện đồ họa đã làm nâng cao khả năng giao tiếp giữa người và máy tính.
Để có thể làm được những ứng dụng đồ họa hữu ích cho cuộc sống,trước hết chúng ta cần phải có một nền tảng vững chắc về lập trình đồ họa.Có rất nhiều ngôn ngữ
hỗ trợ lập trình đồ họa máy tính,mỗi ngôn ngữ được xây dưng trên những thư viện đồ họa riêng,có những thế mạnh riêng.Và khi nói về lập trình đồ họa,chúng ta không thể không nói đến ngôn ngữ lập trình C#,một ngôn ngữ rất mạnh trong lĩnh vực này.Với mục đích nghiên cứu,tìm hiểu và mang đến cho những ai muốn tìm hiều về lập trình đồ họa một tài liệu thiết thực,nhóm chúng em đã xây dựng chương trình vẽ đồ họa hai chiều Vì là lần thời gian làm bài tương đối ngắn, kiến thức còn hạn chế nên chúng em không tránh khỏi sai sót.Chúng em mong thầy xem xét và góp ý cho tài liệu này.Chúng em chân thành cảm ơn.
1) Thông tin các thành viên trong nhóm
Trang 43 Vũ Thị Thắm 0921050065 01649711431 Thamvt91@gmail.co
m
2) Bảng phân chia công việc
- Tìm hiểu thuật toán,ứng dụng vẽ các đối tượng đồ họa 2 chiều
2 Phạm Thị Ngân - Tìm hiểu thuật toán,ứng dụng vẽ các đối tượng đồ
họa 2 chiều
- Tester.
3 Vũ Thị Thắm - Tìm hiểu, xây dựng chức năng biến hình cho các đối
tượng đồ họa.
- Tổng hợp,viết tài liệu
4 Phạm Đức Thịnh - Tổng hợp, hoàn thiện các chức năng vẽ đồ họa cơ
sở.
- Bắt và xử lý sự kiện trên form.
- Xây dựng thư viện hình, cung cấp chức năng cho người dùng thao tác với thư viện hình.
- Gom nhóm và phân rã các đối tượng đồ họa.
3) Chức năng được xây dựng trong chương trình
a) Chức năng trong chương trình
- Cho người dùng tự vẽ các đối tượng đồ họa hai chiều trên giao diện của chương trình:
o Vẽ đối tượng đường thẳng, đường gấp khúc.
o Vẽ đối tượng đường tròn, eclipse, cung tròn.
o Vẽ hình chữ nhật, hình đa giác.
- Cho phép người dùng thay đổi các thuộc tính của đối tượng:
o Đổi đường viền, màu viền.
o Tăng độ rộng của kích thước đường viền.
o Cho phép người dùng tô màu những hình có đường khép kín (hình tròn,
đa giác, eclipse).
Trang 5- Cho phép người dùng lưu trữ bản vẽ dạng bitmap, mở đối tượng bản vẽ định dạng bitmap.
- Cho phép người dùng sử dụng thư viện hình có sẵn trong chương trình, ngoài ra còn có thể thêm các đối tượng vào thư viện hình.
- Có các chức năng biến hình cho các đối tượng đồ họa
o Phép tịnh tiến đối tượng đồ họa
o Phép thay đổi tỷ lệ của đối tượng đồ họa.
o Phép quay đối tượng theo tâm 0 hoặc theo tâm bất kỳ.
o Phép biến dạng hình theo trục x, trục y.
b) Lưu đồ thuật toán
- Thuật toán Bresenham để vẽ đường thẳng
- Thuật toán MidPoint để vẽ đường tròn
Trang 64) Giới thiệu chức năng đặc biệt trong chương trình
- Cho phép người dùng tạo một đối tượng đồ họa bất kỳ từ các đối tượng cơ sở sau
đó lưu vào thư viện hình của chương trình.
- Tạo các thư viện hình có sẵn các đối tượng (hình sao, mũi tên,…).
- Cho phép người dùng sử dụng các đối tượng có sẵn trong thư viện.
- Cho phép chọn các thuộc tính của bút vẽ (độ rộng của bút, kiểu đường viền của bút vẽ, màu của bút vẽ,…).
- Lưu các đối tượng đã vẽ,mở các đối tượng đồ họa có sẵn.
- Khi vẽ các đối tượng đồ họa,cho phép xem lại các đối tượng cơ sở đã vẽ, có thể xóa các đối tượng bất kỳ trong đó.
5) Môi trường và ngôn ngữ đã sử dụng
- Sử dụng môi trường visual studio 2010 để xây dựng chương trình.
- Sử dụng ngôn ngữ lập trình C#.
Trang 76) Cài đặt chương trình
a) Giao diện của chương trình
- Giao diện chính của chương trình:
- Giao diện kết quả khi vẽ đối tượng đường thẳng,đường gấp khúc
- Giao diện kết quả khi vẽ đường cong, đường tròn, ellipse
Trang 8- Giao diện khi vẽ đa giác
- Giao diện khi gom nhóm các đối tượng, tạo thành hình phức hợp, lưu vào thư viện đối tượng của chương trình
Trang 9b) Cài đặt chương trình
b.1 Cài đặt thuật toán vẽ các đối tượng đồ họa 2 chiều
b.1.1 Đối tượng đường thẳng
class DrawLine : DrawObject
{
public DrawLine(Point _start)
{
point.Add(_start);
point.Add(_start);
}
public DrawLine(Point _start, Point _end)
{
point.Add(_start);
point.Add(_end);
}
public override void Update(Point p, Graphics g, Bitmap d) {
point[1] = p;
s.X = Math.Min(point[0].X, point[1].X);
s.Y = Math.Min(point[0].Y, point[1].Y);
e.X = Math.Max(point[0].X, point[1].X);
e.Y = Math.Max(point[0].Y, point[1].Y);
Bitmap drawArea = (Bitmap)d.Clone();
Draw(drawArea);
g.DrawImage(drawArea, new Point(0, 0));
}
public override void Draw(Bitmap drawArea)
{
Graphics g = Graphics.FromImage(drawArea);
g.DrawLine(pen, point[0], point[1]);
if (selected) Select(g);
}
//Thuat toan Bresenham: http://vi.wikipedia.org/wiki/Gi%E1%BA
%A3i_thu%E1%BA%ADt_Bresenham_v%E1%BA%BD_%C4%91o%E1%BA%A1n_th%E1%BA%B3ng public void Draw(Graphics g, Bitmap drawArea)
{
int x0 = point[0].X, y0 = point[0].Y;
int x1 = point[1].X, y1 = point[1].Y;
int dX = Math.Abs(x1 - x0);
int dY = Math.Abs(y1 - y0);
int sX, sY;
if (x0 < x1) sX = 1; else sX = -1;
if (y0 < y1) sY = 1; else sY = -1;
int err = dX - dY;
while (x0 != x1 || y0 != y1)
{
drawArea.SetPixel(x0, y0, pen.Color);
int e2 = 2 * err;
if (e2 > -dY)
Trang 10{
err -= dY;
x0 += sX;
}
if (e2 < dX)
{
err += dX;
y0 += sY;
}
}
}
}
b.1.2 Đối tượng hình tròn
class DrawCircle : DrawObject
{
private int r;
public DrawCircle(Point _o)
{
point.Add(_o);
r = 0;
}
public DrawCircle(Point _o, int _r)
{
point.Add(_o);
r = _r;
}
public override void Update(Point p, Graphics g, Bitmap d) {
int dX = p.X - point[0].X;
int dY = p.Y - point[0].Y;
r = (int)Math.Sqrt((double)(dX * dX + dY * dY));
s.X = point[0].X - r;
s.Y = point[0].Y - r;
e.X = point[0].X + r;
e.Y = point[0].Y + r;
Bitmap drawArea = (Bitmap)d.Clone();
Draw(drawArea);
g.DrawImage(drawArea, new Point(0, 0));
}
public override void Draw(Bitmap drawArea)
{
Graphics g = Graphics.FromImage(drawArea);
Rectangle rec = new Rectangle();
rec.X = point[0].X - r;
rec.Y = point[0].Y - r;
rec.Width = r * 2;
rec.Height = r * 2;
if (fill != Brushes.Transparent) g.FillEllipse(fill, rec); g.DrawEllipse(pen, rec);
if (selected) Select(g);
}
//Thuat toan MidPoint xem trong sach
Trang 11public void Draw(Graphics g, Bitmap drawArea)
{
int x = 0, y = r;
Put8Pixel(x, y, drawArea);
int p = 1 - r; //5/4 - r;
while (x < y)
{
if (p < 0) p += 2 * x + 3;
else
{
p += 2 * (x - y) + 5;
y ;
}
x++;
Put8Pixel(x, y, drawArea);
}
}
private void Put8Pixel(int x, int y, Bitmap drawArea) {
int oX = point[0].X, oY = point[0].Y;
drawArea.SetPixel(oX + x, oY + y, pen.Color);
drawArea.SetPixel(oX + y, oY + x, pen.Color);
drawArea.SetPixel(oX + y, oY - x, pen.Color);
drawArea.SetPixel(oX + x, oY - y, pen.Color);
drawArea.SetPixel(oX - x, oY - y, pen.Color);
drawArea.SetPixel(oX - y, oY - x, pen.Color);
drawArea.SetPixel(oX - y, oY + x, pen.Color);
drawArea.SetPixel(oX - x, oY + y, pen.Color);
}
}
b.1.3 Đối tượng vẽ Ellipse
class DrawEllipse : DrawObject
{
public DrawEllipse(Point _start)
{
point.Add(_start);
point.Add(_start);
}
public DrawEllipse(Point _start, Point _end)
{
point.Add(_start);
point.Add(_end);
}
public override void Update(Point p, Graphics g, Bitmap d) {
s = point[0];
e = point[1] = p;
Bitmap drawArea = (Bitmap)d.Clone();
Draw(drawArea);
g.DrawImage(drawArea, new Point(0, 0));
}
public override void Draw(Bitmap drawArea)
{
Trang 12Graphics g = Graphics.FromImage(drawArea);
Rectangle rec = new Rectangle();
rec.X = Math.Min(point[0].X, point[1].X);
rec.Y = Math.Min(point[0].Y, point[1].Y);
rec.Width = Math.Abs(point[0].X - point[1].X);
rec.Height = Math.Abs(point[0].Y - point[1].Y);
if (fill != Brushes.Transparent) g.FillEllipse(fill, rec); g.DrawEllipse(pen, rec);
if (selected) Select(g);
}
}
b.1.4 Đối tượng vẽ đa giác
class DrawPolygon : DrawObject
{
public DrawPolygon(Point _start)
{
point.Add(_start);
point.Add(_start);
s = e = _start;
}
public DrawPolygon(List<Point> _p)
{
point = _p;
s = e = _p[0];
for (int i = 1; i < _p.Count; i++)
{
if (_p[i].X < s.X) s.X = _p[i].X;
if (_p[i].Y < s.Y) s.Y = _p[i].Y;
if (_p[i].X > e.X) e.X = _p[i].X;
if (_p[i].Y > e.Y) e.Y = _p[i].Y;
}
}
public void AddPoint(Point _point)
{
point[point.Count - 1] = _point;
point.Add(_point);
if (_point.X < s.X) s.X = _point.X;
if (_point.Y < s.Y) s.Y = _point.Y;
if (_point.X > e.X) e.X = _point.X;
if (_point.Y > e.Y) e.Y = _point.Y;
}
public override void Update(Point p, Graphics g, Bitmap d) {
point[point.Count - 1] = p;
Bitmap drawArea = (Bitmap)d.Clone();
Draw(drawArea);
g.DrawImage(drawArea, new Point(0, 0));
}
public override void Draw(Bitmap drawArea)
{
Graphics g = Graphics.FromImage(drawArea);
Trang 13if (fill != Brushes.Transparent) g.FillPolygon(fill,
point.ToArray());
g.DrawPolygon(pen, point.ToArray());
if (selected) Select(g);
}
}
b.2 Code chức năng cho phép kéo thả để vẽ các đối tượng
Khi bắt đầu vào chương trình, bắt đầu chọn các đối tượng muốn sử dụng (đường thẳng, đường gấp khúc,đường tròn,đường elipse, đa giác,…) trên menu chính của chương trình.
Khung vẽ đối tượng là một picturebox, thao tác vẽ các đối tượng trên khung này Bắt đầu lấy tọa độ đầu của các đối tượng:
private void SelectTool(Tool select)
{
btnLine.CheckState = CheckState.Unchecked;
btnRectangle.CheckState = CheckState.Unchecked;
btnBLine.CheckState = CheckState.Unchecked;
btnPolygon.CheckState = CheckState.Unchecked;
btnCircle.CheckState = CheckState.Unchecked;
btnArc.CheckState = CheckState.Unchecked;
btnEllipse.CheckState = CheckState.Unchecked;
if (tool != select)
{
tool = select;
pnlDraw.Cursor = Cursors.Cross;
}
else
{
tool = Tool.None;
pnlDraw.Cursor = Cursors.Default;
}
switch (tool)
{
case Tool.Line:
btnLine.CheckState = CheckState.Checked;
break;
case Tool.Rectangle:
btnRectangle.CheckState = CheckState.Checked;
break;
case Tool.BLine:
btnBLine.CheckState = CheckState.Checked;
break;
case Tool.Polygon:
btnPolygon.CheckState = CheckState.Checked;
break;
case Tool.Circle:
btnCircle.CheckState = CheckState.Checked;
break;
Trang 14case Tool.Arc:
btnArc.CheckState = CheckState.Checked;
break;
case Tool.Ellipse:
btnEllipse.CheckState = CheckState.Checked;
break;
}
}
else
{
DrawBLine curBLine = (DrawBLine)objectList.Last(); curBLine.AddPoint(e.Location);
}
}
else if (drawing)
{
DrawBLine curBLine = (DrawBLine)objectList.Last();
curBLine.point.RemoveAt(curBLine.point.Count - 1);
Graphics g = pnlDraw.CreateGraphics();
curBLine.Update(curBLine.point.Last(), g, drawArea); DoneDraw("BLine");
drawing = false;
}
break;
case Tool.Polygon:
//Chọn tạo độ ban đầSu đểU Vẽ đa giác
if (e.Button == MouseButtons.Left)
{
if (!drawing)
{
objectList.Add(new DrawPolygon(e.Location));
drawing = true;
}
else
{
DrawPolygon curPolygon =
(DrawPolygon)objectList.Last();
curPolygon.AddPoint(e.Location);
}
}
else if (drawing)
{
DrawPolygon curPolygon = (DrawPolygon)objectList.Last(); curPolygon.point.RemoveAt(curPolygon.point.Count - 1); Graphics g = pnlDraw.CreateGraphics();
curPolygon.Update(curPolygon.point.Last(), g, drawArea); DoneDraw("Polygon");
drawing = false;
}
break;
case Tool.Circle:
//Chọn tạo độ ban đầSu đểU Vẽ dg tròn
if (!drawing) objectList.Add(new DrawCircle(e.Location)); else DoneDraw("Circle");