Tải bản đầy đủ (.docx) (32 trang)

Đề Tài:” Cài đặt thuật toán Bresenham, MidPoint vẽ đường tròn và tô màu theo 2 thuật toán : tô màu theo dòng quét và tô màu lân cận.Sử dụng các phép biến đổi: phép tịnh tiến, phép quay, phép co dãn, phép đối xứng qua điểm, phép kết hợp.”

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 (355.47 KB, 32 trang )

TRƯỜNG ĐẠI HỌC CƠNG NGHIỆP
Khoa Cơng Nghệ Thơng Tin

BÀI TẬP LỚN
MƠN:Đồ Họa Máy Tính
Đề Tài:” Cài đặt thuật tốn Bresenham, MidPoint vẽ đường trịn và tơ màu theo 2
thuật tốn : tơ màu theo dịng qt và tơ màu lân cận.Sử dụng các phép biến đổi:
phép tịnh tiến, phép quay, phép co dãn, phép đối xứng qua điểm, phép kết hợp.”
Giáo viên hướng dẫn:
Sinh viên thực hiện:
1.
2.
3.

Dương Thị Hồng
Sái Hoàng Quân
Nguyễn Thế Việt

MSV:0641360273
MSV: 0641360114
MSV: 0441060022

1


Mục lục

Lời nói đầ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ó.
Qua q trính học tập và tìm hiểu nhóm đã được giao đề tài “Cài đặt thuật
toán Bresenham,MidPoint vẽ đường trịn và tơ màu theo 2 thuật tốn : tơ màu theo

2


dịng qt và tơ màu lân cận.Sử dụng các phép biến đổi: phép tịnh tiến, phép quay,
phép co dãn, phép đối xứng qua điểm, phép kết hợp.”
Do quá trình tìm hiểu cịn nhiều thiếu xót nên chương trình cịn nhiều hạn
chế, nhóm thực hiện rât mong được ý kiến đóng góp từ phía cơ giáo và các bạn để
chương trình được hoàn thiện hơn.

CHƯƠNG I:KHẢO SÁT
1.1 Mục đich nghiên cứu:
- Củng cố kiến thức đã học.
- Rèn luyện kỹ thuật lập trình đồ họa.
1.2 Đối tượng nghiên cứu




Đường trịn
Các thuật tốn vẽ đường trịn và tơ màu đường trịn

3


CHƯƠNG II: PHÂN TÍCH
2.1Thuật tố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 qt của đường trịn có dạng:
(x-xc)2 + (y – yc)2= R2 (*)
R 2 − ( x − xc ) 2

↔ y = yc ±
Để đơ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ì vay, 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 tồn bộ đường trịn.
2.1.1 Thuật tốn Bresenham:
i


i

i

i

Giả sử (x ,y ) đã vẽ được. Cân chọn điểm kế tiếp là (x +1,y ) hoac (xi +1,yi -1)
(Hình 1.5)
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
i +1



2
i

- y ) - 2.(y


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




2
i +1

2
i

i +1

i

-y )

- y ) - 2.(y

i +1

i

- y ) (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
4


Tóm lại ta có thuật tố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 đó :
i +1

i +1

i +1

i +1

Nêu pi+1 < 0: chọn điểm kê tiêp là (x ,y ). Ngược lại chọn điểm (x ,y -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);
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;

5


2.1.2 Thuật tốn MidPoint:
Do tính đối xứng của đường trịn (C) nên ta chỉ cần vẽ cung (C1/8) là cung 1/8

đường trịn, sau đó lấy đối xứng. Cung (C1/8) được mơ tả như sau (cung của phần tơ
xám trong hình vẽ) :

Hình 2.16 – 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) Ỵ (C1/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
đã tìm được ở bước thứ i, thì điểm
và P.

là điểm nguyên

ở bước thứ (i+1) là sự lựa chọn giữa S

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.

6


Hình 2.17 – Thuật tốn MidPoint vẽ đường trịn

Đặt

, ta có :

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 ngồ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
, nếu
Ta tính giá trị

do ta chọn

.

do ta chọn


.

ứng với điểm ban đầu

.

7


2.2 Thuật tốn tơ màu:
2.2.1. Theo dịng qt:
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 tố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 qt rồi tơ màu các pixel thuộc đoạn giao đó.
Để xác định các đoạn giao ta tiến hành việc tìm giao điểm của dịng qt 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.18 – Thuật tốn scan-line với một dịng qt nào đó
Ta có thể tóm bắt các bước chính của thuật tố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

,
, với k thay đổi từ

.



Ứng với mỗi dịng qt

đến

, lặp :




Tìm tất cả các hồ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 : x0, x1, …



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 qt, 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
8






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 qt.
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.
Nếu số giao điểm tìm được giữa các cạnh đa giác và dịng qt 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 qt đ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. Ngồi ra, việc tìm giao điểm của dịng qt 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 tố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;
2.3 Các phép biến hình
2.3.1Cá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ình
dạng.
9


2.3.2 Phép tịnh tiến
Ảnh của phép tịnh tiến theo vector (a,b) của điểm P(x,y) là điểm Q(x*,y*)
 x* = x + a


 y* = y + b

Vector tịnh tiến (a,b) cịn gọi là “vector độ dời”. Chúng ta có thể áp dụng quy
tắc trên cho mọi điểm của đối tượng để dịch chuyển nó. Đơn giản hơn, để tịnh tiến
một đa giác chỉ cần tịnh tiến các đỉnh của nó rồi vẽ lại đa giác mới. Tương tự, đối
với đường tròn, ellip ta tịnh tiến tâm của chúng tới vị trí mới rồi vẽ lại.

Nếu gọi ttx và tty 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’) sau khi tịnh tiến điểm P(x,y) sẽ là:
Khi đó (ttx,tty) được gọi là vecto tịnh tiến hay độ dời
1

