47
Trn Văn To 11294111 Lp : DHTH7CLT BÀI TẬP TUẦN 3 1. Lấy lại code BT9 tuần 1 thêm vào 1 số lệnh của phép xoay 90 o ngược chiều kim đồng hồ để parabol có dạng như sau: trước khi xoay màu đen, sau khi xoay màu đỏ #include <windows.h> #include <glut.h> #include <math.h> typedef float MATRAN[3][3]; double PI=3.1415926535897932384626433832795; float goc=PI/2; const int width=640; const int height=480;

BaiTapTuan3

Embed Size (px)

Citation preview

Page 1: BaiTapTuan3

Trân Văn Teo

11294111

Lơp : DHTH7CLT

BÀI TẬP TUẦN 3

1. Lấy lại code BT9 tuần 1 thêm vào 1 số lệnh của phép xoay 90o ngược chiều kim đồng hồ để parabol có dạng như sau: trước khi xoay màu đen, sau khi xoay màu đỏ

#include <windows.h>

#include <glut.h>

#include <math.h>

typedef float MATRAN[3][3];

double PI=3.1415926535897932384626433832795;

float goc=PI/2;

const int width=640;

const int height=480;

int xtam=0,ytam=0;

void initQuay(MATRAN m)

{

m[0][0]=cos(goc);

Page 2: BaiTapTuan3

m[0][1]=sin(goc);

m[0][2]=0;

m[1][0]=-sin(goc);

m[1][1]=cos(goc);

m[1][2]=0;

m[2][0]=0;

m[2][1]=0;

m[2][2]=1;

}

void biendiem(int &xtam,int &ytam, MATRAN m)

{

int x1,y1;

x1=xtam*m[0][0] + ytam* m[1][0] + m[2][0];

y1=xtam*m[0][1]+ ytam*m[1][1] +m[2][1];

xtam=x1;

ytam=y1;

}

void myInit()

{

glClearColor(1.0,1.0,1.0,0.0);

glColor3f(0.0f,0.0f,0.0f);

glPointSize(4.0);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(0,width,0,height);

}

Page 3: BaiTapTuan3

int Round(double a)

{

return(int)(a+0.5);

}

void setPixel(int x,int y)

{

glBegin(GL_POINTS);

glVertex2i(x,y);

glEnd();

return;

}

void parabol(int xc, int yc,int a,MATRAN m)

{

int x, y;

int xa = Round(1.0*a/2);

int p = 2-a;

x=0; y=0;

setPixel(xc+x,yc+y);

setPixel(xc-x,yc+y);

while (x<xa) {

if (p<0)

p = p + 4*x + 6;

else {

p = p + 4*x - 2*a + 6;

Page 4: BaiTapTuan3

y++;

}

x++;

glColor3f(0.0,0.0,0.0);

setPixel(xc+x,yc+y);

setPixel(xc-x,yc+y);

xtam=x; // đăt biên phu để tranh điều kiện x thay doi thi while nó sai

ytam=y;

biendiem(xtam,ytam,m);

glColor3f(1.0,0.0,0.0);

setPixel(xc+xtam,yc+ytam);

xtam=-x;

ytam=y;

biendiem(xtam,ytam,m);

setPixel(xc+xtam,yc+ytam);

glColor3f(0.0,0.0,0.0);

}

p = 4*x*x + 4*x - 4*a*y - 4*a + 1 ;

while (y<230) {

if (p<0) {

p = p + 8*x - 4*a + 8;

x++;

}

else

p = p - 4*a;

y++;

Page 5: BaiTapTuan3

glColor3f(0.0,0.0,0.0);

setPixel(xc+x,yc+y);

setPixel(xc-x,yc+y);

xtam=x; // đăt biên phu để tranh điều kiện x thay doi thi while nó sai

ytam=y;

biendiem(xtam,ytam,m);

glColor3f(1.0,0.0,0.0);

setPixel(xc+xtam,yc+ytam);

xtam=-x;

ytam=y;

biendiem(xtam,ytam,m);

setPixel(xc+xtam,yc+ytam);

glColor3f(0.0,0.0,0.0);

}

return;

}

void myDisplay()

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(0,0,1.0);

glBegin(GL_LINES);

glVertex2i(150,200);

glVertex2i(450,200);

glVertex2i(300,100);

glVertex2i(300,430);

glEnd();

Page 6: BaiTapTuan3

glColor3f(1.0,0.0,0.0);

MATRAN m;

initQuay(m);

parabol(300,200,100,m);

glFlush();

}

int main(int argc,char* argv[])

