Tải bản đầy đủ (.doc) (18 trang)

Viết chương trình vẽ hai đường tròn C1 và C2 cắt nhau. Tô phần giao của hai đường tròn đó.Tô phần bù của C2. Tô phần bù của C1. Lưu ý rằng 3 màu tô này phải khác nhau

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (320.99 KB, 18 trang )

BỘ CÔNG THƯƠNG
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 21: Viết chương trình vẽ hai đường tròn C1 và C2 cắt nhau. Tô phần
giao của hai đường tròn đó.Tô phần bù của C2. Tô phần bù của C1. Lưu ý rằng
3 màu tô này phải khác nhau.
GIÁO VIÊN HƯỚNG DẪN: Th.s Nguyễn Thị Cẩm Ngoan
LỚP: KHMT2-K5
THÀNH VIÊN NHÓM 21:
HOÀNG TRUNG PHONG − MSV: 641360195
ĐINH TIẾN DŨNG − MSV: 641360078
TRIỆU ĐỨC TRƯỜNG − MSV: 541260029
Hà Nội, tháng 2 – 2013
MỤC LỤC
A.Lời giới thiệu
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ữ liệ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ó.
Với đề tài: “Viết chương trình vẽ hai đường tròn C1 và C2 cắt nhau. Tô
phần giao của hai đường tròn đó.Tô phần bù của C2. Tô phần bù của C1. Lưu ý
rằng 3 màu tô này phải khác nhau ”.
Do kiến thức còn hạn chế và thiếu kinh nghiệm nên bài làm còn nhiều sai sót.
Mong cô giáo và các bạn giúp đỡ và đóng góp ý kiến để chúng em hoàn thành
tốt hơn. Chúng em xin chân thành cảm ơn !
B.Nội dung
I.Khảo sát mục đích đối tượng
− Nhập vào tâm và bán kính đường tròn C1.Vẽ đường tròn C1
− Nhập vào tâm và bán kính đường tròn C2.Vẽ đường tròn C2.Với điều kiện là
tâm không trùng với C1 và bán kính thích hợp để hai đường tròn cắt nhau
− Tô màu phần giao nhau của hai đường tròn,phần bù của đường tròn C1, phần
bù của đường tròn C2 bằng 3 màu khác nhau
 Các thuật toán dùng trong bài:
• Thuật toán vẽ đường tròn Bresenham:
− Bước 1: Chọn điểm đầu cần vẽ(x1,y1) = (0,R)
− Bước 2: Tính P đầu tiên: p1 = 3 - 2R
Nếu p < 0: chọn điểm kế tiếp là (xi+1,yi). Ngược lại chọn điểm (xi + 1,yi - 1)
− Bước 3: x:=x + 1, tính lại p:
Nếu pi< 0: pi+1= pi+ 4xi+ 6. Ngược lại: pi+1= pi+ 4.(xi- yi) + 10
Khi đó:
Nếu pi+1< 0: chọn điểm kế tiếp là (xi+1,yi+1). Ngược lại chọn điểm
(xi+1,yi+1-1)
− Bước 4: Lặp lại bước 3 cho đến khi x = y.
• Thuật toán tô màu theo đường biên:
Thuật toán tô màu dựa theo đường biên của vùng tô đƣợc xác định
bởi tập các đỉnh của một đa giác, đường biên trong thuật toán đƣợc mô tả

bằng một giá trị duy nhất đó là màu của tất cả các điểm thuộc về đường biên.
Bắt đầu từ điểm nằm bên trong vùng tô, ta sẽ kiểm tra các điểm lân cận của
nó đã được tô màu hay có phải là điểm biên hay không, nếu không phải là
điểm đã tô và không phải là điểm biên ta sẽ tô màu nó. Quá trình này đƣợc
lặp lại cho tới khi nào không còn tô được điểm nào nữa thì dừng. Bằng cách
này, toàn bộ các điểm thuộc vùng tô được kiểm tra và sẽ đựợc tô hết.
II.Phân tích các biến số và đưa ra cách giải quyết:
1.Phân

tích

các

biến

số
:
 Vẽ hai đường tròn dùng thuật toán Bresenham:
• Đường tròn C1 với các biến số nhập vào x1,y1,R1:
− Tâm (x1,y1)
− Bán kính R1
• Đường tròn C2 với các biến số nhập vào x2,y2,R2:
− Tâm(x2,y2)
− Bán kính R2
 Tìm tọa độ 4 giao điểm của đường thẳng đi qua tâm 2 đường tròn với 2
