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

code_ đồ họa máy tính_bản chuẩ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 (142.78 KB, 43 trang )

1
**********************************
DDA_line //trường hợp tổng quát k theo m
#include<graphics.h>
#define Round(a)(int )(a+0.5)
#define DELAY 10
Int color = RED;
Void DDA_line(int x1,int y1,int x2,int y2)
{
int x,dx,dy; float y;
x=1; y=y1; dx=x2-x1; dy=y2-y1;
float m=(float)dy/dx;
putpixel(x,Round(y),color);
while(x<x2)
{ DELAY(10); x++; y+=m;
putpixel(x,Round(y),color);
}
}
void main()
{
int gd,gm=0; gd=DETECT; initgraph(&gd,&gm,"C://TC//BGI");
setbkcolor(GREEN); int xA,xB,yB,yA;
cout<<"nhap diem A\n "; cout<<"xA= ";cin>>xA; //50
cout<<"yA= ";cin>>yA; //100
cout<<"nhap diem B \n"; cout<<"xB= ";cin>>xB; //130
cout<<"yB= ";cin>>yB; //200
DDA_line (xA,yA, xB, yB);
getch(); closegraph();
}
2
1.1 Cho điểm A có tọa độ (100,50) và điểm B có tọa độ (200,130).


- Trình bày thuật toán DDA tương ứng để vẽ đoạn thẳng AB (trình bày trường hợp hệ số góc 0<|m|<1).
- Viết hàm tương ứng để vẽ đoạn thẳng AB với màu bất kỳ.
- Viết hàm main() để kiểm nghiệm.
#include <conio.h>
#include <graphics.h>
#include <math.h>
#include <iostream.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define Round(a) long(a+0. 005) // lam tron so
void DDA(int x1, int y1, int x2, int y2, int C)
{ int x,y,dx,dy;
Randomize();
y=y1; dx = x2 - x1; dy = y2 - y1;
float m = float (y2 - y1)/(x2 - x1);
//Ve doan thang co HSG 0<m<1
if(0 <= m && m <= 1)
{ for(int i = 1; i < abs(x2 - x1); i++)
{
x++; y += m;
putpixel(x, Round(y), random(7));
}
cout<<"m1= "<<m;
}
}
void main()
{
int gd,gm=0; gd=DETECT; initgraph(&gd,&gm,"C://TC//BGI");
setbkcolor(GREEN);

DDA(100,50,200,130,random(7));
getch();
closegraph();
}
3
1. 2Cho điểm A có tọa độ (50,100) và điểm B có tọa độ (130,200).
- Trình bày thuật toán DDA tương ứng để vẽ đoạn thẳng AB (trình bày trường hợp hệ số góc |m|≥1).
- Viết hàm tương ứng để vẽ đoạn thẳng AB với màu bất kỳ.
Viết hàm main() để kiểm nghiệm.
#include <conio.h>
#include <graphics.h>
#include <math.h>
#include <iostream.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define Round(a) long(a+0. 005)
void DDA(int x1, int y1, int x2, int y2, int C)
{ int x,y,dx,dy;
Randomize();
y=y1; dx = x2 - x1; dy = y2 - y1;
float m = float (y2 - y1)/(x2 - x1);
//Ve doan thang co HSG |m|>=1
if(abs(m) >= 1)
{ for(int i = 1; i < abs(y2 - y1); i++)
{
y++; x += 1/m;
putpixel(x, round(y), random(7));
}
cout<<"m2= "<<m;

}
}
void main()
{
int gd,gm=0; gd=DETECT; initgraph(&gd,&gm,"C://TC//BGI");
setbkcolor(GREEN);
DDA(50,100,130,200,random(7));
getch(); closegraph();
}
1.3. Viết chương trình gồm:
4
- Hàm vẽ đoạn thẳng AB với màu bất kỳ theo thuật toán DDA ứng với trường hợp hệ số góc m của đường
thẳng đi qua A, B thỏa mãn |m|≥1.
- Hàm nhập tọa độ 2 điểm A, B trên màn hình sao cho đường thẳng đi qua A, B có hệ số góc m với |m|≥1.
- Hàm main() nhập màu nét vẽ và vẽ đoạn thẳng AB với màu vừa nhập.
#include <conio.h> #include <graphics.h> #include <math.h>
#include <iostream.h> #include <stdio.h> #include <math.h>
#define round(a) long(a+0. 005)
void DDA(int x1, int y1, int x2, int y2, int C)
{ int x,y,dx,dy;
y=y1; dx = x2 - x1; dy = y2 - y1;
float m = float (y2 - y1)/(x2 - x1);
//Ve doan thang co HSG |m|>=1
if(abs(m) >= 1)
{ for(int i = 1; i < abs(y2 - y1); i++)
{
y++; x += 1/m;
putpixel(x, round(y), 7);
}
cout<<"m2= "<<m;

}
}
void main()
{
int gd,gm=0; gd=DETECT; initgraph(&gd,&gm,"C://TC//BGI");
setbkcolor(GREEN);
int xA,xB,yB,yA;
cout<<"nhap diem A\n "; cout<<"xA= ";cin>>xA; //50
cout<<"yA= ";cin>>yA; //100
cout<<"nhap diem B \n"; cout<<"xB= ";cin>>xB; //130
cout<<"yB= ";cin>>yB; //200
DDA(xA,yA, xB, yB, 7);
getch();
closegraph();
}
1.4. Viết chương trình gồm:
5
- Hàm vẽ đoạn thẳng AB với màu bất kỳ theo thuật toán DDA ứng với trường hợp hệ số góc m của đường
thẳng đi qua A, B thỏa mãn 0<|m|<1.
- Hàm nhập tọa độ 2 điểm A, B trên màn hình sao cho đường thẳng đi qua A, B có hệ số góc m với 0<|m|
<1.
- Hàm main() nhập màu nét vẽ và vẽ đoạn thẳng AB.
#include <conio.h> #include <graphics.h> #include <math.h>
#include <iostream.h> #include <stdio.h> #include <math.h>
#define round(a) long(a+0. 005)
void DDA(int x1, int y1, int x2, int y2, int C)
{ int x,y,dx,dy;
y=y1; dx = x2 - x1; dy = y2 - y1;
float m = float (y2 - y1)/(x2 - x1);
//Ve doan thang co HSG 0<m<1

if(0 <= m && m <= 1)
{ for(int i = 1; i < abs(x2 - x1); i++)
{
x++; y += m;
putpixel(x, round(y), C);
}
cout<<"m1= "<<m;
}
}
void main()
{
int gd,gm=0; gd=DETECT; initgraph(&gd,&gm,"C://TC//BGI");
setbkcolor(GREEN);
int xA,xB,yB,yA,mt;
cout<<"nhap diem A\n "; cout<<"xA= ";cin>>xA; //100
cout<<"yA= ";cin>>yA; //50
cout<<"nhap diem B \n"; cout<<"xB= ";cin>>xB; //200
cout<<"yB= ";cin>>yB; //130
cout<<”nhap mau ve”; cin>>mt;
DDA(xA,yA, xB, yB, mt);
getch(); closegraph();
}
6
******************************************
BR_ line // trường hợp tổng quát k theo m
#include <conio.h> #include <graphics.h> #include <math.h>
#include <iostream.h> #include <stdio.h> #include <math.h>
#define Round(a) long(a+0. 005) // lam tron so
void Bre_line(int x1, int y1, int x2, int y2, int color)
{ int x,y,dx,dy,p;

y=y1; dx = x2 - x1; dy = y2 - y1; p=-dy-2*dx;
for(x=x1; x<=x2;x++)
{
putpixel(x,Round(y),7);
if(p>=0)
{
p+=-2*dy-2*dx; x ;
}
else
{ p+=-2*dx;
}
}
}
void main()
{ int gd,gm=0; gd=DETECT; initgraph(&gd,&gm,"C://TC//BGI");
setbkcolor(GREEN); int xA,xB,yB,yA;
cout<<"nhap diem A\n ";
cout<<"xA= ";cin>>xA;
cout<<"yA= ";cin>>yA;
cout<<"nhap diem B \n";
cout<<"xB= ";cin>>xB;
cout<<"yB= ";cin>>yB;
Bre_line(xA,yA, xB, yB, 7);
getch(); closegraph();
}
7
1.5. Cho điểm A có tọa độ (100,50) và điểm B có tọa độ (200,130).
- Trình bày thuật toán Bresenham tương ứng để vẽ đoạn thẳng AB (trình bày trường hợp hệ số góc 0<|m|
<1).
- Hãy tính tọa độ của 15 điểm đầu tiên khi vẽ đoạn thẳng AB