{

glutInit(&argc, argv);//initialize the tool kit

glutInitDisplayMode(GLUT_SINGLE |GLUT_RGB);//set the display mode

glutInitWindowSize(640,480);//set window size

glutInitWindowPosition(100,150);// set window position on screen

glutCreateWindow("Bai 1");// open the screen window

glutDisplayFunc(myDisplay);

myInit();

glutMainLoop();

return 0;

}

Page 7: BaiTapTuan3

2. Lấy lại code BT8 tuần 1 thêm vào 1 số lệnh của phép biên dạng để ellipse thu nhỏ 2 lần có dạng như sau:

Trước khi thu nhỏ màu đỏ, sau khi thu nhỏ màu xanh dương

#include <windows.h>#include <gl.h>#include <glut.h>const GLint width =640;const GLint height= 480;typedef float MATRAN[3][3];void initTiLe(float sx,float sy,MATRAN m){

m[0][0]=sx;m[0][1]=0;m[0][2]=0;m[1][0]=0;m[1][1]=sy;m[1][2]=0;m[2][0]=0;m[2][1]=0;m[2][2]=1;

}void biendiem(int &x,int &y, MATRAN m){

int x1,y1;x1=x*m[0][0] + y* m[1][0] + m[2][0];

Page 8: BaiTapTuan3

y1=x*m[0][1]+y*m[1][1] +m[2][1];x=x1;y=y1;

}void myInit(){

glClearColor(1.0,1.0,1.0,0.0);glColor3f(0.0f, 1.0f, 0.0f);glPointSize(3.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, width, 0.0, height);

}void putPixel(GLint x, GLint y){

glBegin(GL_POINTS);glVertex2i(x,y);

glEnd();return;

}void put4pixel(int xc,int yc,int x,int y){ putPixel(xc+x,y+yc); putPixel(xc-x,y+yc); putPixel(xc-x,yc-y); putPixel(xc+x,yc-y); } //Ve eclipse theo theo thuat toan Bresenhamvoid eclipseBresenham(int xc, int yc, int a, int b,MATRAN m) {int xtam,ytam; int x,y; double z1,z2,p; x=0;y=b; z1=(double)(b*b)/(a*a); z2=(double)1/z1; p=2*z1-(2*b)+1; while(z1*(double)x/y<=1)

{glColor3f(1.0,0.0,0.0);

put4pixel(xc, yc, x, y);xtam=x;ytam=y;biendiem(xtam,ytam,m);

Page 9: BaiTapTuan3

glColor3f(0.0,0.0,1.0);put4pixel(xc, yc, xtam, ytam);glColor3f(1.0,0.0,0.0);

if (p<0) p+=2*z1*(2*x+3); else

{ p+=2*z1*(2*x+3)+4*(1-y); y--; } x++; } x=a;y=0; p=2*z2-2*a+1; while(z2*(double)y/x<=1)

{put4pixel(xc, yc, x, y);xtam=x;ytam=y;biendiem(xtam,ytam,m);glColor3f(0.0,0.0,1.0);put4pixel(xc, yc, xtam, ytam);glColor3f(1.0,0.0,0.0);

if (p<0) p+=2*z2*(2*y+3); else

{ p+=2*z2*(2*y+3)+4*(1-x); x--; } y++; }} void myDisplay(){

glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,1.0);glBegin(GL_LINES);

glVertex2i(50,height/2);glVertex2i(600,height/2);glVertex2i(width/2,50);glVertex2i(width/2,400);

glEnd();MATRAN m;initTiLe(0.5f,0.5f,m);

Page 10: BaiTapTuan3

eclipseBresenham(width/2,height/2,100,70,m);glFlush();

}int main(int argc, char* argv[]){

glutInit(&argc, argv); //initialize the tool kitglutInitDisplayMode(GLUT_SINGLE |GLUT_RGB);//set the display modeglutInitWindowSize(width, height); //set window sizeglutInitWindowPosition(100, 150); // set window position on screenglutCreateWindow("Bai 2"); // open the screen windowglutDisplayFunc(myDisplay);myInit();glutMainLoop();return 0;

}

3. Lấy lại code BT9 tuần 1 thêm vào 1 số lệnh của phép xoay 90o cùng chiều kim đồng hồ, sau đó thu nhỏ parabol 2 lần để parabol có dạng như sau: màu đen trước khi xoay, màu đỏ sau khi xoay 90o

cùng chiều kim đồng hồ, màu xanh thu nhỏ 2 lần

#include <windows.h>#include <glut.h>#include <math.h>typedef float MATRAN[3][3];typedef float MATRAN1[3][3];double PI=3.1415926535897932384626433832795;float goc=-PI/2;const int width=640;const int height=480;float sx=0.5f,sy=0.5f;void initQuay(MATRAN m)

