Đây là phần chương thứ 2: Các thuật toán cơ sở. Dành cho các sinh viên học môn Đồ họa máy tính. Với các thuật toán cơ sở cùng các ví dụ cụ thể giúp các bạn sinh viên dễ dàng học tập và nâng cao trình độ.
Trang 1//Đoạn thẳng Bresenham, Mid-Point
#include "graphics.h"
void dt_Br_TH3(int xa, int ya, int xb, int yb) {
if (xa>xb)
{
int tg=xa; xa=xb; xb=tg;
tg=ya; ya=yb; yb=tg;
}
int dx=xb-xa;
int dy=yb-ya;
int const1=2*dy;
int const2=2*dy-2*dx;
int p=2*dy-dx;
int x=xa; int y=ya;
int mau=getcolor();
while(x<=xb)
{
putpixel(x, y, mau);
x++;
if (p<0)
{
p+=const1;
}
else
{
p+=const2;
y++;
}
}
}
void dt_Br_TH4(int xa, int ya, int xb, int yb) {
if (xa>xb)
{
int tg=xa; xa=xb; xb=tg;
tg=ya; ya=yb; yb=tg;
}
int dx=xb-xa;
int dy=yb-ya;
int const1=2*dy;
int const2=2*dy+2*dx;
int p=2*dy+dx;
Trang 2int x=xa; int y=ya;
int mau=getcolor();
while(x<=xb)
{
putpixel(x, y, mau);
x++;
if (p>0)
p+=const1;
else
{
p+=const2;
y ;
}
}
}
void dt_Br_TH5(int xa, int ya, int xb, int yb) {
if (ya>yb)
{
int tg=xa; xa=xb; xb=tg;
tg=ya; ya=yb; yb=tg;
}
int dx=xb-xa;
int dy=yb-ya;
int const1=2*dx;
int const2=2*dx-2*dy;
int p=2*dx-dy;
int x=xa; int y=ya;
int mau=getcolor();
while(y<=yb)
{
putpixel(x, y, mau);
y++;
if (p<0)
{
p+=const1;
}
else
{
p+=const2;
x++;
}
Trang 3}
}
void dt_Br_TH6(int xa, int ya, int xb, int yb) {
if (ya>yb)
{
int tg=xa; xa=xb; xb=tg;
tg=ya; ya=yb; yb=tg;
}
int dx=xb-xa;
int dy=yb-ya;
int const1=2*dx;
int const2=2*dx+2*dy;
int p=2*dx+dy;
int x=xa; int y=ya;
int mau=getcolor();
while(y<=yb)
{
putpixel(x, y, mau);
y++;
if (p>0)
p+=const1;
else
{
p+=const2;
x ;
}
}
}
int main()
{
int gd=0; int gm;
initgraph(&gd, &gm, "");
setcolor(2);
dt_Br_TH3(100, 50,300, 200);
getch();
closegraph();
return 0;
}
Trang 4//Đường tròn Bresenham
#include "graphics.h"
void ve8diem(int x, int y, int xa, int ya, int color) {
putpixel(x+xa, y+ya, color);
putpixel(-x+xa, y+ya, color);
putpixel(x+xa, -y+ya, color);
putpixel(-x+xa, -y+ya, color);
putpixel(y+xa, x+ya, color);
putpixel(-y+xa, x+ya, color);
putpixel(y+xa, -x+ya, color);
putpixel(-y+xa, -x+ya, color);
}
void duongtron_B(int xa, int ya, int r)
{
int x=0; int y=r; int p=3-2*r;
int mau=getcolor();
while (x<=y)
{
ve8diem(x, y, xa, ya, mau);
if (p>0)
{
p+=4*(x-y)+10;
y ;
}
else
p+=4*x+6;
x++;
}
}
int main()
{
int gd=0; int gm;
initgraph(&gd, &gm, "");
setcolor(2);
duongtron_B(300,200,100);
getch();
closegraph();
return 0;
}
Trang 5// Cohen-Surtheland clipping
#include<graphics.h>
void kod(int xw1, int yw1, int xw2, int yw2, int x, int y, int b[], int &b10)
{
for(int i=0; i<4;i++) b[i]=0;
if(x<xw1) b[0]=1;
if(x>xw2) b[1]=1;
if(y<yw1) b[2]=1;
if(y>yw2) b[3]=1;
b10=b[3]*8+b[2]*4+b[1]*2+b[0];
}
void clipping_Cohen_Surtheland(int xw1, int yw1, int xw2, int yw2, int xa, int ya, int xb, int yb) {
bool ketthuc=false;
int A[4], B[4];
int A10, B10;
while(!ketthuc)
{
kod(xw1,yw1,xw2,yw2,xa, ya, A, A10);
kod(xw1,yw1,xw2,yw2,xb, yb, B, B10);
if((A10==0)&&(B10==0)) //TH1
{
line(xa, ya, xb, yb);
ketthuc=true;
}
else
if((A10&B10)!=0) //TH2
{
ketthuc=true;
}
else
{
//TH3
if(A10==0)
{
int tg=xa; xa=xb; xb=tg;
tg=ya; ya=yb; yb=tg;
kod(xw1,yw1,xw2,yw2,xa, ya, A, A10);
}
float m=(float)(yb-ya)/(xb-xa);
if (A[0]==1)
{
ya=(int) (m*(xw1-xa)+ya+0.5);
Trang 6xa=xw1;
} else
if (A[1]==1)
{
ya=(int) (m*(xw2-xa)+ya+0.5);
xa=xw2;
} else
if (A[2]==1)
{
xa=(int) ((1/m)*(yw1-ya)+xa+0.5);
ya=yw1;
} else
if (A[3]==1)
{
xa=(int) (1/m*(yw2-ya)+xa+0.5);
ya=yw2;
} } }
}
int main()
{
int gd=0,gm;
initgraph(&gd, &gm,"");
// Truoc khi cat
rectangle(100, 100, 300, 250);
setcolor(4);
line(100, 50, 400, 300);
getch();
// Sau khi cat
setcolor(0);
line(100, 50, 400, 300);
setcolor(YELLOW);
clipping_Cohen_Surtheland(100, 100, 300, 250,100, 50, 400, 300);
getch();
closegraph();
}
// Liang-Basky clipping
#include<graphics.h>
void clipping_Liang_Basky(int xw1, int yw1, int xw2, int yw2, int xa, int ya, int xb, int yb) {
int dx=xb-xa;
int dy=yb-ya;
Trang 7int p[4], q[4];
p[0]=-dx; p[1]=dx;
p[2]=-dy; p[3]=dy;
q[0]=xa-xw1; q[1]=-xa+xw2;
q[2]=ya-yw1; q[3]=-ya+yw2;
float t1=1, t2=0; float tam;
for(int i=0; i<4; i++)
{
tam=(float) q[i]/p[i];
if(p[i]>0)
if (t1>tam) t1=tam;
if(p[i]<0)
if(t2<tam) t2=tam;
}
int xa1=(int) (xa + t1*dx + 0.5);
int ya1=(int) (ya + t1*dy + 0.5);
int xb1=(int) (xa + t2*dx + 0.5);
int yb1=(int) (ya + t2*dy + 0.5);
line(xa1, ya1, xb1, yb1);
}
int main()
{
int gd=0,gm;
initgraph(&gd, &gm,"");
// Truoc khi cat
rectangle(100, 100, 300, 250);
line(100, 50, 400, 300);
getch();
// Sau khi cat
setcolor(2);
clipping_Liang_Basky(100, 100, 300, 250,100, 50, 400, 300);
getch();
closegraph();
}
#include<graphics.h>
void tomauHTCB(int xa, int xb, int xc, int xd, int ymin, int ymax, int mt) {
int xm1, xm2;
float m1=(float)(ymax-ymin)/(xd-xa);
float m2=(float)(ymax-ymin)/(xc-xb);
Trang 8int color=getcolor();
setcolor(mt);
for (int y=yamin; y<=ydmax; y++)
{
xm1=(int)((1/m1)*(y-ymin)+xa+0.5);
xm2=(int)((1/m2)*(y-ymin)+xb+0.5);
line(xm1,y,xm2,y);
}
setcolor(color);
}
int main()
{
initwindow(640,480);
tomauHTCB(200,350,550,130,100,300,5);
getch();
closegraph();
}
#include <graphics.h>
void tomau_biennua(int x, int y, int mb, int mt, int i) {
int x1,x2;
setcolor(mt);
do
{
x1=x; x2=x;
while (getpixel(x1-1,y)!=mb) x1 ;
while (getpixel(x2+1,y)!=mb) x2++;
line(x1,y,x2,y);
while(getpixel(x1,y+i)==mb)x1++;
x=x1; y=y+i;
delay(5);
}
while (x1<=x2);
}
void tomau_bien(int x, int y, int mb, int mt)
{
tomau_biennua(x,y,mb,mt,1);
tomau_biennua(x,y,mb,mt,-1);
}
int main()
{
Trang 9initwindow(640, 480);
setcolor(4);
circle(300,200,100);
tomau_bien(300,200,4,2);
getch();
closegraph();
}
#include <graphics.h>
void tomau_loang(int x, int y, int mb, int mt) {
if((getpixel(x,y)!=mb)&&(getpixel(x,y)!=mt)) {
putpixel(x,y,mt);
tomau_loang(x,y-1,mb,mt);
tomau_loang(x-1,y,mb,mt);
tomau_loang(x,y+1,mb,mt);
tomau_loang(x+1,y,mb,mt);
delay(5);
}
}
int main()
{
initwindow(640, 480);
setcolor(4);
circle(300,200,100);
tomau_loang(300,200,4,2);
getch();
closegraph();
}