- Viết hàm tương ứng để vẽ đoạn thẳng AB với màu bất kỳ.
- Viết hàm main() để kiểm nghiệm.
#include <conio.h> #include <graphics.h> #include <math.h>
#include <iostream.h> #include <stdio.h> #include <math.h>
#define Round(a) long(a+0. 005)
void Bre_line(int x1, int y1, int x2, int y2, int color)
{ int x,y,dx,dy,p;
y=y1; dx = x2 - x1; dy = y2 - y1; p=2*dy-dx;
// vẽ đường thẳng với 0<m<1
for(x=x1; x<=x2;x++)
{ putpixel(x,Round(y),7);
if(p>=0)
{ p+=2*dy-2*dx; y++;
}
else
{ p+=2*dy;
}
}
}
void main()
{
int gd,gm=0; gd=DETECT;
initgraph(&gd,&gm,"C://TC//BGI");
setbkcolor(GREEN);
Bre_line(100,50, 200,130, 7);
getch();
closegraph();
}
8
1.6. Cho điểm A có tọa độ (50,100) và điểm B có tọa độ (130,200).

- Trình bày thuật toán Bresenham tương ứng để vẽ đoạn thẳng AB (trình bày trường hợp hệ số góc |m|≥1).
- Hãy tính tọa độ của 15 điểm đầu tiên khi vẽ đoạn thẳng AB
- Viết hàm tương ứng để vẽ đoạn thẳng AB với màu bất kỳ.
- Viết hàm main() để kiểm nghiệm.
#include <conio.h> #include <graphics.h> #include <math.h>
#include <iostream.h> #include <stdio.h> #include <math.h>
#define Round(a) long(a+0. 005)
void Bre_line(int x1, int y1, int x2, int y2, int color)
{ int x,y,dx,dy,p;
y=y1; dx = x2 - x1; dy = y2 - y1; p=dy-2*dx;
// vẽ đường thẳng với m>1
for(x=x1; x<=x2;x++)
{ putpixel(x,Round(y),7);
if(p<=0)
{
p+=2*dy-2*dx; x++;
}
else
{ p+=-2*dx;
}
}
}
void main()
{
int gd,gm=0; gd=DETECT;
initgraph(&gd,&gm,"C://TC//BGI");
setbkcolor(GREEN);
Bre_line(50,100, 130,200, 7);
getch();
closegraph();

}
9
1. 7. Viết chương trình gồm:
- Hàm vẽ đoạn thẳng AB với màu bất kỳ theo thuật toán Bresenham ứng với trường hợp hệ số góc m của
đường thẳng đi qua A, B thỏa mãn |m|≥1.
- Hàm nhập tọa độ 2 điểm A, B trên màn hình sao cho đường thẳng đi qua A, B có hệ số góc m với |m|≥1.
- Hàm main() nhập màu nét vẽ và vẽ đoạn thẳng AB với màu vừa nhập.
#include <conio.h> #include <graphics.h> #include <math.h>
#include <iostream.h> #include <stdio.h> #include <math.h>
#define Round(a) long(a+0. 005)
void Bre_line(int x1, int y1, int x2, int y2, int color)
{ int x,y,dx,dy,p;
y=y1; dx = x2 - x1; dy = y2 - y1; p=dy-2*dx;
// vẽ đường thẳng với m>1
for(x=x1; x<=x2;x++)
{ putpixel(x,Round(y),color);
if(p<=0)
{
p+=2*dy-2*dx; x++;
}
else
{ p+=-2*dx;
}
}
}
void main()
{ int gd,gm=0; gd=DETECT; initgraph(&gd,&gm,"C://TC//BGI");
setbkcolor(GREEN);
int xA,xB,yB,yA, mt; cout<<"nhap diem A\n "; cout<<"xA= ";cin>>xA;
cout<<"yA= ";cin>>yA;

cout<<"nhap diem B \n"; cout<<"xB= ";cin>>xB;
cout<<"yB= ";cin>>yB;
cont<<”nhap mau ve”; cin>>mt; Bre_line(xA,yA,xB,yB,mt);
getch(); closegraph();
}
1. 8. Viết chương trình gồm:
10
- Hàm vẽ đoạn thẳng AB với màu bất kỳ theo thuật toán Bresenham ứng với trường hợp hệ số góc m của
đường thẳng đi qua A, B thỏa mãn 0<|m|<1.
- Hàm nhập tọa độ 2 điểm A, B trên màn hình sao cho đường thẳng đi qua A, B có hệ số góc m với 0<|m|
<1.
- Hàm main() nhập màu nét vẽ và vẽ đoạn thẳng AB.
#include <conio.h>#include <graphics.h>#include <math.h>
#include <iostream.h>#include <stdio.h>#include <math.h>
#define Round(a) long(a+0. 005)
void Bre_line(int x1, int y1, int x2, int y2, int color)
{ int x,y,dx,dy,p;
y=y1; dx = x2 - x1; dy = y2 - y1; p=2*dy-dx;
// vẽ đường thẳng với 0<m<1
for(x=x1; x<=x2;x++)
{ putpixel(x,Round(y),color);
if(p>=0)
{ p+=2*dy-2*dx;y++;
}
else
{ p+=2*dy;
}
}
}
void main()

