Trường Đại Học Công Nghiệp Hà Nội Khoa Công Nghệ Thông TinBÀI TẬP LỚN Môn: Đồ họa máy tính Đề tài 8: Vẽ chữ L, dùng phím điều khiển di chuyển minh họa các phép tịnh tiến, đối xứng qua t
Trang 1Trường Đại Học Công Nghiệp Hà Nội Khoa Công Nghệ Thông Tin
BÀI TẬP LỚN
Môn: Đồ họa
máy tính
Đề tài 8: Vẽ chữ L, dùng phím điều khiển di chuyển minh họa các phép
tịnh tiến, đối xứng qua trái, qua phải và quay.
Giáo viên hướng dẫn: ThS.Nguyễn Thị Cẩm Ngoan
Sinh viên thực hiện:
1 Nguyễn Mạnh Thắng
2 Vũ Lương Bằng
3 Ngô Xuân Long
Trang 2Lời nói đầu
Đồ họa máy tính là một lĩnh vực của khoa học máy tính nghiên cứu về cơ sởtoán học, các thuật toán cũng như các kĩ thuật cho phép tạo, hiển thị và điều khiểnhình ảnh trên màn hình máy tính Đồ họa máy tính liên quan ít nhiều đến một sốlĩnh vực như đại số, hình học giải tích và hình học họa hình, quang học…… và kĩthuật máy tính và đặc biệt là chế tạo phần cứng ( các loại màn hình, các thiết bịnhập xuất, các vi mạch đồ họa)
Nghiên cứu các phép biến đổi hình học trong không gian thực hai chiều làmột trong những nội dung quan trọng
Qua thời gian tìm hiểu nhóm chúng em đã được giao làm đề tài: Vẽ chữ L,dùng phím điều khiển di chuyển minh họa các phép tịnh tiến, đối xứng qua trái,qua phải và quay
Do quá trình tìm hiểu còn nhiều thiếu sót nên chương trình còn nhiều hạnchế, nhóm thực hiện rất mong nhận được ý kiến đóng góp từ phía cô giáo và cácbạn để phần mềm được hoàn thiện hơn
Hà Nội, ngày 28 tháng 2 năm 2013
Trang 3IV. Hướng giai quyết
Chương II: PHÂN TÍCH
I. Các giải thuật sinh thực thể cơ sở
1) Giả thuật trung điểm-Midpoint
2) Thuật toán MidPoint vẽ đường thẳng
II. Các phép biến hình cơ bản
1) Phép tịnh tiến
2) Phép quay
3) Đối xứng
CHƯƠNG III: CÀI ĐẶT CHƯƠNG TRÌNH
1. Giao diện chương trình
Trang 4CHƯƠNG I: KHẢO SÁT
I. Mục đích nghiên cứu
Tạo ra chữ L có thể dùng phím điều khiển di chuyển minh họa các phép tịnh tiến, đối xứng( Qua trái, qua phải, lên, xuống) và phép quay
II. Đối tượng nghiên cứu
Vẽ đường thẳng bằng thuật toán MidPoint, thuật toán dung phím điều khiển
di chuyển minh họa các phép tịnh tiến, đối xứng( qua trái, qua phải, lên, xuống), vàphép quay
III.Khảo sát
Qua khảo sát trên các máy tính sử dụng hệ điều hành Windows 7, 8 , trên Win XP thì chương trình đều sử dụng được, di chuyển bằng phím điều khiển minhhọa các phép tịnh tiến, đối xứng (qua trái, qua phải, lên, xuống), và phép quay chưa thực hiện được trong một số trường hợp
IV. Hướng giải quyết
Tìm thêm tài liệu và nghiên cứu them về phép quay
CHƯƠNG II: PHÂN TÍCH
Trang 5A
B
A
I. Các giải thuật sinh thực thể cơ sở
1) Giả thuật trung điểm-Midpoint
Jack Bresenham 1965 / Pitteway 1967, áp dụng cho việc sinh các đường thẳng và đường tròn 1985
Xét trung điểm của đoạn AB (M)
Nếu M ở trên đoạn thẳng AB thì chọn B còn M ở dưới đoạn thẳng AB chọn A Công thức đơn giản hơn, tạo được các điểm tương tự như với Bresenham
d = f(x + 1, y + 1/2) là trung điểm của đoạn AB
Mô tả giải thuật Midpoint
So sánh hay kiểm tra M sẽđược thay bằng việc xét giá trị d
- d > 0 điểm B được chọn khi đó yi+1 = yi
- nếu d < 0 điểm A được chọn khi đó yi+1 = yi + 1
Trường hợp d = 0 chúng ta có thể chọn điểm bất kỳ hoặc A, hoặc B Sử dụngphương pháp biểu diễn không tường minh
f(x,y)= ax +by +c =0 (1)dx =x2 –x1 dy =y2 –y1
Biểu diễn tường minh:
Trang 6y= (dy/dx)x +B hay
f(x,y)=0= xdy - ydx +Bdx (2)
So sánh (1) và (2)
a=dyb=-dx c= Bdx
Có f(x,y)=0 với mọi (x,y) thuộc đường thẳng
Đặt d =f(xi +1,yi +1/2) = a(xi +1) +b(yi +1/2) +c
+ Nếu chọn A (d<0) thì M sẽ tăng theo 2 hướng x,y
d =f(xi +2,yi +3/2) = a(xi+2) +b(yi +3/2) +c
di+1 – di = a+b
Hay di+1 = di + dy - dx
+ Nếu chọn B (d>0) thì M sẽ tăng theo x
di+1 =f(xi +2,yi +1/2) = a(xi +2) +b(yi +1/2) +c
di+1 - di = a
Hay di+1 = di + dy
Tính d1 ?
d1 = f(x1 +1,y1 +1/2) = a(x1 +1) +b(y1 +1/2) +c
= ax1 +by1 +c +a +1/2 b = f(x1 ,y1 ) +a +b/2
Có (x1 ,y1 ) là điểm bắt đầu, nằm trên đoạn thẳng nên f(x1 ,y1 ) = 0
Trang 7Vậy d1 = a+ b/2 = dy - dx/2
2) Thuật toán MidPoint vẽ đường thẳng:
void MidPoint(int x1,int y1,int x2,int y2,int color)
putpixel(x+1,y+1,color);
y++;
P+=dy-dx;
Trang 8} else {
putpixel(x+1,y,color);
P+=dy;
} x++;
putpixel(x+1,y+1,color);
x++;
P+=dx-dy;
Trang 9} else {
putpixel(x,y+1,color);
P+=dx;
} y++;
}
}
putpixel(x2,y2,color);
}
II. Các phép biến hình cơ bản
Bản chất của các phép biến đổi hình học là sự thay đổi các mô tả về tọa độcủa đối tượng từ đó làm đối tượng thay đổi về hướng, kích thước cũng như hìnhdạng
1) Phép tịnh tiến
Để tịnh tiến một điểm P(x,y) từ vị trí này sang vị trí khác trong mặt phẳng, ta cộngthem các giá trị mô tả độ dời vào các tọa độ của P Nếu gọi trx và try lần lượt là độdời theo trục hoành và trục tung thì tọa độ của điểm mới Q(x’,y’) sẽ là:
X’=x+trx
Trang 10(trx,try) còn được gọi là vector tịnh tiến hay vector độ dời
Chúng ta có thể dịch chuyển toàn bộ một đối tượng bằng cách áp dụng quy tắc trêncho mọi điểm thuộc đối tượng Để tịnh tiến một đoạn thẳng, đơn giản chỉ cần tịnhtiến hai điểm đầu và cuối của nó rồi sau đó vẽ lại đoạn thẳng nối hai điểm mới Với
đa giác, ta tịnh tiến các đỉnh của nó sau đó vẽ lại đa giác với các đỉnh mới Mộtcách tương tự, để tịnh tiến các đối tượng như đường tròng, ellipse, ta tịnh tiến tâmcủa chúng tới vị trí mới rồi vẽ lại
(b)
Phép tịnh tiến một điểm (a) và đối tượng với vectortinhj tiến(b)
Biểu diễn phép tịnh tiến dưới dạng tọa độ thuần nhất:
Trang 11Phép quay làm thay đổi hướng của đố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 được quy ước là chiều ngược kim đồng
hồ Ta có công thức biến đổi của phép quay điểm P(x,y) quanh gốc tọa độ một góc α:
X’= cosα.x – sinα.y
Y’=sinα.x + cosα.y
Phép quay một đối tượng quanh gốc tọa độ một góc 60°
Biểu diễn phép quay dưới dạng tọa độ thuần nhất
Trang 12Mrfy= 0 1 0
0 0 1
CHƯƠNG III: CÀI ĐẶT CHƯƠNG TRÌNH
1. Giao diện chương trình:
Các thuật toán, các phép biến hình được Demo thành chương trình bằng ngôn
ngữ C++ Đầu tiên chương trình sẽ xuất hiện
Với hệ trục tọa độ oxy đầu tiên dể bao quát chương trình
Trang 13Đây là giao diện vẽ chữ L bằng thuật toán MidPoint
Thuật toán cài đặt vẽ chữ L:
#define radian 10 // he so doi tu do sang radian
void MidPoint(int x1,int y1,int x2,int y2,int color)
while (x<x2) {
Trang 14if (P>=0) {
putpixel(x+1,y+1,color);
y++;
P+=dy-dx;
} else {
putpixel(x+1,y,color);
P+=dy;
} x++;
} } else
{ float P=dx/2-dy;
while (y<=y2) {
if (P>=0) {
putpixel(x+1,y+1,color);
x++;
P+=dx-dy;
} else {
putpixel(x,y+1,color);
P+=dx;
} y++;
} } putpixel(x2,y2,color);
}
void buocnhay(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,int x5,int y5,intx6,int y6)
Trang 16Di chuyển chữ L sang bên tráiDi chuyển chữ L sang bên phải.
Di chuyển chữ L lên trên
Di chuyển chữ L xuống dưới
Trang 17Thuật toán cài đặt bắt phím:
case 75 : x1-=10; x2-=10; x3-=10; x4-=10; x5-=10; x6-=10; break;
case 77 : x1+=10; x2+=10; x3+=10; x4+=10; x5+=10; x6+=10; break;
case 72 : y1-=10; y2-=10; y3-=10; y4-=10; y5-=10; y6-=10; break;
case 80 : y1+=10; y2+=10; y3+=10; y4+=10; y5+=10; y6+=10; break;
} vehinh(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6);
}while(c!=27);
}
Thuật toán quay góc:
void quaygoc(float x,float y,float goc)
float xa = x1 * cos(goc) - y1 * sin(goc);
float ya = x1 * sin(goc) + y1 * cos(goc);
Trang 18// Quay diem B
float xb = x2 * cos(goc) - y2 * sin(goc);
float yb = x2 * sin(goc) + y2 * cos(goc);
// Quay diem C
float xc = x3 * cos(goc) - y3 * sin(goc);
float yc = x3 * sin(goc) + y3 * cos(goc);
// Quay diem D
float xd = x4 * cos(goc) - y4 * sin(goc);
float yd = x4 * sin(goc) + y4 * cos(goc);
// Quay diem E
float xe = x5 * cos(goc) - y5 * sin(goc);
float ye = x5 * sin(goc) + y5 * cos(goc);
// Quay diem F
float xf = x6 * cos(goc) - y6 * sin(goc);
float yf = x6 * sin(goc) + y6 * cos(goc);
//Bài tap lon
//Ðe 8:Ve chu L, dùng phím dieu khien di chuyen minh hoa các phép tinh tien, doi xung qua trái, qua phai và quay
Trang 19void MidPoint(int x1,int y1,int x2,int y2,int color)
putpixel(x+1,y+1,color);
y++;
P+=dy-dx;
} else {
putpixel(x+1,y,color);
P+=dy;
} x++;
putpixel(x+1,y+1,color);
x++;
P+=dx-dy;
} else {
Trang 20P+=dx;
} y++;
vehinh(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6);
for (int i = 0; i < 7; i++)
{
// Quay diem A
Trang 21float xa = x1 * cos(goc) - y1 * sin(goc);
float ya = x1 * sin(goc) + y1 * cos(goc);
// Quay diem B
float xb = x2 * cos(goc) - y2 * sin(goc);
float yb = x2 * sin(goc) + y2 * cos(goc);
// Quay diem C
float xc = x3 * cos(goc) - y3 * sin(goc);
float yc = x3 * sin(goc) + y3 * cos(goc);
// Quay diem D
float xd = x4 * cos(goc) - y4 * sin(goc);
float yd = x4 * sin(goc) + y4 * cos(goc);
// Quay diem E
float xe = x5 * cos(goc) - y5 * sin(goc);
float ye = x5 * sin(goc) + y5 * cos(goc);
// Quay diem F
float xf = x6 * cos(goc) - y6 * sin(goc);
float yf = x6 * sin(goc) + y6 * cos(goc);
Trang 22case 75 : x1-=10; x2-=10; x3-=10; x4-=10; x5-=10; x6-=10; break;
case 77 : x1+=10; x2+=10; x3+=10; x4+=10; x5+=10; x6+=10; break;
case 72 : y1-=10; y2-=10; y3-=10; y4-=10; y5-=10; y6-=10; break;
case 80 : y1+=10; y2+=10; y3+=10; y4+=10; y5+=10; y6+=10; break;
} vehinh(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6);
Trang 23TỰ ĐÁNH GIÁ
Ưu điểm: -Dễ dàng sử dụng và nâng cấp
-Chiếm ít tài nguyên của máy
Khuyết điểm: -Còn thiếu một vài chức năng
Hướng phát triển:-Trao đổi, tìm kiếm thông tin trên mạng
KẾT LUẬN
Qua quá trình tìm hiểu và phân tích đề tài “Vẽ chữ L, dùng phím điều khiển
di chuyển minh họa các phép tịnh tiến, đối xứng qua trái, qua phải và quay ”chúng em đã hiểu được cách phân tích và thiết kế một phần mềm Tuy nhiên dokiến thức còn hạn hẹp nên chúng em chưa thể phân tích được sâu sắc hơn và đưa rađược một phần mềm hoàn chỉnh, nhưng em mong rằng qua đề tài này các bạn cóthể hiểu thêm về cách vẽ một đa giác thành chữ cái và cách dùng phím di chuyểnchữ cái trên chương trình