TRƯỜNG ĐẠI HỌC ĐIỆN LỰCKHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO CHUYÊN ĐỀ HỌC PHẦN MÔN ĐỒ HỌA MÁY TÍNH ĐỀ T I: THUẬT TOÁN VẼ ELIPSE-MIDPOINT Sinh viên thực hiện : TRẦN VĂN HO N NGUYỄN ĐẶNG TUẤN
Trang 1TRƯỜNG ĐẠI HỌC ĐIỆN LỰC
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO CHUYÊN ĐỀ HỌC PHẦN
MÔN ĐỒ HỌA MÁY TÍNH
ĐỀ T I: THUẬT TOÁN VẼ ELIPSE-MIDPOINT
Sinh viên thực hiện : TRẦN VĂN HO N
NGUYỄN ĐẶNG TUẤN MINH
Giảng viên hướng dẫn : NGÔ QUỐC TẠO
Hà Nội, tháng 4 năm 2023
1
Trang 2PHIẾU CHẤM ĐIỂM
Sinh viên thực hiện:
Trần Văn Hoàn
Masv: 20810320121
Nguyễn Đặng Tuấn
Minh
Masv: 20810320086
Giảng Viên Chấm:
Giảng viên 1:
Giảng viên 2:
Trang 3MỤC LỤC
LỜI NÓI ĐẦU……… 4
CHƯƠNG 1: GIỚI THIỆU VỀ ĐỒ HỌA MÁY TÍNH……….5
1.1 Lịch sử phát triển……….5
1.2 Khái niệm đồ họa máy tính……… 6
CHƯƠNG 2: THUẬT TOÁN VẼ ELIPSE-MIDPOINT………7
2.1 Đặt vấn đề……….7
2.2 Thuật toán Midpoint vẽ elipse……… 7
2.2.1 Thuật giải………7
2.2.2 Lưu đồ thuật toán……… 11
2.2.3 Code minh họa……… 12
KẾT LUẬN……… 16
DANH MỤC HÌNH ẢNH Hình 2.1: Hình elipse mẫu………7
Hình 2.2.1: Lựa chọn điểm trong thuật toán elipse……… 8
Hình 2.2.2: Lưu đồ thuật toán……… 11
3
Trang 4LỜI NÓI ĐẦU
Đồ họa máy tính là một trong những lĩnh vực hấp dẫn và phát triển nhanh lẹ, nó làm thay đổi hoàn toàn việc tương tác giữa người và máy Nhờ vào đồ họa máy tính mà một hoạt động các ứng dụng máy tính ra đời, đồ họa giúp cho việc giao tiếp với máy tính trở nên dễ dàng hơn, nó được ứng dụng trong nhiều lĩnh vực như khoa học công nghệ, y học, kiến trúc, giải trí…
Trên cơ sở đó, môn đồ họa máy tính đã được đưa vào giảng dạy ở chuyên ngành công nghệ thông tin và các lĩnh vực liên quan khác trong các trường đại học Môn này là tiền đề cung cấp cho sinh viên các lý thuyết cơ sở nhằm kiến tạo và xử lý thông tin dưới dạng hình ảnh giúp cho việc giao tiếp với máy tính dễ dàng hơn trong các môn ngành khác nhau như xử lý ảnh, kỹ thuật CAD
Chúng ta có thể vẽ ra những hình ảnh không chỉ là ảnh tĩnh mà còn có thể biến đổi thành những hình ảnh sinh động Do vậy qua thời gian tìm hiểu nhóm em quyết định chọn đề tài “ Thuật toán vẽ elipse-midpoint”
Trang 5CHƯƠNG 1: GIỚI THIỆU VỀ ĐỒ HỌA MÁY TÍNH
1.1 Lịch sử phát triển
- Graphics những năm 1950-1960:
+ Năm 1959 Thiết bị đồ hoạ đầu tiên là màn hình xuất hiện tại Đức
+ Năm 1960 - SAGE (Semi-Automatic Ground Environment System) xuất hiện bút sáng thao tác với màn hình
+ Năm 1960 William Fetter nhà khoa học người Mỹ, ông đang nghiên cứu xây dựng mô hình buồng lái máy bay cho hãng Boeing của Mỹ Ông đã dựa trên hình ảnh 3 chiều của mô hình ngườiphi công trong buồng lái của máy bay để xây dựng nên một mô hình tối ưu cho buồng lái máy bay Phương pháp này cho phép các nhà thiết kế quan sát một cách trực quan vị trí của người lái trong khoang Ông đặt tên cho phương pháp này là đồ hoạ máy tính (Computer Graphics)
+ Màn hình là thiết bị thông dụng nhất trong hệ đồ hoạ, các thao tác của hầu hết các màn hình đều dựa trên thiết kế ống tia âm cực CRT (Cathode ray tube) Khi đó giá để làm tươi màn hình là rất cao, máy tính xử lý chậm, đắt và không chắc chắn (không đáng tin cậy)
- Graphics: 1960-1970
+ Năm 1963 Ivan Sutherland (hội nghị Fall Joint Computer - lần đầu tiên có khả năng tạo mới, hiển thị và thay đổi được thực hiện trong thời gian thực trên màn CRT)
+ Hệ thống này được dùng để thiết kế mạch điện: CRT, LightPen (bút sáng), computer (chứa chương trình xử lý thông tin) Người sử dụng có thể vẽ mạch điện trực tiếp lên màn hình thông qua bút sáng
5
Trang 6- Graphics:1970-1980
+ Raster Graphics (đồ hoạ điểm) Bắt đầu chuẩn đồ hoạ ví dụ như: GKS(Graphics Kernel System): European effort (kết quả của châu âu), Becomes ISO 2D standard
- Graphics: 1980-1990
+ Mục đích đặc biệt về phần cứng, thiết bị hình học đồ hoạ Silicon Xuất hiện các chuẩn công nghiệp: PHIGS (Programmers Hierarchical Interactive Graphics Standard) xác định các phương pháp chuẩn cho các mô hình thời gian thực và lập trình hướng đối tượng
1.2 Khái niệm đồ họa máy tính
- Đồ họa máy tính là một ngành khoa học Tin học chuyên nghiên cứu về các phương pháp và kỹ thuật để có thể mô tả và thao tác trên các đối tượng của thế giới thực bằng máy tính
- Về bản chất: đó là một quá trình xây dựng và phát triển các công cụ trên cả hai lĩnh vực phần cứng và phần mềm hổ trợ cho các lập trình viên thiết kế các chương trình có khả năng đồ họa cao
- Với việc mô tả dữ liệu thông qua các hình ảnh và màu sắc đa dạng của nó, các chương trình đồ họa thường thu hút người sử dụng bởi tính thân thiện, dể dùng, kích thích khả năng sáng tạo và nâng cao năng suất làm việc
Trang 7CHƯƠNG 2: THUẬT TOÁN VẼ ELIPSE-MIDPOINT
2.1 Đặt vấn đề
Vấn đề đẳ ra ở đây là làm thế nào để vẽ được hình elipse bằng thuật toán midpoint
Hình 2.1: Hình elipse mẫu
2.2 Thuật toán Midpoint vẽ elipse
2.2.1 Thuật giải
Phương trình của đường Elip:
f(x,y) = b + a – a2x2 2y2 2b2
f(x,y) < 0 nếu (x,y) nằm bên trong elip
f(x,y) = 0 nếu (x,y) nằm trên elip f(x,y) > 0 nếu (x,y) nằm bên ngoài elip
7
Trang 8Hình 2.2.1: Lựa chọn điểm trong thuật toán Midpoint
Do tính đối xứng qua trục tọa dộ lên chỉ cần vẽ ¼ elipse, rồi lấy đối xứng qua trục tọa độ
Để đơn giản, chúng ta sẽ chọn vẽ hình Elip có tâm ở gốc tọa độ
Phương trình của đường Elip:
• f(x,y) = b + a – a2x2 2y2 2b2
Trang 9*Ý tưởng và phân tích giải thuật:
Chia Elip làm 2 phần tại điểm Q nơi có hệ số góc của tiếp tuyến với Elip bằng -1 (véc tơ gradient bằng 1) ( nếu k chia 2 phần mà vẽ liền 1 mạch thì y biến thiên theo y còn x biến thiên theo x, và như vậy có thể sẽ k vẽ đc elip hoặc vẽ nó k đc đẹp, mà theo toán học trên đường elip có điểm đặc biệt tại f’y = f’x và nó chia elip làm 2 phần) Tại vùng thứ nhất, x biến thiên nhanh hơn y và tại vùng thứ hai , y biến thiên nhanh hơn x Nhớ lại công thức hệ số góc của đường cong :
dx/dy = fx/fy = (2b x) /( 2a2 2y)
trong đó: fx và fy là đạo hàm riêng phần của f(x,y) theo x, theo y
Trong phần thứ nhất:
Giả sử đã vẽ được điểm (xi,yi) , điểm tiếp theo trên elip được chọn trong bước nhảy i+1 là T hoặc S(vì x luôn tang 1 đơn vị còn y giữ nguyên hoặc giảm) Trung điểm I của TS sẽ quyết định điểm nào được chọn Giá trị của f(x,y) tại điểm I:
di = f(x + 1, y – ½) = bi i 2(xi + 1) + a2 2(y b
i – ½) – a2 2 2
+Nếu d ≥ 0 thì trung điểm I nằm ngoài đường elip => điểm được chọn là S.i
+Nếu d < 0 thì trung điểm I nằm trong đường elip => điểm được chọn là T.i
Ta lại có:
di+1 = f(x + 1, y – ½) = bi+1 i+1 2(xi+1 +1) + a2 2(y b
i+1 – ½) – a2 2 2
Suy ra:
di+1 – d = bi 2[(xi+1 +1) – (x2 +1) [(y
i 2] +a2
i+1 – ½) – (y – ½) ]2
i 2
Vì x = x +1 nêni+1 i
di+1 – d = 2bi 2xi+1 + b + a2 2[(y
i+1 – ½) – (y – ½) ]2
i 2
9
Trang 10+ Nếu điểm được chọn là T (d < 0) thì y = yi i+1 i
Ta có :
di+1 = d + 2bi 2xi+1 + b (= d + fx + b )2
= d + 2bi 2 (xi + 1) + b2
= d + bi 2 (2xi + 3)
+ Nếu điểm được chọn là S (d ≥ 0) thì y = y – 1i i+1 i
Ta có:
di+1 = d + 2bi 2xi+1 + b – 2a2 2y
i+1 (= d + fx + b – fy)i 2
= d + 2b (x + 1) + b – 2a (y – 1)i 2 i 2 2 i
= d + b (2x + 3) + a (-2y )i 2 i 2 i
Với điểm đầu tiên (0,b) ta có:
d1 = f(0,b) = b + a (b – ½) – a2 2 2 2 2b = b ─ a b + a /4 + 2)2 2 2
Trong phần thứ hai:
Chúng ta tính toán như phần 1 Giả sử ta phải xác định điểm (xj+1,yj+1) tiếp theo trên elip trong bước j+1 Điểm được chọn là U hoặc V Trung điểm K của
UV sẽ quyết định việc chọn điểm U hay điểm V Giá trị của f(x,y) tại điểm K:
ej = f(x + ½, y – 1) = bj j 2(xj + ½) + a2 2(y b
j – 1) – a2 2 2
+ Nếu e ≥ 0 điểm được chọn là U.j
+ Nếu e < 0 điểm được chọn là V.j
Ta lại có:
ej+1 = f(x + ½, y – 1) = bj+1 j+1 2(xj+1 + ½) + a2 2(y b
j+1 – 1) – a2 2 2
Suy ra:
Trang 11ej+1 – e = bj [(xj+1 + ½) – (x + ½) ] + aj [(yj+1 – 1) – (y – 1) ]j
= b2[(xj+1 + ½) – (x + ½) ] – 2a2 j 2 2yj+1 + a2
(Chú ý : y = y – 1)j+1 i
+ Nếu điểm được chọn là U (tức e ≥ 0) thì x = xj j+1 j
Ta có:
ej+1 = e – 2aj 2yj+1 + a (= e – fy + a )2
= e – 2aj 2(yj -1) + a2
= e – a (3 – 2y )j 2 j
+ Nếu điểm được chọn là V (tức e < 0 )thì x = x +1j j+1 j
Ta có:
ej+1 = e + 2bj 2xj+1 – 2a2y
j+1 + a (= e + fx – fy + a )2
= e + 2bj 2(xj + 1)– 2a2(yj -1) + a2
= e + bj 2(2xj + 2)+ a (3 -2y )2 j
Giá trị khởi tạo ban đầu trong phần 2 phụ thuộc vào vị trí cuối cùng của phần
1, giả sử là (xk,yk) Khi đó:
e1 = f(x + ½, y – 1) = bk k 2(xk + ½) + a2(y
k – 1) – a2 2b2
2.2.2 Lưu đồ thuật toán
11
Trang 12Hình 2.2.2: Lưu đồ thuật toán
*Q: Tại sao lại so sánh 2A y < 0 ???2
=> A: Do ở phần ý tưởng thuật toán, chúng ta chia elip làm 2 phần để vẽ và
lấy điểm Q có hệ số góc của tiếp tuyến với elip bằng -1 làm giao điểm Theo công thức hệ số đã nêu ở trên: dx/dy = fx/fy = (2b x) /( 2a y) Tại điểm đầu tiên2 2
có tọa độ (0,b), chúng ta thay x=0 và y=b vào công thức trên được hệ số góc= 0/( 2a b) lớn hơn -1 Nên ta chọn vẽ theo nhánh 1 Như vậy, việc so sánh 2A y2 2
< 0 là để chọn nhánh vẽ elip thôi
2.2.3 Code minh họa
#include<graphics.h>
#include<conio.h>//de dung man hinh dô hoa
#include<iostream>
#define ROUND(a) (int)(a+0.5)
using namespace std;
Trang 13putpixel(xc+x, yc+y, color);
putpixel(xc-x, yc+y, color);
putpixel(xc+x, yc-y, color);
putpixel(xc-x, yc-y, color);
}
void elipMidpoint(int xc,int yc, int a, int b, int color)
{
int x, y, fx, fy, a2, b2, p;
x = 0;
y = b;
a2 = a*a;
b2 = b*b;
fx = 0;
fy = 2 * a2 * y;
plot(xc, yc, x, y, color);
p = ROUND(b2 -(a2*b) + (0.25*a2));//p=b2 - a2*b +a2/4
while(fx<fy)
{
x++;
fx += 2*b2;
13
Trang 14delay(50);
if(p<0)
{
p += b2*(2*x + 3);//p=p + b2*(2x +3)
}
else
{
y ;
p += b2*(2*x +3) + a2*(2- 2*y);//p=p +b2(2x +3) +a2(2-2y)
fy -= 2*a2;
}
plot(xc, yc, x, y, color);
}
p = ROUND(b2*(x +0.5)*(x +0.5) + a2*(y-1)*(y-1) - a2*b2);
//
while(y>0)
{
y ;
fy -= 2*a2;
delay(50);
if(p >=0)
Trang 15{
p += a2*(3-2*y); //p=p +a2(3-2y)
}
else
{
x++;
fx += 2*b2;
p += b2*(2*x +2) +a2*(3- 2*y);//p=p+ b2(2x +2) + a2(3-2y)
}
plot(xc, yc, x, y, color);
}
}
int main()
{
int gd=DETECT, gm;
initgraph(&gd,&gm,"");
elipMidpoint(getmaxx()/2, getmaxy()/2,150,80,15);
getch();
closegraph();
return 0;
}
15
Trang 16KẾT LUẬN
Qua việc thực hiện nghiên cứu đề tài “Mô phỏng chuyển động phóng tàu vũ trụ” Nhóm chúng em đã được biết thêm rất nhiều về môn Đồ họa máy tính Bên cạnh đó, việc làm nghiên cứu giúp chúng em đoàn kết hơn, rèn luyện cho chúng
em kỹ năng làm việc nhóm
Trong quá trình thực hiện đề tài có rất nhiều ý tưởng hay, độc đáo Nhưng do kiến thức của chúng em hạn hẹp và thời gian không cho phép nên chúng em chưa thể thực hiện được những ý tưởng đó Tuy nhiên chúng em đã cố gắng để xây dựng một chương trình hoàn chỉnh nhất, đẹp nhất Trong quá trình xây dựng chương trình nhóm chúng em khó tránh khỏi những sai sót Vì vậy em rất mong rằng thầy và các bạn cùng góp ý với nhóm em để có thể hòa thành sản phẩm một cách hoàn chỉnh nhất