{ int gd,gm=0; gd=DETECT; initgraph(&gd,&gm,"C://TC//BGI");
setbkcolor(GREEN); int xA,xB,yB,yA, mt;
cout<<"nhap diem A\n "; cout<<"xA= ";cin>>xA; //100
cout<<"yA= ";cin>>yA; //50
cout<<"nhap diem B \n"; cout<<"xB= ";cin>>xB; //200
cout<<"yB= ";cin>>yB; //130
cont<<”nhap mau ve”; cin>>mt; //7
Bre_line(xA,yA,xB,yB,mt);
getch(); closegraph();
}
*****************************************
11
MID_line // trường hợp tổng quát k theo m
1. 9. Cho điểm A có tọa độ (100,50) và điểm B có tọa độ (200,130).
- Trình bày thuật toán Midpoint tương ứng để vẽ đoạn thẳng AB (trình bày trường hợp hệ số góc 0<|m|<1).
- Hãy tính tọa độ của 15 điểm đầu tiên khi vẽ đoạn thẳng AB
- Viết hàm tương ứng để vẽ đoạn thẳng AB với màu bất kỳ.
Viết hàm main() để kiểm nghiệm
#include <conio.h>#include <graphics.h>#include <math.h>
#include <iostream.h>#include <stdio.h>#include <math.h>
#define Round(a) long(a+0. 005)
void Mid(int x1, int y1, int x2, int y2, int color)
{ int x,y,dx,dy,d;
y=y1; dx = x2 - x1; dy = y2 - y1; d=dy-dx/2;
// Khoi tao cac gia tri ban dau
// vẽ đường thẳng với 0<|m|<1).
for(x=x1; x<=x2;x++)
{
putpixel(x,Round(y),color);
if(d<=0)

{ d+=dy;
}
else
{ y++; d+=dy-dx;
}
}
}
void main()
{ int gd,gm=0; gd=DETECT; initgraph(&gd,&gm,"C://TC//BGI");
setbkcolor(GREEN);Mid(100,50,200,130,7);
getch();
closegraph();
}
1. 10. Cho điểm A có tọa độ (50,100) và điểm B có tọa độ (130,200).
- Trình bày thuật toán Midpoint tương ứng để vẽ đoạn thẳng AB (trình bày trường hợp hệ số góc |m|≥1).
12
- Hãy tính tọa độ của 15 điểm đầu tiên khi vẽ đoạn thẳng AB
- Viết hàm tương ứng để vẽ đoạn thẳng AB với màu bất kỳ.
- Viết hàm main() để kiểm nghiệm.
#include <conio.h>#include <graphics.h>#include <math.h>
#include <iostream.h>#include <stdio.h>#include <math.h>
void Mid(int x1, int y1, int x2, int y2, int color)
{ int x,y,dx,dy,d;
y=y1; dx = x2 - x1; dy = y2 - y1; d=dy-dx/2;
// ve duong thang voi m>1
for(x=x1; x<=x2;x++)
{ putpixel(x,y,color);
if(d>=0)
d+=dy;
else

{ x++; d+=-dy-dx;
}
}
}
void main()
{
int gd,gm=0; gd=DETECT;
initgraph(&gd,&gm,"C://TC//BGI");
setbkcolor(GREEN);
Mid(50,100,130,200,7);
getch();
closegraph();
}
13
1. 11. Viết chương trình gồm:
- Hàm vẽ đoạn thẳng AB với màu bất kỳ theo thuật toán Midpoint ứng với trường hợp hệ số góc m của
đường thẳng đi qua A, B thỏa mãn |m|≥1.
- Hàm nhập tọa độ 2 điểm A, B trên màn hình sao cho đường thẳng đi qua A, B có hệ số góc m với |m|≥1.
- Hàm main() nhập màu nét vẽ và vẽ đoạn thẳng AB với màu vừa nhập.
#include <conio.h>#include <graphics.h>#include <math.h>
#include <iostream.h>#include <stdio.h>#include <math.h>
void Mid(int x1, int y1, int x2, int y2, int color)
{ int x,y,dx,dy,d;
y=y1; dx = x2 - x1; dy = y2 - y1; d=dy-dx/2;
// v? du?ng th?ng v?i m>1
for(x=x1; x<=x2;x++)
{ putpixel(x,y,color);
if(d>=0)
d+=dy;
else

{ x++; d+=-dy-dx;
}
}
}
void main()
{ int gd,gm=0; gd=DETECT; initgraph(&gd,&gm,"C://TC//BGI");
setbkcolor(GREEN); int xA,xB,yB,yA, mt;
cout<<"nhap diem A\n "; cout<<"xA= ";cin>>xA; //50
cout<<"yA= ";cin>>yA; //100
cout<<"nhap diem B \n"; cout<<"xB= ";cin>>xB; //130
cout<<"yB= ";cin>>yB; //200
cout<<"nhap mau ve"; cin>>mt; Mid(xA,yA,xB,yB,mt);
getch(); closegraph();
}
1. 12. Viết chương trình gồm:
- Hàm vẽ đoạn thẳng AB với màu bất kỳ theo thuật toán Midpoint ứng với trường hợp hệ số góc m của
đường thẳng đi qua A, B thỏa mãn 0<|m|<1.
14
- Hàm nhập tọa độ 2 điểm A, B trên màn hình sao cho đường thẳng đi qua A, B có hệ số góc m với 0<|m|
<1.
- Hàm main() nhập màu nét vẽ và vẽ đoạn thẳng AB.
#include <conio.h>#include <graphics.h>#include <math.h>
#include <iostream.h>#include <stdio.h>#include <math.h>
#define Round(a) long(a+0. 005)
void Mid(int x1, int y1, int x2, int y2, int color)
{ int x,y,dx,dy,d;
y=y1; dx = x2 - x1; dy = y2 - y1; d=dy-dx/2;
// vẽ đường thẳng với m>1
for(x=x1; x<=x2;x++)
{ putpixel(x,Round(y),color);

if(d<=0)
{ d+=dy;
}
else
{ y++; d+=dy-dx;
}
}
}
void main()
{ int gd,gm=0; gd=DETECT; initgraph(&gd,&gm,"C://TC//BGI");
setbkcolor(GREEN); int xA,xB,yB,yA, mt;
cout<<"nhap diem A\n "; cout<<"xA= ";cin>>xA; //100
cout<<"yA= ";cin>>yA; //50
cout<<"nhap diem B \n"; cout<<"xB= ";cin>>xB; //200
cout<<"yB= ";cin>>yB; //130
cont<<”nhap mau ve”; cin>>mt;Mid(xA,yA,xB,yB,mt);
getch(); closegraph();
}
2.1
- Trình bày thuật toán Breseham để vẽ cung số 1 của đường tròn.
- Tính tọa độ của 25 điểm đầu tiên khi vẽ cung tròn này.
15
- Viết hàm tương ứng để vẽ cung tròn với màu bất kỳ và chương trình kiểm nghiệm (với màu nét vẽ, tọa độ
tâm và bán kính đường tròn nhập từ bàn phím)
#include <graphics.h>#include <conio.h>
void Bresenham_Circle(int xc, int yc, int Radius, int color)
{
int x, y, d;
x = 0; y = Radius; d = 3 - 2 * Radius;
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++;
}
}
void main()
{ int gr_drive = DETECT, gr_mode; initgraph(&gr_drive, &gr_mode, "");
Bresenham_Circle(getmaxx() / 2, getmaxy() / 2, 70, 4);
Bresenham_Circle(getmaxx() / 2, getmaxy() / 2, 150, 5);
Bresenham_Circle(getmaxx() / 2, getmaxy() / 2, 200, 6);
getch(); closegraph();
}
Tọa độ 25 điểm đầu tiên : O(50,50), R=25(bắt đầu vẽ từ cung tròn thứ 2) (x,y)
1(50,25), 2(51,25.02), 3(52,25.08), 4(53,25.18), 5(54,25.32), 6(55,25.5), 7(56,25.73), 8(57,26), 9(58,26.31),
10(59,26.68), 11(60,27.09), 12(61,27.55), 13(62,28.07), 14(63,28.65), 15(64,29.29), 16 (65,30),
17(66,30.79), 18(67,31.67),19(68,32.65), 20(69,33.75), 21(70,35), 22(71,36.44), 23(72,38.16), 24(73,40.2),
25(74,43)
2. 1
- Trình bày thuật toán Midpoint để vẽ cung số 1 của đường tròn.

