Upload
tran-van-teo
View
18
Download
0
Embed Size (px)
Citation preview
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);
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);
}
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;
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++;
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();
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;
}
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];
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);
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);
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)
{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);
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++;
}
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);
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);
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
#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]){
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
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);
}
} // 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
#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];
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);
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;
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;
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;
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);
}
// 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);
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(){
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
#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));
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
// {// 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);
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.
#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);
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);
}
// 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);
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);
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++;
}
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);
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[])
{
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;
}