0

0

0

1

0

tlx

tly

0

T=


§ Ma trận biến đổi

10




Thuật toán cài đặt
void TinhTien(float &x,float &y,float ttx,float tty)
{
x=x+ttx;
y=y+tty;
}

2.3.3Phé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:

 x* = x. cos α − y. sin α

 y* = x. sin α + y. cos α

11



Hình 3.3 – Phép quay một đối tượng quanh gốc tọa
độ một góc 60Phép quay quanh một điểm
1800

Phép quay quanh một điểm bất kỳ

12


Hình 3.3 : 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
13


- Phép tịnh tiến (+V.x, +V.y) biến đổi điểm Q' thành Q ta được
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);
14


}

2.3.4 Phép co dãn:
Để co hay giãn tọa độ của một điểm
và , ta nhân
,





theo trục hoành và trục tung lần lượt là

lần lượt cho các tọa độ của P.

được gọi là các hệ số tỉ lệ.


Khi các giá trị

,

nhỏ hơn 1, phép biến đổi sẽ thu nhỏ đối tượng, ngược lại khi

các giá trị này lớn hơn 1, phép biến đổi sẽ phóng lớn đối tượng. Khi , bằng
nhau, ta gọi đó là phép đồng dạng (uniform scaling), phép đồng dạng là phép biến
đổi bảo tồn tính cân xứng của đối tượng.
Tâm tỉ lệ là điểm không bị thay đổi qua phép biến đổi tỉ lệ. Phép biến đổi tỉ lệ mơ tả
như trên cịn gọi là phép biến đổi tỉ lệ quanh gốc tọa độ vì có tâm tỉ lệ là gốc tọa độ.
Nhận xét rằng khi phép biến đổi tỉ lệ thu nhỏ đối tượng, đối tượng sẽ được dời về
gần gốc tọa độ hơn, tương tự khi phóng lớn đối tượng, đối tượng sẽ được dịch
chuyển xa gốc tọa độ hơn.

Hình 3.2 – Phép biến đổi tỉ lệ với



2.3.5 Đối xứng qua điểm:
Phép đối xứng tâm là phép biến hình biến điểm I thành chính nó, biến mỗi
điểm M khác I thành M’ sao cho I là trung điểm của đoạn thẳng MM’
m

m

Ta có tâm đối xứng I(x,y) điểm M(x ,y ) điểm M’(x’,y’) được xác định bởi công
thức:
X’=2x- x


m

15


Y’=2y- y

m

2.3.6 Kết hợp phép quay và phép biến đổi tỷ lệ

Ta có điểm M biến đổi thành M 1 qua phép biến đổi tỉ lệ T1 rồi từ M1 biến đổi
thành M2 qua phép quay T2 . Như vậy biến đổi điểm M thành M2 kết hợp của 2 phép
biến đổi.
M T1


M1

T2-

M2

Thuật toán cài đặt
void QuayTiLe(int n,float tlx,float tly, float goc)
{
QuayDaGiac(n,goc);
TiLeDaGiac(n,tlx,tly);
VeDaGiac(n);

}

16


2.3.7 Kết hợp phép tịnh tiến và phép biến đổi tỉ lệ
Ta có điểm M biến đổi thành M1 qua phép tịnh tiến T1 rồi từ M1 biến đổi
thành M2 qua phép biến đổi tỉ lệ T2 . Như vậy biến đổi điểm M thành M2 kết hợp của
2 phép biến đổi.
M T1


M1

T2-

M2

Thuật toán cài đặt
void TinhTien_BienDoiTiLe(int n, float ttx,float tty,float tlx,float tly)
{
TinhTienDaGiac(n,ttx,tty);
TiLeDaGiac(n,tlx,tly);
VeDaGiac(n);
}