Page 11: BaiTapTuan3

{m[0][0]=cos(goc);m[0][1]=sin(goc);m[0][2]=0;

m[1][0]=-sin(goc);m[1][1]=cos(goc);m[1][2]=0;

m[2][0]=0;m[2][1]=0;m[2][2]=1;

}void initQuay_Tile(MATRAN1 m){

m[0][0]=sx*cos(goc);m[0][1]=sy*sin(goc);m[0][2]=0;

m[1][0]=-sx*sin(goc);m[1][1]=sy*cos(goc);m[1][2]=0;

m[2][0]=0;m[2][1]=0;m[2][2]=1;

}void biendiem(int &xtam,int &ytam, MATRAN m){

int x1,y1;x1=xtam*m[0][0] + ytam* m[1][0] + m[2][0];y1=xtam*m[0][1]+ ytam*m[1][1] +m[2][1];xtam=x1;ytam=y1;

}void myInit(){ glClearColor(1.0,1.0,1.0,0.0); glColor3f(0.0f,0.0f,0.0f);

Page 12: BaiTapTuan3

glPointSize(3.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,width,0,height);}

//ham lam tronint Round(double a){return(int)(a+0.5);}

// ham set pixelvoid setPixel(int x,int y){ glBegin(GL_POINTS); glVertex2i(x,y); glEnd();return;}

// vẽ parabolvoid parabol(int xc, int yc,int a,MATRAN m,MATRAN1 m1){

int xtam=0,ytam=0;

int x, y;int xa = Round(1.0*a/2);int p = 2-a;

x=0; y=0;glColor3f(0.0,0.0,0.0);setPixel(xc+x,yc+y);setPixel(xc-x,yc+y);

while (x<xa) {if (p<0)

p = p + 4*x + 6;else {

p = p + 4*x - 2*a + 6;y++;

}

Page 13: BaiTapTuan3

x++;

setPixel(xc+x,yc+y);setPixel(xc-x,yc+y);xtam=x;ytam=y;

glColor3f(1.0,0.0,0.0); // mau do ve hinh 2biendiem(xtam,ytam,m); // bien cung thu 1setPixel(xc+xtam,yc+ytam);xtam=-x;ytam=y;biendiem(xtam,ytam,m); // bien cung thu 2setPixel(xc+xtam,yc+ytam);

glColor3f(0.0,0.0,1.0); // mau xanh ve hinh 3

xtam=x;ytam=y;biendiem(xtam,ytam,m1); // ve cung 1setPixel(xc+xtam,yc+ytam);

xtam=-x;ytam=y;biendiem(xtam,ytam,m1); // ve cung 2setPixel(xc+xtam,yc+ytam);

glColor3f(0.0,0.0,0.0); // quay ve mau den ban dau

}p = 4*x*x + 4*x - 4*a*y - 4*a + 1 ;while (y<230) {

if (p<0) {p = p + 8*x - 4*a + 8;x++;

}else

p = p - 4*a;y++;

setPixel(xc+x,yc+y);

Page 14: BaiTapTuan3

setPixel(xc-x,yc+y);xtam=x;ytam=y;

glColor3f(1.0,0.0,0.0); // mau do ve hinh 2biendiem(xtam,ytam,m); // bien cung thu 1setPixel(xc+xtam,yc+ytam);xtam=-x;ytam=y;biendiem(xtam,ytam,m); // bien cung thu 2setPixel(xc+xtam,yc+ytam);

glColor3f(0.0,0.0,1.0); // mau xanh ve hinh 3

xtam=x;ytam=y;biendiem(xtam,ytam,m1); // ve cung 1setPixel(xc+xtam,yc+ytam);

xtam=-x;ytam=y;biendiem(xtam,ytam,m1); // ve cung 2setPixel(xc+xtam,yc+ytam);

glColor3f(0.0,0.0,0.0); // quay ve mau den ban dau

}return;

}

void myDisplay(){ glClear(GL_COLOR_BUFFER_BIT); glColor3f(0,0,1.0);

glBegin(GL_LINES);glVertex2i(150,200);glVertex2i(450,200);glVertex2i(300,100);glVertex2i(300,430);

glEnd();glColor3f(1.0,0.0,0.0);

Page 15: BaiTapTuan3

HWND hWnd;MATRAN m;MATRAN1 m1;initQuay_Tile(m1);initQuay(m);

parabol(300,200,100,m,m1); glFlush();}

