Thuật toán đường thẳng đường tròn , tô màu loang,tô màu biên , tô màu da giác.... ..........................................................................................đồ họa máy tính , các bài tập đồ họa máy tính....
Trang 1ĐƯỜNG THẲNG
#include<coniọh>
#include<iostream>
#include<graphics.h>
using namespace std;
int color=GREEN;
void ĐĂint x1, int y1, int x2, int y2)
{
int Dx=x2-x1, Dy=y2-y1;
float m=(float)Dx/Dy;
int x=x1;
float y=y1;
putpixel(x,round(y),color);
for(int i=x;i<x2;i++)
{
x++;
y+=m;
putpixel(x,round(y),color);
}
}
void TangChamBR(int x1,int y1,int x2,int
y2)
{
int dx,dy,p,c1,c2;
int x,y;
dx=x2-x1;
dy=y2-y1;
p=2*dy-dx;
c1=2*dy;
c2=2*(dy-dx);
x=x1;
y=y1;
putpixel(x,y,color);
for(int i=x1;i<x2;i++)
{
if(p<0) p+=c1;
else
{
p+=c2;
y++;
}
x++;
putpixel(x,y,color);
}
void TangNhanhBR(int x1,int y1,int x2,int y2) {
int dx,dy,p,c1,c2;
int x,y;
dx=x2-x1;
dy=y2-y1;
p=2*dx-dy;
c1=2*dx;
c2=2*(dx-dy);
x=x1;
y=y1;
putpixel(x,y,color);
for(int i=y1;i<y2;i++) {
if(p<0) p+=c1;
else p+=c2;
x++;
} y++;
putpixel(x,y,color);
}
Trang 2void GiamChamBR(int x1,int y1,int x2,int
y2)
{
int dx,dy,p,c1,c2;
int x,y;
dx=x2-x1;
dy=y2-y1;
p=-2*dy-dx;
c1=-2*dy;
c2=-2*(dy+dx);
x=x1;
y=y1;
putpixel(x,y,color);
for(int i=x1;i<x2;i++)
{
if(p<0) p+=c1;
else
{
p+=c2;
y ;
}
x++;
putpixel(x,y,color);
}
}
void GiamNhanhBR(int x1,int y1,int x2,int y2) {
int dx,dy,p,c1,c2;
int x,y;
dx=x2-x1;
dy=y2-y1;
p=-2*dx-dy;
c1=-2*dx;
c2=-2*(dy+dx);
x=x1;
y=y1;
putpixel(x,y,color);
for(int i=y1;i<y2;i++) {
if(p<0) p+=c1;
else { p+=c2;
x ;
} y++;
putpixel(x,y,color);
} } int main() {
initwindow(640,480);
ĐĂ2,2,8,4);
//TangChamBR(50,80,200,130);
//TangNhanhBR(50,60,80,120);
//GiamChamBR(50,130,200,80);
GiamNhanhBR(70,80,50,200);
getch();
}
Trang 3ĐƯỜNG TRÒN BRE
void diem8DTronBR(int x,int y,int xc,int
yc)
{
putpixel(x+xc,y+yc,color);
putpixel(x+xc,-y+yc,color);
putpixel(-x+xc,y+yc,color);
putpixel(-x+xc,-y+yc,color);
putpixel(y+xc,x+yc,color);
putpixel(y+xc,-x+yc,color);
putpixel(-y+xc,x+yc,color);
putpixel(-y+xc,-x+yc,color);
}
void bresenhamDTron(int xc,int yc,int r)
{
int x,y,p;
x=0;
y=r;
diem8DTronBR(x,y,xc,yc);
p=3-2*r;
while(x<y)
{
if(p<0) p+=4*x+6;
else
{
p+=4*(x-y)+10;
y ;
}
x++;
diem8DTronBR(x,y,xc,yc);
}
}
int main()
{
initwindow(640,480);
bresenhamDTron(200,200,80);
getch();
ĐƯỜNG TRÒN MIDPOINT
void diem8DTronMP(int x,int y,int xc,int yc) {
putpixel(x+xc,y+yc,color);
putpixel(x+xc,-y+yc,color);
putpixel(-x+xc,y+yc,color);
putpixel(-x+xc,-y+yc,color);
putpixel(y+xc,x+yc,color);
putpixel(y+xc,-x+yc,color);
putpixel(-y+xc,x+yc,color);
putpixel(-y+xc,-x+yc,color);
} void midpointDTron(int xc,int yc,int r) {
int x,y,p;
x=0;
y=r;
diem8DTronMP(x,y,xc,yc);
p=1-r;
while(x<y) {
if(p<0) p+=2*x+3;
else { p+=2*(x-y)+5;
y ;
} x++;
diem8DTronMP(x,y,xc,yc);
} } int main() {
initwindow(640,480);
midpointDTron(200,200,80);
getch();
}
Trang 4CUNG TRÒN (8- Cung)
void diem(int x,int y,int xc,int yc)
{
putpixel(x+xc,y+yc,color);
}
void Cung1(int xc,int yc,int r)
{
int x,y,p;
x=0;
y=r;
diem(x,y,xc,yc);
p=1-r;
while(x<y)
{
if(p<0) p+=2*x+3;
else
{
p+=2*(x-y)+5;
y ;
}
x++;
diem(x,y,xc,yc);
}
}
void Cung2(int xc,int yc,int r)
{
int x,y,p;
x=0;
y=r;
diem(x,y,xc,yc);
p=1-r;
while(abs(x)<=y)
{
if(p<0) p+=2*abs(x)+3;
else
{
p+=2*(abs(x)-y)+5;
y ;
}
x ;
diem(x,y,xc,yc);
}
}
void Cung3(int xc,int yc,int r) {
int x,y,p;
y=0;
x=-r;
diem(x,y,xc,yc);
p=1-r;
while(abs(y)<=abs(x)) {
if(p<0) p+=2*abs(y)+3; else
{ p+=2*(abs(y)-abs(x))+5; x++;
} y++;
diem(x,y,xc,yc);
} }
void Cung4(int xc,int yc,int r) {
int x,y,p;
y=0;
x=-r;
diem(x,y,xc,yc);
p=1-r;
while(abs(y)<=abs(x)) {
if(p<0) p+=2*abs(y)+3; else
{ p+=2*(abs(y)-abs(x))+5; x++;
} y ;
diem(x,y,xc,yc);
} }
Trang 5void Cung5(int xc,int yc,int r)
{
int x,y,p;
x=0;
y=-r;
diem(x,y,xc,yc);
p=1-r;
while(abs(x)<=abs(y))
{
if(p<0) p+=2*abs(x)+3;
else
{
p+=2*(abs(x)-abs(y))+5;
y++;
}
x ;
diem(x,y,xc,yc);
}
}
void Cung6(int xc,int yc,int r)
{
int x,y,p;
x=0;
y=-r;
diem(x,y,xc,yc);
p=1-r;
while(abs(x)<=abs(y))
{
if(p<0) p+=2*abs(x)+3;
else
{
p+=2*(abs(x)-abs(y))+5;
y++;
}
x++;
diem(x,y,xc,yc);
}
}
void Cung7(int xc,int yc,int r) {
int x,y,p; y=0;
x=r;
diem(x,y,xc,yc);
p=1-r;
while(abs(y)<x) {
if(p<0) p+=2*abs(y)+3;
else { p+=2*(abs(y)-x)+5; x ; }
y ;
diem(x,y,xc,yc);
} } void Cung8(int xc,int yc,int r) {
int x,y,p; y=0; x=r;
diem(x,y,xc,yc);
p=1-r;
while(abs(y)<x) {
if(p<0) p+=2*abs(y)+3;
else { p+=2*(abs(y)-x)+5; x ; }
y++;
diem(x,y,xc,yc);
} } int main() {
initwindow(640,480);
Cung1(200,200,80);
Cung2(200,200,80);
Cung3(200,200,80);
Cung4(200,200,80);
Cung5(200,200,80);
Cung6(200,200,80);
Cung7(200,200,80);
Cung8(200,200,80);
getch();
Trang 6TÔ MÀU LOANG
int mt=RED;
int mb=WHITE;
using namespace std;
void MauLoang4(int x,int y,int mb,int mt)
{
while(getpixel(x,y)!=mb &&
getpixel(x,y)!=mt)
{
putpixel(x,y,mt);
MauLoang4(x-1,y,mb,mt);
MauLoang4(x+1,y,mb,mt);
MauLoang4(x,y-1,mb,mt);
MauLoang4(x,y+1,mb,mt);
}
}
void MauLoang8(int x,int y,int mb,int mt)
{
while(getpixel(x,y)!=mb &&
getpixel(x,y)!=mt)
{
putpixel(x,y,mt);
MauLoang8(x-1,y,mb,mt);
MauLoang8(x+1,y,mb,mt);
MauLoang8(x,y-1,mb,mt);
MauLoang8(x,y+1,mb,mt);
MauLoang8(x-1,y+1,mb,mt);
MauLoang8(x-1,y-1,mb,mt);
MauLoang8(x+1,y-1,mb,mt);
MauLoang8(x+1,y+1,mb,mt);
}
}
int main() {
initwindow(500,500);
/*Tô màu đường tròn circle(200,200,80);
MauLoang4(200,200,mb,mt); MauLoang8(200,200,mb,mt);*/ /*Tô màu tam giác
line(100,100,200,200);
line(100,100,300,100);
line(300,100,200,200);
MauLoang4(200,150,mb,mt); MauLoang8(200,150,mb,mt);*/ /*Tô màu hình thang
line(100,100,500,100);
line(100,100,200,300);
line(200,300,300,300);
line(500,100,300,300);
MauLoang4(300,200,mb,mt); MauLoang8(300,200,mb,mt);*/ getch();
}
Trang 7TÔ MÀU BIÊN
int mb=WHITE;
int mt=RED;
void MauBien(int x, int y, int i, int mb)
{
int x1=x,x2=x;
while(getpixel(x1-1,y)!=mb) x1=x1-1;
while(getpixel(x2+1,y)!=mb) x2=x2+1;
setcolor(mt);
line(x1,y,x2,y);
while(getpixel(x1,y+i)==mb)
x1=x1+1;
if(x1<=x2)
{
x=x1;
y=y+i;
MauBien(x,y,i,mb);
}
}
int main()
{
initwindow(640,480);
/*Tô màu đường tròn
circle(200,200,80);
MauBien(200,200,-1,mb);
MauBien(200,200,1,mb);*/
/*Tô màu tam giác
line(100,100,200,200);
line(100,100,300,100);
line(300,100,200,200);
MauBien(200,150,-1,mb);
MauBien(200,150,1,mb);*/
//Tô màu hình thang
line(100,100,500,100);
line(100,100,200,300);
line(200,300,300,300);
line(500,100,300,300);
MauBien(300,200,-1,mb);
MauBien(300,200,1,mb);
getch();
TÔ MÀU DÒNG QUYÉT
int mt=RED;
int mb=WHITE;
void DongQuetHinhThang(int y1,int y2,int xa,int xb,int xc,int xd)
{ int y=y1,x1,x2;
while(y<=y2) {
x1=(xd-xa)/(y2-y1)*(y-y1)+xa;
x2=(xc-xb)/(y2-y1)*(y-y1)+xb;
setcolor(mt);
line(x1,y,x2,y);
y++;
} } void DongQuetHCN(int l,int r,int t,int b,int mt) {
for(int i=b;i<=t;i++) for(int j=l;j<=r;j++) putpixel(j,i,mt);
} main() { initwindow(640,480);
setcolor(mb);
//DongQuetHinhThang(100,200,100,500,300,200)
; DongQuetHCN(100,300,200,100,mt);
getch();
}
Trang 8DÒNG QUÉT ĐA GIÁC
struct ToaDo2D
{
int x,y;
};
void Nhap(int &n,ToaDo2D a[])
{
cout<<"\nNhap so dinh cho da giac:";
cin>>n;
for(int i=1; i<=n; i++)
{
cout<<"\n a["<<i<<"].x=";
cin>>a[i].x;
cout<<"\n a["<<i<<"].y=";
cin>>a[i].y;
}
}
void VeDaGiac(int n,ToaDo2D a[])
{
int i,j;
for (i=1; i<=n; i++)
{
if (i==n) j=1;
else j=i+1;
line(a[i].x,a[i].y,a[j].x,a[j].y);
}
}
int min(int a,int b)
{
return (a<b)?a:b;
}
int max(int a,int b)
{
return (a>b)?a:b;
}
void Scanline(int n,ToaDo2D a[]) {
//Tim minx, maxx int x,minx,maxx; minx=a[1].x;
maxx=a[1].x;
for (int i=2; i<=n; i++) {
if (a[i].x<minx) minx=a[i].x;
if (a[i].x>maxx) maxx=a[i].x;
}
//Quet tu minx > maxx for (x=minx+1; x<=maxx-1; x++) {
int m=0,z[50]; //so giao diem //Duyet qua cac canh
for (int i=1; i<=n; i++) {
int t=i+1;
if (i==n) t=1;
int s=i-1;
if (i==1) s=n;
if (x==a[i].x)
{ if((x>min(a[s].x,a[t].x))&&(x<max(a[s].x,a[ t].x)))
{ m++; z[m]=a[i].y;
} else { m++;
z[m]=a[i].y;
m++;
z[m]=a[i].y;
} } else if((x>min(a[i].x,a[t].x))&&(x<max(a[t].x,a[i].x))) { ++m; float r;
r = (a[t].y-a[i].y)/(a[t].x-a[i].x); z[m]=(int)(r*(x-a[i].x))+a[i].y;
}
Trang 9//Sap xep cac giao diem theo thu tu tang
dan
for (int i=1; i<m; i++)
for (int k=i+1; k<=m; k++)
if (z[i]>z[k])
{
int tg=z[i];
z[i]=z[k];
z[k]=tg;
}
//To mau tu giao diem le dem giao
diem chan
for (int k=1; k<=m-1; k++)
if (k%2!=0) line(x,z[k],x,z[k+1]);
}
}
int main()
{
int n,gd=0,gm;
initwindow(640,480);
ToaDo2D a[100];
Nhap(n,a);
VeDaGiac(n,a);
Scanline(n,a);
getch();
}
}
Trang 10ĐỒ THỊ Y=2*X+3
float xw1, xw2, yw1, yw2, tlx, tly;
int xv1,xv2,yv1,yv2;
void cuaso(float x1, float y1, float x2, float
y2)
{
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=float(xv2-xv1)/(xw2-xw1);
tly=float(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);
}
main() { int mh=0;
int mode;
float pi=3.14;
initwindow(640,480);
cuaso(-1,-1.5,0.5,1.5); // tao cua so hien thi anh thuc
khungnhin(240,140,390,240); // khung nhin tren man hinh
line(0,250,640,250);
line(333,0,333,480);
outtextxy(330,247,"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();
}
Trang 11ĐỒ THỊ Y=COS X.
float xw1, xw2, yw1, yw2, tlx, tly;
int xv1,xv2,yv1,yv2;
void cuaso(float x1, float y1, float x2, float
y2)
{
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=float(xv2-xv1)/(xw2-xw1);
tly=float(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);
}
main() { int mh=0;
int mode;
float pi=3.14;
initwindow(640,480);
cuaso(-pi,-1,2*pi,1); // tao cua so hien thi anh thuc
khungnhin(200,200,400,300); // khung nhin tren man hinh
line(0,250,640,250);
line(333,0,333,480);
outtextxy(330,247,"0");
float dx=0.01; // buoc nhay float x=xw1;
float y=cos(x);
chuyenden(x,y);
setcolor(1);
while(x<xw2) {
x+=dx;
y=cos(x);
veden(x,y);
} getch();
}