17


CHƯƠNG III. CÀI ĐẶT CHƯƠNG TRÌNH

#include "stdio.h"
#include "iostream.h"
#include "conio.h"
#include "math.h"
#include "dos.h"
#include "graphics.h"
float xw1,xw2,yw1,yw2,tlx,tly;
int xv1,xv2,yv1,yv2;

void cuaSo(float x1, float y1, float x2,float y2)
18


{
xw1=x1;yw1=y1;xw2=x2;yw2=y2;
}

void khungNhin(int x1,int y1,int x2, int y2)
{
xv1=x1;yv1=y1;xv2=x2;yv2=y2;
tlx=(xv2-xv1)/(xw2-xw1);
tly=(yv2-yv1)/(yw2-yw1);
}

void chuyenDen(float x, float y)
{
int xm = (int) (tlx*(x-xw1)+xv1);
int ym = (int) (tly*(yw2-y)+yv1);
moveto(xm,ym);
}


void veDen(float x, float y)
{
int xm = (int) (tlx*(x-xw1)+xv1);
int ym = (int) (tly*(yw2-y)+yv1);
lineto(xm,ym);
}
19


void veTrucToaDo()
{
chuyenDen(xw1,0);
veDen(xw2,0);
chuyenDen(0,yw1);
veDen(0,yw2);
float y = yw1 + 1;
while (y < yw2)
{
chuyenDen(-0.01,y);
veDen(0.01,y);
y++;
}
float x = xw1 + 1;
while (x < xw2)
{
chuyenDen(x,-0.01);
veDen(x,0.01);
x++;
}

}
void Boundary_fill (int xc,int yc,int mauto,int maubien,int color)
{
20


int mau_ht;
mau_ht= getpixel(xc,yc);
if ((mau_ht != maubien) && (mau_ht != mauto))
{
putpixel(xc,yc,color);
Boundary_fill(xc-1,yc,mauto,maubien,color);
Boundary_fill(xc+1,yc,mauto,maubien,color);
Boundary_fill(xc,yc-1,mauto,maubien,color);
Boundary_fill(xc,yc+1,mauto,maubien,color);
//S? d?ng d? quy d? ti?p t?c xét và tô màu cho 4 di?m lân c?n c?a di?m dang xét.
}
}
void ptb2(float a, float b, float c, int x[2])
{
float delta = b*b - 4*a*c;
x[0] = (int)((-b - sqrt(delta))/(2*a));
x[1] = (int)((-b + sqrt(delta))/(2*a));
}

void tomaudongquet(int xc,int yc,int r)
{
int ymin = yc - r + 1;
int ymax = yc + r - 1;
for (int ii = ymin ; ii <= ymax; ii++)

21


{
int x[2];
x[0] = 0;
x[1] = 0;
ptb2(1,(-2*xc),(pow(xc,2) - pow(r,2) + pow((ii-yc),2)),x);
setcolor(13);
if (x[0] > x[1])
{
int swap = x[0];
x[0] = x[1];
x[1] = swap;
}
line(x[0],ii,x[1],ii);
}
}
void duongtron_midpoint(int xc,int yc,int r,int color)
{

xc = (int) (tlx*(xc-xw1)+xv1);
yc = (int) (tly*(yw2-yc)+yv1);
int x,y;
x=0;
y=r;
int p=1-r;
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);
putpixel(xc + y, yc + x, color);
putpixel(xc - y, yc + x, color);
putpixel(xc + y, yc - x, color);
putpixel(xc - y, yc - x, color);

}
while (x{
if (p<0)
p+=2*x+3;
else
{
p+=2*(x-y)+5;
y--;
}
x++;
{
putpixel(xc + x, yc + y, color);
putpixel(xc - x, yc + y, color);
putpixel(xc + x, yc - y, color);
putpixel(xc - x, yc - y, color);
23



putpixel(xc + y, yc + x, color);
putpixel(xc - y, yc + x, color);
putpixel(xc + y, yc - x, color);
putpixel(xc - y, yc - x, color);
}
}tomaudongquet(xc,yc,r);
//Boundary_fill (xc,yc,12,2,12);
}
void Duongtron_BRE(int xc, int yc, int r,int color)
{

xc = (int) (tlx*(xc-xw1)+xv1);
yc = (int) (tly*(yw2-yc)+yv1);
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);
24


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++;
}
Boundary_fill (xc,yc,11,3,11);
}
void tinhtien(int xc,int yc, int r,int color)
{
float n1, n2,x1,y1;
cout<<"Nhap vecter tinh tien:\n";
cout<<" n1 = ";cin>>n1;
cout<<" n2 = "; cin>>n2;
Duongtron_BRE(xc+n1, yc+n2, r,11);

}
void kh_tinhtientyle(int xc,int yc, int r,int color)
25


×