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

VẼ MẶT TRỜI ĐỨNG YÊN TẠI TÂM MÀN HÌNH, TRÁI ĐẤT QUAY QUANH MẶT TRỜI (QUỸ ĐẠO ELLIP), MẶT TRĂNG QUAY QUANH TRÁI ĐẤT (QUỸ ĐẠO HÌNH TRÒN)

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 (318.2 KB, 27 trang )

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ỌC
ĐỒ HỌA MÁY TÍNH
ĐỀ TÀI : VẼ MẶT TRỜI ĐỨNG YÊN TẠI TÂM MÀN HÌNH,
TRÁI ĐẤT QUAY QUANH MẶT TRỜI (QUỸ ĐẠO ELLIP), MẶT
TRĂNG QUAY QUANH TRÁI ĐẤT (QUỸ ĐẠO HÌNH TRÒN).
Nhóm sinh viên thực hiện: Nhóm 9
1. Nguyễn Văn Long
2. Nguyễn Chí Thanh
3. Phạm Đình Chiến
Lớp: ĐH KTPM – K6
Giáo viên hướng dẫn: THS. Nguyễn Thị Cẩm Ngoan
Hà Nội, ngày 26 tháng 02 năm 2013
1
LỜ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ển hình
ảnh trên màn hình máy tính. Đồ họa máy tính có 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, hình học họa hình, quang học, và kĩ thuật máy tính,
đặc biệt là chế tạo phần cứng (các loại màn hình, các thiết bị xuất, nhập, các vi mạch
đồ họa ).
Trong bài tập lớn bộ môn đồ họa máy tính nhóm em được giao đề tài: “Vẽ mặt
trời đứng yên tại tâm màn hình, trái đất quay quanh mặt trời quỹ đạo ellip, mặt
trăng quay quanh trái đất quỹ đạo hình tròn”. Được sự hướng dẫn của cô giáo bộ
môn cũng như qua các cổng thông tin Internet, tài liệu và sự tìm tòi trên các cuốn sách
tài liệu liên quan tới đề tài nhóm em đã hoàn thành bài tập lớn được giao. Trong quá
trình hoàn thành nhóm đã gặp được một số khó khăn cũng như thuận lợi và còn nhiều
hạn chế. Nhóm em rất mong được sự đóng góp, bổ sung ý kiến để bài tập lớn của