//hàm mainint main(int argc,char* argv[]){ glutInit(&argc, argv);//initialize the tool kit glutInitDisplayMode(GLUT_SINGLE |GLUT_RGB);//set the display mode glutInitWindowSize(640,480);//set window size glutInitWindowPosition(100,150);// set window position on screen glutCreateWindow("Bai 3");// open the screen window

glutDisplayFunc(myDisplay); myInit(); glutMainLoop();return 0;

}

4. Cài đặt thuật toan tô màu theo đường biên dùng đệ quy. Kêt quả như hình: màu biên màu đỏ, màu

tô màu xanh

Page 16: BaiTapTuan3

#include <windows.h>#include <glut.h>

void setPixel(int x, int y, GLfloat color[3]);void getPixel(int x, int y, GLfloat color[3]);bool ktTrungMau(GLfloat color1[3], GLfloat color2[3]);void FillLeft(int x, int y, GLfloat F_Color[3], GLfloat B_Color[3]);void FillTop(int x, int y, GLfloat F_Color[3], GLfloat B_Color[3]);void FillRight(int x, int y, GLfloat F_Color[3], GLfloat B_Color[3]);void FillBottom(int x, int y, GLfloat F_Color[3], GLfloat B_Color[3]);void BoundaryFillEnhanced(int x, int y, GLfloat F_Color[3], GLfloat B_Color[3]);void myInit();void myDisplay();

const int width=240;const int height=240;

int main(int argc,char* argv[]){

glutInit(&argc, argv);//initialize the tool kitglutInitDisplayMode(GLUT_SINGLE |GLUT_RGB);//set the display modeglutInitWindowSize(width,height);//set window sizeglutInitWindowPosition(100,150);// set window position on screenglutCreateWindow("Bai 4");// open the screen window

glutDisplayFunc(myDisplay);myInit();glutMainLoop();return 0;

}

void setPixel(int x, int y, GLfloat color[3]){

glRasterPos2i(x,y);glDrawPixels(1,1,GL_RGB,GL_FLOAT,color);return;

}

// trả về màu săc tại điểm x,y. màu thường được tạo thành tư đỏ luc lamvoid getPixel(int x, int y, GLfloat color[3]){

Page 17: BaiTapTuan3

glReadPixels(x,y,1,1,GL_RGB,GL_FLOAT,color);return;

}// khi kiểm tra màu, ta phải kiểm tra cả 3 màu của điểm này có trùng với điểm kia hay khôngbool ktTrungMau(GLfloat color1[3], GLfloat color2[3]){

if (color1[0]==color2[0] && color1[1]==color2[1] && color1[2]==color2[2])return true; // màu bi trùng rồi, không tô được

elsereturn false; // màu không bi trùng, tô vậy là tô được

}

void FillLeft(int x, int y, GLfloat F_Color[3], GLfloat B_Color[3]){

GLfloat color[3]; // màu hiện tại

getPixel(x,y,color); // lưu màu vào mảng color// nêu màu tô F_color và màu đường biên B_color khac với màu của môt điểm trong hình

thì tiên hành tôif(!ktTrungMau(F_Color,color)&& !ktTrungMau(B_Color,color)){

setPixel(x,y,F_Color);

FillLeft(x-1, y, F_Color, B_Color);FillTop(x, y+1, F_Color, B_Color);FillBottom(x, y-1, F_Color, B_Color);

}} // FillLeft

void FillTop(int x, int y, GLfloat F_Color[3], GLfloat B_Color[3]){

GLfloat color[3]; // màu hiện tại

getPixel(x,y,color);if(!ktTrungMau(F_Color,color)&& !ktTrungMau(B_Color,color)){

setPixel(x,y,F_Color);FillLeft(x-1, y, F_Color, B_Color);FillTop(x, y+1, F_Color, B_Color);FillRight(x+1, y, F_Color, B_Color);

}

} // FillTop

Page 18: BaiTapTuan3

void FillRight(int x, int y, GLfloat F_Color[3], GLfloat B_Color[3]){

GLfloat color[3]; // màu hiện tại

getPixel(x,y,color);if(!ktTrungMau(F_Color,color)&& !ktTrungMau(B_Color,color)){

setPixel(x,y,F_Color);FillTop(x, y+1, F_Color, B_Color);FillRight(x+1, y, F_Color, B_Color);FillBottom(x, y-1, F_Color, B_Color);

}

} // FillRight

void FillBottom(int x, int y, GLfloat F_Color[3], GLfloat B_Color[3]){

GLfloat color[3]; // màu hiện tại

getPixel(x,y,color);if(!ktTrungMau(F_Color,color)&& !ktTrungMau(B_Color,color)){

setPixel(x,y,F_Color);FillLeft(x-1, y, F_Color, B_Color);FillRight(x+1, y, F_Color, B_Color);FillBottom(x, y-1, F_Color, B_Color);

}

} // FillBottom