đường tròn trên
• Đường thẳng đi qua tâm hai đường tròn có dạng y=kx+m:
− k:hệ số góc k=(y1-y2)/(x1-x2)
− m = -kx1+y1
• Giao điểm của đường thẳng d đi qua tâm 2 đường tròn với 2 đường tròn trên

Ta giải hai hệ phương trình:
Hệ 1:Giao điểm đường thẳng d với đường tròn C1
− Các biến số : a,b1,c1,p1,p2,q1,q2
 (k
2
+1)x
2
+ (2mk-2x
1
-2ky
1
)x+m
2
-2my
1
+x
1
2
+y
1
2
-R
1
2
Đặt
a= k
2
+1
b
1

= 2mk-2x
1
-2ky
1
c
1
= m
2
-2my
1
+x
1
2
+y
1
2
-R
1
2
−Rồi giải phương trình bậc 2 ta được 2 nghiệm p1 và p2
−Tọa độ 2 giao điểm
I
1
(p1,q1)
I
2
(p2,q2)
Hệ 2:Giao điểm đường thẳng d với đường tròn C2
− Các biến số : a,b2,c2,p3,p4,q3,q4
 (k

2
+1)x
2
+ (2mk-2x
2
-2ky
2
)x+m
2
-2my
2
+x
2
2
+y
2
2
-R
2
2
Đặt a= k
2
+1
b
2
= 2mk-2x
2
-2ky
2
c

2
= m
2
-2my
2
+x
2
2
+y
2
2
-R
2
2
−Rồi giải phương trình bậc 2 ta được 2 nghiệm p3 và p4
−Tọa độ 2 giao điểm
I
3
(p3,q3)
I
4
(p4,q4)
 Tìm trung điểm của giữa các giao điểm trên
(x-x
1
)
2
+(y-y
1
)

2
= R
1
2
y=kx+m
(x-x
2
)
2
+(y-y
2
)
2
= R
2
2
y=kx+m
− Điểm M
1
(m1,n1) là trung điểm của I
1
và I
3
− Điểm M
2
(m2,n2) là trung điểm của I
2
và I
3
− Điểm M

2
(m2,n2) là trung điểm của I
2
và I
4
 Dùng thuật toán tô màu theo đường biên với 3 điểm M
1
, M
2
, M
3
để tô 3
miền với màu khách nhau
2.Hướng

giải

quyết
:
 Bước 1: Vẽ hai đường tròn dùng thuật toán Bresenham:
 Bước 2: Tìm 4 giao điểm của đường thẳng đi qua tâm hai đường tròn với
hai đường tròn trên là I
1
,I
2,
I
3
,I
4
:

 Bước 3: Tìm trung điểm M
1
giữa I
1
và I
3
,M
2
giữa I
2
và I
3
,M
3
giữa I
2
và I
4
 Bước 4: Dùng thuật toán tô màu theo đường biên với 3 điểm M
1,
,M
2
,M
3:
bằng
3 màu khác nhau,ta sẽ tô được màu của phần giao,phần bù đường tròn C1,
phần bù đường tròn C2 bằng màu khác nhau
Kết quả:
III.Cài đạt giao diện,code:

1.Giao diện
2.Code
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
#include<dos.h>
#include<stdio.h>
#include<math.h>
#include<graphics.h>
#define round(a) int(a+0.5)
/*Thuat toan to mau loang*/
void vetdauloang(int x1,int y1, int mb, int mt)
{
if( (getpixel(x1,y1)!=mb) &&(getpixel(x1,y1)!=mt) )
{
putpixel(x1,y1,mt);
vetdauloang(x1+1,y1,mb,mt);
vetdauloang(x1,y1-1,mb,mt);
vetdauloang(x1-1,y1,mb,mt);
vetdauloang(x1,y1+1,mb,mt);
}
}
/*Ham ve duong tron theo thuat toan Bresenham*/
void Duongtron_BRE(int xc, int yc, int R, int color)
{
int x, y, d;
x = 0;
y = R;
d = 3 - 2 * R;
while (x <= y)

{
putpixel(xc + x, yc + y, color);
putpixel(xc - x, yc + y, color);
putpixel(xc + x, yc - y, color);
putpixel(xc - x, yc - y, color);
putpixel(xc + y, yc + x, color);
putpixel(xc - y, yc + x, color);
putpixel(xc + y, yc - x, color);
putpixel(xc - y, yc - x, color);
if (d < 0)
d += 4 * x + 6;
else
{
d += 4 * (x-y) + 10;
y ;
}
x++;
}
}
int main()
{
int x1,y1,x2,y2,R1,R2,m1,n1,m2,n2,m3,n3,d,m,n;
float k,a,b1,c1,b2,c2,p1,q1,p2,q2,p3,q3,p4,q4;
int mh=0; int mode;
initgraph(&mh,&mode,"");
while(true)
{
cleardevice();
system("cls");
cout<<"Duong tron 1:";

cout<<"\n Nhap toa do tam :";
cout<<"\n x1= ";cin>>x1;
cout<<"\n y1= ";cin>>y1;
cout<<"\n Nhap ban kinh: ";
cout<<"\n R1= ";
cin>>R1;
cout<<"Duong tron 2:";
cout<<"\n Nhap toa do tam :";
cout<<"\n x2= ";cin>>x2;
cout<<"\n y2= ";cin>>y2;
d=int(sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)));
cout<<"\n Nhap ban kinh trong khoang tu "<<abs(d-R1)<<" den "<<d+R1;
cout<<"\n Nhap ban kinh: ";
cout<<"\n R2= ";
cin>>R2;
if(((x1==x2)&&(y1==y2))||R2<abs(d-R1)||(R2>d+R1))
{
cout<<"\n Nhap sai.Tam 2 duong tron khong trung nhau va ban kinh R2 thich
hop";
}
else
{/* Tim 4 giao diem cua duong thang di qua 2 tam va 2 duong tron.
Roi tim trung diem giau cac giao diem do de to mau */
if(x1==x2)
/* Truong hop x1=x2 nen k khong xac dinh*/
{
p1=x1;q1=y1+R1;
p2=x1;q2=y1-R1;
p3=x1;q3=y2+R2;
p4=x1;q4=y2-R2;

m1=round(p1+p3)/2;
n1=round(q1+q3)/2;
m2=round(p2+p3)/2;
n2=round(q2+q3)/2;
m3=round(p2+p4)/2;
n3=round(q2+q4)/2;
}
else
/* Truong hop x1 khac x2*/
{
/*Cac he so cua phuong trinh duong thang di qua 2 tam co dang y=kx+m*/
k=(y1-y2)/(x1-x2);
m=int(y1-k*x1);
a=k*k+1;
/*Cac he so cua chuong trinh giao diem cua duong thang di qua 2 tam va
duong tron*/
b1=2*m*k-2*x1-2*y1*k;
c1=m*m+x1*x1+y1*y1-R1*R1-2*y1*m;
b2=2*m*k-2*x2-2*y2*k;
c2=m*m+x2*x2+y2*y2-R2*R2-2*y2*m;
/*Cac giao diem (p,q) cua duong thang di qua 2 tam va hai duong tron*/
p1=((-b1+sqrt(b1*b1-4*a*c1))/(2*a));q1=(k*p1+m);
p2=((-b1-sqrt(b1*b1-4*a*c1))/(2*a));q2=(k*p2+m);
p3=((-b2+sqrt(b2*b2-4*a*c2))/(2*a));q3=(k*p3+m);
p4=((-b2-sqrt(b2*b2-4*a*c2))/(2*a));q4=(k*p4+m);
/* Trung diem cua cac giao diem tren */
m1=round((p1+p3)/2);
n1=round((q1+q3)/2);
m2=round((p2+p3)/2);
n2=round((q2+q3)/2);

m3=round((p2+p4)/2);
n3=round((q2+q4)/2);
}
Duongtron_BRE(x1,y1,R1,7);
Duongtron_BRE(x2,y2,R2,7);
vetdauloang(m3,n3,7,12);
vetdauloang(m2,n2,7,14);
vetdauloang(m1,n1,7,10);
}
cout<<"\n Nhan 1 so bat ky de nhap lai: ";cin>>n;
}
getch();
closegraph();
}
C.Kết luận
Qua việc làm bài tập lớn và các kiến thức mà cô dạy về môn học đồ họa máy tính
đã cho chúng em nhiều kiến thức bổ ích áp dụng vào thực tiễn cuộc sống.Đồ họa
máy tính còn có nhiều ứng dụng để áp dụng vào giáo dục,xây dựng,thiết kế, v v
vẫn đang chờ chúng ta khai phá…
D.Tài liệu tham khảo
1.Giáo trình Đồ Họa Máy Tính – khoa CNTT trường ĐH Công Nghiệp Hà Nội.
2.Giáo trình Kỹ Thuật Đồ Họa – trường Học Viện Công Nghệ Bưu Chính Viễn
Thông.
Và môt số tài liệu tham khảo trên internet…

×