nhóm em có thể hoàn thành tốt các đề tài tiếp theo cũng như đề tài của nhóm sau này.
2
MỤC LỤC
2.1.1 Thuật toán Bresenham: 10
2.1.2 Thuật toán MidPoint: 12
2.2 Thuật toán tô màu 14
2.2.1. Theo dòng quét: 14
2.2.2. Tô màu lân cận: 16
3
1. PHÂN TÍCH KHẢO SÁT MỤC TIÊU ĐỐI TƯỢNG.
1.1 Định nghĩa các hằng số
#define SUNRADIUS 80 // bán kính mặt trời 80 pixel.
#define EARTHRADIUS 10 // bán kính trái đất 10 pixel.
#define MOONRADIUS 3 // bán kính mặt trăng 3 pixel.
#define SUNEARTH 200 // khoảng cách từ tâm mặt trời đến tâm trái đất 200 pixel.
#define EARTHMOON 30 // khoảng cách từ tâm trái đất đến tâm mặt trăng 30 pixel.
#define DELAY 20 // Tốc độ chuyển động.
1.2 Mặt trời
Để vẽ được mặt trời đứng yên tại tâm màn hình. Đầu tiên cần phải xác định tọa
độ xsun, ysun. Tọa độ xsun=getmax()/2; và ysun=getmaxy()/2; tức trả về nửa chiều
rộng (theo x) và nửa chiều cao (theo y) tối đa của chế độ màn hình đang dùng. Tiếp
theo ta vẽ đường tròn bằng thuật toán Bresenham khi biết tọa độ xsun, ysun:
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);
4
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++;
}
}
- Khi gọi hàm: Duongtron_BRE(xsun,ysun,60,14);//ve mat troi
Với xsun, ysun là tọa độ tâm đường tròn, bán kính 60 pixel, hệ số màu là 14 (màu
vàng).
- Cuối cùng để tô màu cho Mặt trời ta dùng thuật toán tô màu đường biên với hàm tô
màu:
void FloodFill (int x, int y, int in_color, int new_color)// hàm tô màu
{
if (getpixel(x, y) == in_color)
{
putpixel(x, y, new_color);
FloodFill(x-1, y, in_color, new_color);

FloodFill(x+1, y, in_color, new_color);
FloodFill(x, y-1, in_color, new_color);
5
FloodFill(x, y+1, in_color, new_color);
}
}
- Khi gọi hàm:
for(int i = 0; i < 2; i++)
{
FloodFill (xsun,ysun,0,14);// tô màu cho mặt trời
}
Được lồng trong vòng lặp for với xsun, ysun là tọa độ tâm đường tròn, 0 là hệ số
màu ban đầu (màu đen), 14 là hệ số màu cần tô (màu vàng).
1.3 Trái đất
Để vẽ được trái đất quay quanh mặt trời với quỹ đaọ ellip, đầu tiên ta khởi tạo tọa
độ tâm trái đất ở một vị trí xác định xearth, yearth, sau đó thực hiện phép quay quanh
tâm mặt trời. Với xearth = xsun + SUNEARTH; yearth= getmaxy()/2;
- Vẽ và tô màu cho trái đất:
setcolor(GREEN); // Vẽ màu viền trái đất màu xanh.
setfillstyle(SOLID_FILL, GREEN); // Tô màu trái đất bằng nét liền màu xanh.
fillellipse(xearth, yearth, EARTHRADIUS, EARTHRADIUS); // Vẽ và tô màu trái đất
dạng đặc, với EARTHRADIUS là bán kính ellip theo x và y).
- Sử dụng phép quay trái đất quay quanh mặt trời quỹ đạo ellipse:
Xác định quỹ đạo di chuyển của trái đất với quỹ đạo là hình ellipse ta có hàm vẽ
đường ellipse dùng thuật toán Midpoint:
void plot(int xc, int yc, int x, int y, int color)
{
putpixel(xc+x, yc+y, color);
putpixel(xc-x, yc+y, color);
putpixel(xc+x, yc-y, color);

6
putpixel(xc-x, yc-y, color);
}
void Mid_ellipse(int xc, int yc, int a, int b, int color)
{
int x, y, fx, fy, a2, b2;
double 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*a));
while (fx < fy)
{
x++;
fx += 2*b2;
if (p<0)
p += b2*(2*x +3);
else{
y ;
p+= b2*(2*x +3) + a2*(-2*y +2);
fy -= 2*a2;
}
plot(xc, yc, x, y, color);
7
}
p = ROUND(b2*(x+0.5)*(x+0.5) + a2*(y-1)*(y-1) - a2*b2);

while (y>0){
y ;
fy -= 2*a2;
if (p>=0)
{
p = p+(a2*(3 - 2*y)); p =p + a2*(3-2*y);
}
else{
x++;
fx += 2*b2;
p += b2*(2*x+2) + a2*(-2*y +3);
}
plot(xc, yc, x, y, color);
}
}
Tạo chuyển động cho trái đất quay quanh mặt trời:
int earth_angle = 0
do
{
delay(DELAY);
setcolor(BLACK);
setfillstyle(SOLID_FILL, BLACK);
fillellipse(xearth, yearth, EARTHRADIUS, EARTHRADIUS);//to mau den cho
trai dat.
8
earth_angle += 1; //dieu chinh toc do quay cua trai dat
xearth = xsun + SUNEARTH * cos(M_PI * earth_angle / 180);
yearth = ysun + SUNEARTH * sin(M_PI * earth_angle / 180);
}
while(!kbhit()); //chuong trinh se dung lai khi ta bam mot phim bat ki.