void BoundaryFillEnhanced(int x, int y, GLfloat F_Color[3], GLfloat B_Color[3]){

GLfloat color[3]; // màu hiện tại

getPixel(x,y,color);if(!ktTrungMau(F_Color,color)&& !ktTrungMau(B_Color,color)){

setPixel(x,y,F_Color);FillLeft(x-1, y, F_Color, B_Color);FillTop(x, y+1, F_Color, B_Color);FillRight(x+1, y, F_Color, B_Color);FillBottom(x, y-1, F_Color, B_Color);

}

Page 19: BaiTapTuan3

} // BoundaryFillEnhanced

void myInit(){

glClearColor(1.0,1.0,1.0,0.0);glColor3f(0.0f,0.0f,0.0f);glPointSize(1.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,width,0,height);

}

void myDisplay(){

glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glBegin(GL_LINE_LOOP);

glVertex2i(100,100);glVertex2i(100,130);glVertex2i(130,130);glVertex2i(130,100);

glEnd();

GLfloat F_Color[3]={0.0f,0.0f,1.0f};GLfloat B_Color[3]={1.0f,0.0f,0.0f};

BoundaryFillEnhanced(120,107,F_Color,B_Color);glFlush();

}

5. Lấy lại code BT8 tuần 1 thêm vào 1 số lệnh của phép quay để quay ellipse theo chiều kim đồng hồ 1 góc 45o có dạng như sau: màu đỏ trước khi xoay, màu xanh sau khi xoay

Page 20: BaiTapTuan3

#include <windows.h>#include <gl.h>#include <glut.h>#include <math.h>

const GLint width =640;const GLint height= 480;typedef float MATRAN[3][3];float PI=3.1415926535897932384626433832795;float goc=-PI/4;void initQuay(MATRAN m){

m[0][0]=cos(goc);m[0][1]=sin(goc);m[0][2]=0;

m[1][0]=-sin(goc);m[1][1]=cos(goc);m[1][2]=0;

m[2][0]=0;m[2][1]=0;m[2][2]=1;

}void biendiem(int &x,int &y, MATRAN m){

int x1,y1;

x1=x*m[0][0] + y* m[1][0] + m[2][0];

Page 21: BaiTapTuan3

y1=x*m[0][1]+y*m[1][1] +m[2][1];x=x1;y=y1;

}

void myInit(){

glClearColor(1.0,1.0,1.0,0.0);glColor3f(0.0f, 1.0f, 0.0f);glPointSize(3.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, width, 0.0, height);

}

void putPixel(GLint x, GLint y){

glBegin(GL_POINTS);glVertex2i(x,y);

glEnd();return;

}

//Ve eclipse theo theo thuat toan Bresenhamvoid eclipseBresenham(int xc, int yc, int a, int b,MATRAN m) {

int xtam,ytam; int x,y; double z1,z2,p; x=0;y=b; z1=(double)(b*b)/(a*a); z2=(double)1/z1; p=2*z1-(2*b)+1; while(z1*(double)x/y<=1)

{glColor3f(1.0,0.0,0.0);

putPixel(xc+x,y+yc);

putPixel(xc-x,y+yc); putPixel(xc-x,yc-y); putPixel(xc+x,yc-y);

Page 22: BaiTapTuan3

xtam=x;ytam=y;biendiem(xtam,ytam,m);glColor3f(0.0,0.0,1.0);putPixel(xc+xtam,ytam+yc);

xtam=-x;ytam=y;biendiem(xtam,ytam,m);putPixel(xc+xtam,ytam+yc);

xtam=-x;ytam=-y;biendiem(xtam,ytam,m);putPixel(xc+xtam,ytam+yc);

xtam=x;ytam=-y;biendiem(xtam,ytam,m);putPixel(xc+xtam,ytam+yc);

glColor3f(1.0,0.0,0.0);

if (p<0) p+=2*z1*(2*x+3); else

{ p+=2*z1*(2*x+3)+4*(1-y); y--; } x++; } x=a;y=0; p=2*z2-2*a+1; while(z2*(double)y/x<=1)

