1. Trang chủ
  2. » Cao đẳng - Đại học

Các thuật toán cơ sở (Đồ họa máy tính)

9 47 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 9
Dung lượng 52,57 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Đâ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 2

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_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 6

xa=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 7

int 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 8

int 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 9

initwindow(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();

}

Ngày đăng: 14/07/2020, 21:07

TỪ KHÓA LIÊN QUAN

w