1.4 Mặt trăng
Để vẽ được mặt trăng quay quanh trái đất với quỹ đạo hình tròn, đầu tiên ta khởi
tạo tọa độ tâm mặt trăng ở một vị trí xác định xmoon, ymoon, sau đó thực hiện phép
quay quanh tâm mặt trời. Với xmoon = xearth + EARTHMOON; ymoon=
getmaxy()/2;
- Vẽ và tô màu cho mặt trăng:
setcolor(WHITE);
setfillstyle(SOLID_FILL, WHITE);
fillellipse(xmoon, ymoon, MOONRADIUS, MOONRADIUS);//ve mat trang
- Sử dụng phép quay mặt trăng quay quanh trái đất quỹ đạo hình tròn:
moon_angle = 0;
do
{
delay(DELAY);
setcolor(BLACK);
setfillstyle(SOLID_FILL, BLACK);
fillellipse(xmoon, ymoon, MOONRADIUS, MOONRADIUS);//to mau den
cho mat trang.
xmoon = xearth + EARTHMOON * cos(M_PI * moon_angle / 180);
ymoon = yearth + EARTHMOON * sin(M_PI * moon_angle / 180);
} while (!kbhit()); //chuong trinh se dung lai khi ta bam mot phim bat ki.
9
2. CÁC THUẬT TOÁN SỬ DỤNG
2.1 Thuật toán vẽ đường tròn:
Xét đường tròn (C) tâm O(xc,yc) bán kính R.
Phương trình tổng quát của đường tròn có dạng:
(x-x
c
)
2