{glColor3f(1.0,0.0,0.0);putPixel(xc+x,y+yc);

putPixel(xc-x,y+yc); putPixel(xc-x,yc-y); putPixel(xc+x,yc-y);

xtam=x;

Page 23: BaiTapTuan3

ytam=y;biendiem(xtam,ytam,m);glColor3f(0.0,0.0,1.0);putPixel(xc+xtam,ytam+yc);

xtam=-x;ytam=y;biendiem(xtam,ytam,m);putPixel(xc+xtam,ytam+yc);

xtam=-x;ytam=-y;biendiem(xtam,ytam,m);putPixel(xc+xtam,ytam+yc);

xtam=x;ytam=-y;biendiem(xtam,ytam,m);putPixel(xc+xtam,ytam+yc);

if (p<0) p+=2*z2*(2*y+3); else

{ p+=2*z2*(2*y+3)+4*(1-x); x--; } y++; }}

void myDisplay(){

glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,1.0);glBegin(GL_LINES);

glVertex2i(50,height/2);glVertex2i(600,height/2);glVertex2i(width/2,50);glVertex2i(width/2,400);

glEnd();

MATRAN m;

Page 24: BaiTapTuan3

initQuay(m);eclipseBresenham(width/2,height/2,100,70,m);glFlush();

}

int main(int argc, char* argv[]){

glutInit(&argc, argv); //initialize the tool kitglutInitDisplayMode(GLUT_SINGLE |GLUT_RGB);//set the display modeglutInitWindowSize(width, height); //set window sizeglutInitWindowPosition(100, 150); // set window position on screenglutCreateWindow("Bai 5"); // open the screen window

glutDisplayFunc(myDisplay);myInit();glutMainLoop();return 0;

}

6. Lấy lại code BT9 tuần 1 thêm vào 1 số lệnh của phép xoay 45o ngược chiều kim đồng hồ để parabol có dạng như sau: màu đen trước khi xoay, màu đỏ sau khi xoay 45o ngược chiều kim đồng hồ

#include <windows.h>#include <glut.h>#include <math.h>typedef float MATRAN[3][3];double PI=3.1415926535897932384626433832795;float goc=PI/4;const int width=640;const int height=480;int xtam=0,ytam=0;

Page 25: BaiTapTuan3

void initQuay(MATRAN m){

m[0][0]=cos(goc);m[0][1]=sin(goc);m[0][2]=0;

m[1][0]=-sin(goc);m[1][1]=cos(goc);m[1][2]=0;

m[2][0]=0;m[2][1]=0;m[2][2]=1;

}void biendiem(int &xtam,int &ytam, MATRAN m){

int x1,y1;x1=xtam*m[0][0] + ytam* m[1][0] + m[2][0];y1=xtam*m[0][1]+ ytam*m[1][1] +m[2][1];xtam=x1;ytam=y1;

}

void myInit(){ glClearColor(1.0,1.0,1.0,0.0); glColor3f(0.0f,0.0f,0.0f); glPointSize(4.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0,width,0,height);}

//ham lam tronint Round(double a){return(int)(a+0.5);

Page 26: BaiTapTuan3

}

// ham set pixelvoid setPixel(int x,int y){ glBegin(GL_POINTS); glVertex2i(x,y); glEnd();return;}

// vẽ parabolvoid parabol(int xc, int yc,int a,MATRAN m){

int x, y;int xa = Round(1.0*a/2);int p = 2-a;

x=0; y=0;setPixel(xc+x,yc+y);setPixel(xc-x,yc+y);

while (x<xa) {if (p<0)

p = p + 4*x + 6;else {

p = p + 4*x - 2*a + 6;y++;

}x++;

glColor3f(0.0,0.0,0.0);setPixel(xc+x,yc+y);setPixel(xc-x,yc+y);xtam=x; // đăt biên phu để tranh điều kiện x thay doi thi while nó saiytam=y;

biendiem(xtam,ytam,m);glColor3f(1.0,0.0,0.0);

setPixel(xc+xtam,yc+ytam);

Page 27: BaiTapTuan3

xtam=-x; // đăt biên phu để tranh điều kiện x thay doi thi while nó saiytam=y;biendiem(xtam,ytam,m);

setPixel(xc+xtam,yc+ytam);glColor3f(0.0,0.0,0.0);

}p = 4*x*x + 4*x - 4*a*y - 4*a + 1 ;while (y<230) {

if (p<0) {p = p + 8*x - 4*a + 8;x++;

}else

p = p - 4*a;y++;

glColor3f(0.0,0.0,0.0);setPixel(xc+x,yc+y);setPixel(xc-x,yc+y);xtam=x; // đăt biên phu để tranh điều kiện x thay doi thi while nó saiytam=y;

biendiem(xtam,ytam,m);glColor3f(1.0,0.0,0.0);

setPixel(xc+xtam,yc+ytam);

xtam=-x; // đăt biên phu để tranh điều kiện x thay doi thi while nó saiytam=y;biendiem(xtam,ytam,m);

setPixel(xc+xtam,yc+ytam);glColor3f(0.0,0.0,0.0);

}return;

}