- Tính tọa độ của 25 điểm đầu tiên khi vẽ cung tròn này.
16
- Viết hàm tương ứng để vẽ cung tròn với màu bất kỳ và chương trình kiểm nghiệm (với màu nét vẽ, tọa độ
tâm và bán kính đường tròn nhập từ bàn phím)
#include <graphics.h>#include <conio.h>
void CircleMidPoint (int xc, int yc,int R, int color)
{ int x, y, p;
x = 0; y = R; p = 1 - R; // 5/4-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 (p < 0) p += 2*x + 3;
else
{ p += 2*(x -y) + 5; y ;
}
x++;
}
}
void main()
{ int gr_drive = DETECT, gr_mode;
initgraph(&gr_drive, &gr_mode, "C://TC//BGI");
CircleMidPoint(getmaxx() / 2, getmaxy() / 2, 70, 12);
getch(); closegraph();
}

Tọa độ 25 điểm đầu tiên : O(50,50), R=25(bắt đầu vẽ từ cung tròn thứ 2) (x,y)
1(50,25), 2(51,25.02), 3(52,25.08), 4(53,25.18), 5(54,25.32), 6(55,25.5), 7(56,25.73), 8(57,26), 9(58,26.31),
10(59,26.68), 11(60,27.09), 12(61,27.55), 13(62,28.07), 14(63,28.65), 15(64,29.29), 16 (65,30),
17(66,30.79), 18(67,31.67),19(68,32.65), 20(69,33.75), 21(70,35), 22(71,36.44), 23(72,38.16), 24(73,40.2),
25(74,43)
3.1Trình bày thuật toán Breseham để vẽ cung số 1 của Elip.
- Tính tọa độ của 25 điểm đầu tiên khi vẽ cung Elip này.
17
- Viết hàm tương ứng để vẽ cung Elip với màu bất kỳ và chương trình kiểm nghiệm (với màu nét vẽ, tọa độ
tâm và các bán trục Elip nhập từ bàn phím)
#include<graphics.h> #include <conio.h>
void BR_ellipse(int xcenter,int ycenter,int xradius,int yradius, int color)
{ int x,y; float c,p;
x=0; y=yradius; c=(float)yradius/xradius; c=c*c; p=2*c-2*yradius+1;
while (c*x<=y)
{ putpixel(xcenter+x,ycenter+y,color);
putpixel(xcenter-x,ycenter+y,color);
putpixel(xcenter+x,ycenter-y,color);
putpixel(xcenter-x,ycenter-y,color);
if (p<0) p += 2*c*(2*x+3);
else
{ p +=4*(1-y)+2*c*(2*x+3); y ;
} x++;
}
y=0;x=xradius;
c= (float)xradius/yradius;
c=c*c; p=2*c-2*xradius+1;
while (c*y<=x)
{ putpixel(xcenter+x,ycenter+y,color);
putpixel(xcenter-x,ycenter+y,color);

putpixel(xcenter+x,ycenter-y,color);
putpixel(xcenter-x,ycenter-y,color);
if (p<0) p +=2*c*(2*y+3);
else { p +=4*(1-x)+2*c*(2*y+3); x ;
} y++;
}}
void main()
{ int gr_drive = DETECT, gr_mode; initgraph(&gr_drive, &gr_mode, "C://TC//BGI");
BR_ellipse (getmaxx() / 2, getmaxy() / 2, 150, 80, 4);
getch(); closegraph(); }
3.2Trình bày thuật toán Midpoint để vẽ cung số 1 của đường Elip.
- Tính tọa độ của 25 điểm đầu tiên khi vẽ cung Elip này.
18
- Viết hàm tương ứng để vẽ cung Elip với màu bất kỳ và chương trình kiểm nghiệm (với màu nét vẽ, tọa độ
tâm và các bán trục Elip nhập từ bàn phím)
#include<graphics.h>#include <conio.h>
#define ROUND(a) ((long)(a+0.5))
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);
putpixel(xc-x, yc-y, color);
}
void Mid_ellipse(int xc, int yc, int a, int b, int color){
long 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*a));
while (fx < fy)
{
x++; fx += 2*b2;
if (p<0)
p += b2*(2*x +3); // p=p + b2 (2x +3)
else
{ y ; p+= b2*(2*x +3) + a2*(-2*y +2);
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;
if (p>=0)
p+=a2*(3 - 2*y); p =p + a2(3-2y)
else{
x++; fx += 2*b2; p += b2*(2*x+2) + a2*(-2*y +3);
}
plot(xc, yc, x, y, color);
}
}
void main()
{
int gr_drive = DETECT, gr_mode;
initgraph(&gr_drive, &gr_mode, "");
Mid_Ellipse(getmaxx() / 2, getmaxy() / 2, 150, 80, 4); getch();
closegraph();
}