+ (y – y
c
)
2
= R
2
(*)
↔ y = y
c
±
22
)(
c
xxR
−−
Để đơn giản thuật toán đầu tiên ta xét đường trong có tâm ở gốc tọa độ (xc=0 và
yc=0).
* Ý tưởng:
Do tính đỗi xứng của đường tròn nên nếu điểm (x,y)

(C) thì các điểm (y,x),
(-y,x), (-x,y), (-x,-y), (-y,-x), (y,-x), (x,-y) cũng

(C)
Vì vậy, ta chỉ cần vẽ một phần 8 cung tròn sau đó lấy đối xứng qua gốc O và 2 trục tọa
độ thì ta có được toàn bộ đường tròn.
2.1.1 Thuật toán Bresenham:
Giả sử (x
i
,y

i
) đã vẽ được. Cần chọn điểm kế tiếp là (x
i
+1, y
i
) hoặc (xi
+1,yi -1)
Từ phương trình: x2 + y2 = R2
ta tính được giá trị y thực ứng với tọa độ xi +1 là: y2 = R2 - (xi +1)2
đặt d1 = yi2 - y2= yi2 - R2 + (xi + 1)
d2 = y2 - (yi - 1)2 = R2 - (xi + 1)2 - (yi - 1)2
suy ra
pi = d1 - d2 = 2.(xi + 1)2 + yi2 + (yi - 1)2 - 2R2 (2)

pi+1 = 2.(xi+1 + 1)2 + y2i+1 + (yi+1 - 1)2 - 2R2 (3)
Từ (2) và (3) ta có:
pi+1 - pi = 4xi + 6 + 2.(y
2
1+i
- y
2
i
) - 2.(y
1
+
i
- y
i
)


pi+1 = pi + 4xi + 6 + 2.(y
2
1+i
- y
2
i
) - 2.(y
1
+
i
- y
i
) (4)
10
Nhận xét:
Nêu pi < 0: chọn yi+1 = yi (4)

pi+1 = pi + 4xi + 6
Nêu pi

0: chọn yi+1 = yi - 1 (4)

pi+1 = pi + 4.(xi - yi) + 10
Ta chọn điểm đầu tiên cần vẽ (0,R), theo (2) ta có: p1 = 3 - 2R
Tóm lại ta có thuật toán vẽ đường tròn:
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 thì 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à (x
1
+
i
,y
1
+
i
). Ngược lại chọn điểm (x
1
+
i
,y
1
+
i
-1)
Bước 4 Lặp lại bước 3 cho đên khi x = y.
Sau đây là thủ tục để cài đặt thuật toán:
Procedure Circle(x0,y0,r:Integer);
Var p,x,y:Integer;
Procedure VeDiem;
Begin
PutPixel( x0 + x , y0 + y , color);
PutPixel( x0 - x , y0 + y , color);
PutPixel( x0 + x , y0 - y , color);
PutPixel( x0 - x , y0 - y , color);
PutPixel( x0 + y , y0 + x , color);
PutPixel( x0 - y , y0 + x , color);

PutPixel( x0 + y , y0 - x , color);
PutPixel( x0 - y , y0 - x , color);
11
End;
Begin
x:=0; y:=r;
p:=3 - 2*r;
While x<=y do
Begin
VeDiem;
If p<0 then p:=p + 4*x + 6
Else
Begin
p:=p + 4*(x-y) + 10;
y:=y-1;
End;
x:=x+1;
End;
End;
2.1.2 Thuật toán MidPoint:
Do tính đối xứng của đường tròn (C) nên ta chỉ cần vẽ cung (C
1/8
) là cung 1/8 đường
tròn, sau đó lấy đối xứng. Cung (C
1/8
) được mô tả như sau (cung của phần tô xám trong
hình vẽ) :
12
Hình 2.1 – Các vị trí đối xứng trên đường tròn (C) tương ứng với (x,y)
Như vậy nếu có (x, y) Î (C

1/8
) thì các điểm : (y, x), (y,-x), (x,-y), (-x,-y), (-y,-x), (-y,x),
(-x,y) sẽ thuộc (C).
Chọn điểm bắt đầu để vẽ là điểm (0,R). Dựa vào hình vẽ, nếu là điểm nguyên đã
tìm được ở bước thứ i, thì điểm ở bước thứ (i+1) là sự lựa chọn giữa S và P.
Như vậy :
Tương tự như thuật toán MidPoint vẽ đoạn thẳng, việc quyết định chọn một trong hai
điểm S và P sẽ được thực hiện thông qua việc xét dấu của một hàm nào đó tại điểm
MidPoint là điểm nằm giữa chúng.
Hình 2.2 – Thuật toán MidPoint vẽ đường tròn
Đặt , ta có :
13
Xét . Ta có :
• Nếu , điểm MidPoint nằm trong đường tròn. Lúc này điểm thực Q gần S
hơn nên ta chọn S, tức là .
• Ngược lại, nếu , điểm MidPoint nằm ngoài đường tròn. Lúc này điểm
thực Q gần P hơn nên ta chọn P, tức là .
Mặt khác :
Vậy :
, nếu do ta chọn .
, nếu do ta chọn .
Ta tính giá trị ứng với điểm ban đầu .
2.2 Thuật toán tô màu
2.2.1. Theo dòng quét:
Giả sử vùng tô được cho bởi một đa giác N đỉnh : . Đa giác này có
thể là đa giác lồi, đa giác lõm, và cả đa giác tự cắt, …
Hình 2.18 sau minh họa ý tưởng chính của thuật toán. Với mỗi dòng quét, ta sẽ xác
định phần giao của đa giác và dòng quét rồi tô màu các pixel thuộc đoạn giao đó. Để
14
xác định các đoạn giao ta tiến hành việc tìm giao điểm của dòng quét với các cạnh của

đa giác, sau đó các giao điểm này sẽ được sắp theo thứ tự tăng dần của hoành độ giao
điểm. Các đoạn giao chính là các đoạn thẳng được giới hạn bởi từng cặp giao điểm
một, ví dụ như (0,1), (2,3), ….
Hình 2.3 – Thuật toán scan-line với một dòng quét nào đó
Ta có thể tóm bắt các bước chính của thuật toán :
• Tìm , lần lượt là giá trị lớn nhất, nhỏ nhất của tập các tung độ của các
đỉnh của đa giác đã cho , .
• Ứng với mỗi dòng quét , với k thay đổi từ đến , lặp :
• Tìm tất cả các hoành độ giao điểm của dòng quét với các cạnh của đa giác.
• Sắp xếp các hoành độ giao điểm theo thứ tự tăng dần : x
0
, x
1
, …
• Tô màu các đoạn thẳng trên đường thẳng lần lượt được giới hạn bởi các
cặp .
Nếu chỉ dừng ở mức này và chuyển sang cài đặt, chúng ta sẽ gặp một số vấn đề sau :
• Nhận xét rằng, ứng với mỗi dòng quét, không phải lúc nào tất cả các cạnh của
đa giác cũng tham gia cắt dòng quét. Do đó để cải thiện tốc độ cần phải có một
cách nào đó để hạn chế được số cạnh cần tìm giao điểm ứng với mỗi dòng quét.
• Việc tìm giao điểm của cạnh đa giác với mỗi dòng quét sẽ gặp các phép toán
phức tạp như nhân, chia, … trên số thực nếu ta dùng cách giải hệ phương trình
tìm giao điểm. Điều này sẽ làm giảm tốc độ thuật toán khi phải lặp đi lặp lại
nhiều lần thao tác này khi dòng quét quét qua đa giác.
15
• Nếu số giao điểm tìm được giữa các cạnh đa giác và dòng quét là lẻ thì việc
nhóm từng cặp giao điểm kế tiếp nhau để hình thành các đoạn tô có thể sẽ
không chính xác. Điều này chỉ xảy ra khi dòng quét đi ngang qua các đỉnh của
đa giác. Nếu tính số giao điểm tại đỉnh dòng quét đi ngang qua là hai thì có thể
sẽ cho kết quả tô không chính xác như trong trường hợp của hình 2.19. Ngoài

ra, việc tìm giao điểm của dòng quét với các cạnh nằm ngang là một trường hợp
đặc biệt cần phải có cách xử lí thích hợp.
2.2.2. Tô màu lân cận:
Lây P(x,y)

S, tô màu P.
Xét các điểm lân cận của P
Nêu các điểm lân cận đó vẫn còn thuộc S và chưa được tô màu thì tô màu cho các
điểm lân cận đó
Thuật toán trên có thê được minh học bằng thử tục đệ quy sau:
Procedure Tomaulancan(x,y:Integer; Color:Word);
Begin
If (P(x,y)

S)and(P(x,y)chưa tô) Then
Begin
PutPixel(x,y,Color);
Tomaulancan (x+1,y,Color);
Tomaulancan (x-1,y,Color);
Tomaulancan (x,y+1,Color);
Tomaulancan (x,y-1,Color);
End;
End;
16
2.3 Phép quay:
Phé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 chiều kim đồng
hồ. Ta có công thức biến đổi của phép quay điểm quanh gốc tọa độ một góc góc
α tạo thành điểm ảnh Q(x*,y*) có công thức như sau:




+=
−=
αα
αα
cos.sin.*
sin.cos.*
yxy
yxx
Hình 2.4 – Phép quay một đối tượng quanh gốc tọa độ một góc 60
0
Phép quay quanh một điểm bất kỳ
Hình 2.5 - Phép quay quanh một điểm
180
0
17
Hình 2.6 : Phép quay quanh một điểm bất kỳ.
Xét điểm P(P.x,P.y) quay quanh điểm V(V.x, V.y) một góc -0- đến điểm Q(Q.x,Q.y).
Ta có thể xem phép quay quanh tâm V được kết hợp từ phép các biến đổi cơ bản sau:
- Phép tịnh tiến (-V.x, -V.y) để dịch chuyển tâm quay về gốc tọa độ
- Quay quanh gốc tọa độ O một góc -0-
- Phép tịnh tiến (+V.x, +V.y) để đưa tâm quay về vị trí ban đầu
Ta cần xác định tọa độ của điểm Q (xem hình 3.3).
- Từ phép tịnh tiến (-V.x,-V.y) biến đổi điểm P thành P' ta được:
P' = P + V
hay
- Phép quay quanh gốc tọa độ biến đổi điểm P' thành Q'
Q' = P'.M
- Phép tịnh tiến (+V.x, +V.y) biến đổi điểm Q' thành Q ta được

18
Q = Q' + V
hay
Vậy Q = P.M + tr.
Với
 Thuật toán cài đặt
void Quay(float &x,float &y,float goc)
{
goc=(M_PI/180)*goc;
float a=x,b=y;
x=a*cos(goc)-b*sin(goc);
y=a*sin(goc)+b*cos(goc);
}
19
3. GIAO DIỆN CHƯƠNG TRÌNH
Hình 3.1 – Giao diện khi chạy chương trình
Hình 3.2 – Giao diện khi chạy chương trình.
20
4. CHƯƠNG TRÌNH CÀI ĐẶT
#include <conio.h>
#include <graphics.h>
#include <math.h>
#include <dos.h>
#define SUNRADIUS 80 //dinhnghia cac gia tri la hang so
#define EARTHRADIUS 10
#define MOONRADIUS 3
#define SUNEARTH 200
#define EARTHMOON 30
#define DELAY 20
#define ROUND(a)((long)a+0.5);

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);
21
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++;
}
}
void FloodFill (int x, int y, int in_color, int new_color)//hàm tô màu
{
if (getpixel(x, y) == in_color)

{
putpixel(x, y, new_color);
FloodFill(x-1, y, in_color, new_color);
FloodFill(x+1, y, in_color, new_color);
FloodFill(x, y-1, in_color, new_color);
FloodFill(x, y+1, in_color, new_color);
}
}
void plot(int xc, int yc, int x, int y, int color)
{
22
putpixel(xc+x, yc+y, color);
putpixel(xc-x, yc+y, color);
putpixel(xc+x, yc-y, color);
putpixel(xc-x, yc-y, color);
}
void Mid_ellipse(int xc, int yc, int a, int b, int color)
{
int x, y, fx, fy, a2, b2;
double 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*a));
while (fx < fy){
x++;

fx += 2*b2;
if (p<0)
p += b2*(2*x +3);
else{
y ;
p+= b2*(2*x +3) + a2*(-2*y +2);
fy -= 2*a2;
23
}
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;
if (p>=0)
{
p = p+(a2*(3 - 2*y)); p =p + a2*(3-2*y);
}
else{
x++;
fx += 2*b2;
p += b2*(2*x+2) + a2*(-2*y +3);
}
plot(xc, yc, x, y, color);
}
}
void he_mat_troi()
{
int xsun, ysun, xearth, yearth, xmoon, ymoon;//khai bao toa do cua mat trang, mat

troi, trai dat.
int earth_angle = 0, moon_angle = 0;
rectangle(0, 0, getmaxx(), getmaxy());//getmaxy la ham lay do dai chieu doc cua man
hinh.
24
//getmaxx() la ham lay gia tri do dai chieu ngang cua man hinh.
xsun = getmaxx() / 2;
ymoon = yearth = ysun = getmaxy() / 2;
xearth = xsun + SUNEARTH;
xmoon = xearth + EARTHMOON;
Duongtron_BRE(xsun,ysun,60,14);//ve mat troi
for(int i = 0; i < 2; i++)
{
FloodFill (xsun,ysun,0,14);//to mau cho mat troi
}
do {
//Mid_ellipse(317,239,190,199,12);//(ngang,doc,do ngang,do doc) ve quy dao di
chuyen cua trai dat.
setcolor(GREEN);//ve mau vien cua trai dat.
setfillstyle(SOLID_FILL, GREEN);//to mau trai dat.
fillellipse(xearth, yearth, EARTHRADIUS, EARTHRADIUS);//trai dat
setcolor(WHITE);
setfillstyle(SOLID_FILL, WHITE);
fillellipse(xmoon, ymoon, MOONRADIUS, MOONRADIUS);//ve mat trang
//tao chuyen dong cho trai dat va mat trang.
delay(DELAY);
setcolor(BLACK);
setfillstyle(SOLID_FILL, BLACK);
fillellipse(xearth, yearth, EARTHRADIUS, EARTHRADIUS);//to mau den cho trai
dat.

25

×