void myDisplay(){

Page 28: BaiTapTuan3

glClear(GL_COLOR_BUFFER_BIT); glColor3f(0,0,1.0);

glBegin(GL_LINES);glVertex2i(150,200);glVertex2i(450,200);glVertex2i(300,100);glVertex2i(300,430);

glEnd();glColor3f(1.0,0.0,0.0);

MATRAN m;initQuay(m);

parabol(300,200,100,m); glFlush();}

//hàm mainint main(int argc,char* argv[]){ glutInit(&argc, argv);//initialize the tool kit glutInitDisplayMode(GLUT_SINGLE |GLUT_RGB);//set the display mode glutInitWindowSize(640,480);//set window size glutInitWindowPosition(100,150);// set window position on screen glutCreateWindow("Bai 6");// open the screen window

glutDisplayFunc(myDisplay); myInit(); glutMainLoop();return 0;

}

7. Dùng thuật toan Bresenham vẽ Hyperbol ra giữa màn hình . Cửa sổ có kích thước

640x480

Page 29: BaiTapTuan3

#include <windows.h>#include <glut.h>#include <math.h>

const int width=640;const int height=480;

void myInit(){

glClearColor(1.0,1.0,1.0,0.0);glColor3f(0.0f,0.0f,0.0f);glPointSize(2.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,width,0.0,height);

}

//ham lam tronint Round(double a){

return(int)(a+0.5);}

// ham set pixelvoid setPixel(int x,int y){

glBegin(GL_POINTS);glVertex2i((x+300),(200-y));

glVertex2i((-x+300),(200-y));

Page 30: BaiTapTuan3

glVertex2i((x+300),(200+y));

glVertex2i((-x+300),(200+y));

glEnd();return;

}

void hyperbolBress(double a,double b){

//double x=a,y=0;//double d1 = (2*a*a) - (b*b) - (2*a*b*b);//setPixel(x,y);//while((a*a*y) <= (b*b*x))//{// if(d1<= (-1*b*b*0.5f))// {// d1+= 2*a*a*(2*y+3);// setPixel(x,y);// y++;// }// else// {// d1+= 2*a*a*(2*y+3) - 4*b*b*(x+1);// setPixel(x,y);// x++;// y++;// }

// //setPixel(x,y);

//}//d1 = a*a*(y+1)*(y+1) + a*a*y*y + 2*a*a*b*b - 2*a*a*b*b*(x+1)*(x+1);//while(y<100)//{// if(d1<= (a*a*0.5f))// {// d1+= a*a*4*(y+1) - 2-a*a*b*b*(2*x+3)*(2*x+3);// y++;// x++;// }// else

Page 31: BaiTapTuan3

// {// d1+= -2.0f*b*b*a*a*(2*x+3);// x++;// }// setPixel(x,y);

//}//---------------------------------------------------------------- Thu cach nayfloat x=a,y=0,d=b*b*4*a-4*a*a+b*b;setPixel(x,y);while (a*a*a*a>=x*x*(a*a-b*b)){

if (d<0) {

x++; d=d+b*b*8*x+8*b*b-a*a*8*y-12*a*a;

}else

d=d-a*a*8*y-12*a*a;y++;setPixel(x,y);if (y>100) break;

}

while (x<0){

if (d<0) d=d+b*b*8*x+12*b*b;else {

d=d+b*b*8*x+12*b*b-a*a*8*y-8*a*a;y++;

}x++;setPixel(x,y);

}

}void myDisplay(){

glClear(GL_COLOR_BUFFER_BIT);glColor3f(0,0,1.0);glBegin(GL_LINES);

Page 32: BaiTapTuan3

glVertex2i(150,200);glVertex2i(450,200);glVertex2i(300,100);glVertex2i(300,430);glEnd();glColor3f(1.0,0.0,0.0);

hyperbolBress(100,100);glFlush();

}

//hàm mainint main(int argc,char* argv[]){

glutInit(&argc, argv);//initialize the tool kitglutInitDisplayMode(GLUT_SINGLE |GLUT_RGB);//set the display modeglutInitWindowSize(640,480);//set window sizeglutInitWindowPosition(100,150);// set window position on screenglutCreateWindow("Bai 7");// open the screen window

glutDisplayFunc(myDisplay);myInit();glutMainLoop();return 0;

}