4.Các thuật toán tô màu
19
1. Tô màu đường biên:
Bắt đầu tù 1 điểm (x,y) trong vùng cần đk tô màu
- Xác định màu điểm : getpixel(x,y,c)
- Tô màu putpixel(x,y,c)
Kiểm tra thuộc tính màu các điểm lân cận
- Điểm lân cận đã tô màu : exit
- Trùng với màu đường biên : exit
- Nếu không thì tô màu
Các phương pháp xác định điểm lân cận
- 4-connected
- 8-connected
#include<graphics.h>
#include<conio.h>
void FloodFill(int x,int y,int in_color,int new_color){
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 main(){
int gr_drive = DETECT, gr_mode;
initgraph(&gr_drive,&gr_mode,"C:/TC/BGI");
circle(getmaxx()/2,getmaxy()/2,30);
FloodFill(getmaxx()/2,getmaxy()/2,0,4);
getch();

closegraph();
}
20
2. Giải thuật dòng quét(scanline)
- Giải thuật dừa trên ý tưởng sử dụng 1 đường quét trên trục ycuar màn hình đi từ y_max đến y_min của
vùng cần đk tô màu
- Với mỗi giá trị y=yi đường thẳng quét cắt các đường biên của vùng cần tô tọa ra đoạn thẳng y=yi với x
thuộc[x_min,x_max]. Trên đoạn thẳng đó chúng ta tô màu các điểm tương ứng đi từ x_min đến x_max có
các điểm tô (xi,yi) thuộc y=yi.
#include <conio.h>
#include <graphics.h>
#include <math.h>
#include <iostream.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
void scanline(int x1,int y1,int x2,int y2,int c)
{
for(int i=x1;i<=x2;i++)
{
for(int j=y1;j<=y2;j++)
{
putpixel(i,j,c);
}
}
}
void main()
{
int gd,gm=0; gd=DETECT;
initgraph(&gd,&gm,"C://TC//BGI");

setbkcolor(GREEN);
int mt;
cout<<"nhap mau to :";cin>>mt;
scanline(100,50,200,130,mt);
getch();
closegraph();
}
21
**************************
Dòng quét đa giác :
- Vùn tô đk xác định bởi 1 đa giác n đỉnh : Pi(xi,yi), i=0…n-1
- Ý tưởng thuật toán:
• Tìm giá trị y_top và y_bottom của đa giác
• Y_top = max(yi với (xi,yi)thuộc P)
• Y_bottom = min(yi với (xi,yi)thuộc P)
• Với mỗi dòng quét ngang y=k, k từ y_bottom -> y_top
- tìm tất cả các hoàng độ giao điểm với các cạnh đa giác
- sắp xếp theo thứ tự tăng dần x0,x1,x2…
- tô màu các đoạn thẳng trên đường y=k nằm trong các đoạn (x0,x1),(x2,x3),…(x2i,x2i+1)
22
3. Tô loang
- B1:khởi tọa 1 điểm nằm trong vùng tô.
- B2:thực hiện tô loang dần theo chiều ngang(trái qua phải và phải qua trái) cho đến khi đụng biên thì dừng
lại.
- B3:ứng với mỗi điểm trên dòng quét ngang, thực hiện loang để tìm những điểm ảnh có hoành độ nhỏ nhất
sát với biên chưa đk tô nằm trên và dưới , sau đó lưu vào stack
- B4:lặp lại B2 nếu còn 1 điểm trong stack chưa đk tô.
#include<conio.h>
#include<stdio.h>
#include<graphics.h>

void tomauloang(int x,int y,int mb,int mt)
{
if(getpixel(x,y)!=mb&&getpixel(x,y)!=mt)
{
putpixel(x,y,mt);
tomauloang(x,y+1,mb,mt);
tomauloang(x,y-1,mb,mt);
tomauloang(x-1,y,mb,mt);
tomauloang(x+1,y,mb,mt);
}
}
void main()
{
int m=DETECT,mode=0;
initgraph(&m,&mode,"C:/TC/BGI");
circle(200,200,30);
tomauloang(200,200,30,15);
getch();
23
5.không gian 2D
5.2 Trên mặt phẳng tọa độ thực Oxy, cho hàm số y=2x+3. Giả sử cần vẽ đồ thị của hàm số trên đoạn [-
5,5] lên màn hình với khung nhìn (50,10)x(120,70).
- Hãy tính tọa độ của gốc tọa độ O trên màn hình trong trường hợp này.
- Vẽ đồ thị hàm số trên cùng với hệ trục tọa độ Oxy.

#include "iostream.h" #include "stdio.h" #include "conio.h"
#include "graphics.h" #include "dos.h" #include "math.h"
int xv1,yv1,xv2,yv2,xw1,xw2,yw1,yw2; // cac toa cua cua cua so va khung nhin
float tlx,tly; // ty le
void cuaso(float x1,float y1,float x2,float y2)

{
xw1=x1; xw2=x2; yw1=y1;yw2=y2; // khoi tao cua so
}
void khungnhin(float x1,float y1,float x2,float y2)
{
xv1=x1;yv1=y1; xv2=x2; yv2=y2; // khung nhin
tlx=(float)(xv2-xv1)/(xw2-xw1); // tinh ty le x
tly=(float)(yv2-yv1)/(yw2-yw1); // tinh ty le y
}
void cdqs(float x,float y, int *x1,int *y1)
{
*x1=(int)(tlx*(x-xw1)+xv1);
*y1=(int)(tly*(yw2-y)+yv1);
}
void chuyenden(float x,float y)
{
int xm,ym;
cdqs(x,y,&xm,&ym);
moveto(xm,ym);
}
void veden(float x,float y)
{
int xm,ym;
cdqs(x,y,&xm,&ym);
24
lineto(xm,ym);
}
void main()
{
int mh=0;

int mode;
float pi=3.14;
initgraph(&mh,&mode,"C://TC//BGI");
// Phương trình hs
cuaso(-pi,-1.5,pi*3,1.5); // tao cua so hien thi anh thuc
khungnhin(50,10,120,70); // khung nhin tren man hinh
line(50,35,120,35);
line(60,10,60,70);
outtextxy(40,85,"0") ;
float dx=0.01; // buoc nhay
float x=xw1;
float y=2*x+3;
chuyenden(x,y);
setcolor(1);
while(x<xw2)
{
x+=dx;
y=2*x+3;
veden(x,y);
delay(10);
}
getch();
closegraph();
}
25
***************************************
XÉN TỈA
#include <conio.h>
#include <graphics.h>
#include <math.h>

#include <stdlib.h>
#define ROUND(a) ((double)(a+0.5)
#define TRUE 1
#define FALSE 0
int cliptest(double p, double q, double *u1, double *u2)
{
double r;
int retVal = TRUE;
if (p < 0.0)
{
r = q / p;
if (r > *u2)
retVal = FALSE;
else
if (r > *u1)
*u1 = r;
}
else
if ( p > 0.0)
{
r = q / p;
if (r < *u1)
retVal = FALSE;
else
if (r < *u2)
*u2 = r;
}
else

×