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).
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);
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
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
- 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();
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()
{ 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); 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);
{
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ọ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);
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();
}
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");
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)
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>