8. Lấy lại code BT7T3 thêm vào 1 số lệnh của phép xoay 90o ngược chiều kim đồng hồ để hyperbol có dạng như sau: màu đỏ là màu trước khi xoay, màu đen là màu sau khi xoay. Cửa sổ có kích thước 640x640.

Page 33: BaiTapTuan3

#include <windows.h>

#include <glut.h>

#include <math.h>

#include <math.h>

typedef float MATRAN[3][3];

double PI=3.1415926535897932384626433832795;

float goc=PI/2;

const int width=640;

const int height=480;

int xc=300;

int yc=200;

void initQuay(MATRAN m)

{

m[0][0]=cos(goc);

m[0][1]=sin(goc);

Page 34: BaiTapTuan3

m[0][2]=0;

m[1][0]=-sin(goc);

m[1][1]=cos(goc);

m[1][2]=0;

m[2][0]=0;

m[2][1]=0;

m[2][2]=1;

}

void myInit()

{

glClearColor(1.0,1.0,1.0,0.0);

glColor3f(0.0f,0.0f,0.0f);

glPointSize(2.0);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(0,width,0,height);

}

//ham lam tron

int Round(double a)

{

return(int)(a+0.5);

Page 35: BaiTapTuan3

}

// ham set pixel

void setPixel(int x,int y)

{

glBegin(GL_POINTS);

glVertex2i(x+xc,y+yc);

glEnd();

return;

}

void biendiem(int &xtam,int &ytam, MATRAN m)

{

int x1,y1;

x1=xtam*m[0][0] + ytam* m[1][0] + m[2][0];

y1=xtam*m[0][1]+ ytam*m[1][1] +m[2][1];

xtam=x1;

ytam=y1;

}

void hyperbolBress(double a,double b,MATRAN m)

{

int xtam=0,ytam=0;

float x=a,y=0,d=b*b*4*a-4*a*a+b*b;

glColor3f(1,0,0);

Page 36: BaiTapTuan3

setPixel(x,y);

setPixel(-x,y);

setPixel(-x,-y);

setPixel(x,-y);

while (a*a*a*a>=x*x*(a*a-b*b))

{

if (d<0)

{

x++;

d=d+b*b*8*x+8*b*b-a*a*8*y-12*a*a;

}

else

d=d-a*a*8*y-12*a*a;

y++;

setPixel(x,y);

setPixel(-x,y);

setPixel(-x,-y);

setPixel(x,-y);

xtam=x;

ytam=y;

glColor3f(0,0,0);

biendiem(xtam,ytam,m);

setPixel(xtam,ytam);

Page 37: BaiTapTuan3

xtam=x;

ytam=-y;

biendiem(xtam,ytam,m);

setPixel(xtam,ytam);

xtam=-x;

ytam=y;

biendiem(xtam,ytam,m);

setPixel(xtam,ytam);

xtam=-x;

ytam=-y;

biendiem(xtam,ytam,m);

setPixel(xtam,ytam);

glColor3f(1,0,0);

if (y>100) break;

}

while (x<0)

{

if (d<0) d=d+b*b*8*x+12*b*b;

else {

d=d+b*b*8*x+12*b*b-a*a*8*y-8*a*a;

y++;

Page 38: BaiTapTuan3

}

x++;

//setPixel(x,y);

glColor3f(0,0,0);

xtam=x;

ytam=y;

biendiem(xtam,ytam,m);

setPixel(xtam,ytam);

xtam=x;

ytam=-y;

biendiem(xtam,ytam,m);

setPixel(xtam,ytam);

xtam=-x;

ytam=y;

biendiem(xtam,ytam,m);

setPixel(xtam,ytam);

xtam=-x;

ytam=-y;

biendiem(xtam,ytam,m);

setPixel(xtam,ytam);

Page 39: BaiTapTuan3

glColor3f(1,0,0);

}

}

void myDisplay()

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(0,0,1.0);

glBegin(GL_LINES);

glVertex2i(150,200);

glVertex2i(450,200);

glVertex2i(300,50);

glVertex2i(300,430);

glEnd();

glColor3f(1.0,0.0,0.0);

MATRAN m;

initQuay(m);

hyperbolBress(100,100,m);

glFlush();

}

//hàm main

int main(int argc,char* argv[])

Page 40: BaiTapTuan3

{

glutInit(&argc, argv);//initialize the tool kit

glutInitDisplayMode(GLUT_SINGLE |GLUT_RGB);//set the display mode

glutInitWindowSize(640,480);//set window size

glutInitWindowPosition(100,150);// set window position on screen

glutCreateWindow("Bai 8");// open the screen window

glutDisplayFunc(myDisplay);

myInit();

glutMainLoop();

return 0;

}