Professional Documents
Culture Documents
Dohoa
Dohoa
Chương trình earth01.cpp vẽ hình trái đất quay xung quanh mặt
trời
#include "Gl/glut.h"
static int year = 0, day = 0; /* Thong so chi thoi gian trong nam va
thoi gian trong ngay de xac dinh vi tri cua trai dat tren quy dao va xac
dinh goc quay cua no quanh tam */
/* Khoi tao */
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
// Chuc nang cho phep loai bo mot phan cua doi tuong bi che boi doi
tuong khac
glEnable(GL_DEPTH_TEST);
glShadeModel (GL_FLAT);
}
void display(void)
{
// xoa color buffer va depth buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix(); // luu lai ma tran hien hanh
glColor3f (1.0, 0, 0); // thiet lap mau ve la mau do
// ve mat troi la mot luoi cau co tam tai goc toa do
glutWireSphere(1.0, 20, 16);
/* di chuyen den vi tri moi de ve trai dat */
// quay mot goc tuong ung voi thoi gian trong nam
glRotatef ((GLfloat) year, 0.0, 1.0, 0.0);
// tinh tien den vi tri hien tai cua trai dat tren quy dao quanh mat
troi
glTranslatef (2.0, 0.0, 0.0);
// quay trai dat tuong ung voi thoi gian trong ngay
glRotatef ((GLfloat) day, 0.0, 1.0, 0.0);
glColor3f (0, 0, 1.0); // thiet lap mau ve la mau blue
glutWireSphere(0.2, 10, 8); // ve trai dat
// phuc hoi lai ma tran hien hanh cu: tuong ung voi quay lai vi tri
ban dau
glPopMatrix();
glutSwapBuffers();
}
/* xu ly khi cua so bi thay doi */
void reshape (int w, int h)
{
// Thay doi kich thuoc viewport
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
/* Thao tac tren chieu */
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
// Chieu phoi canh
gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
/* Thao tac tren ModelView */
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// Thiet lap view
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
/* xu ly su kien keyboard */
void keyboard (unsigned char key, int x, int y)
{
switch (key) {
case 'd': day = (day + 10) % 360;
glutPostRedisplay();
break;
case 'D': day = (day - 10) % 360;
glutPostRedisplay();
break;
case 'y': year = (year + 5) % 360;
glutPostRedisplay();
break;
case 'Y':
year = (year - 5) % 360;
glutPostRedisplay();
break;
default:
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
1.1 Chương trình linebres01
#include <GL/glut.h>
#include <stdio.h>
#include <math.h>
void init(void)
{
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,400.0,0.0,400.0);
}
void setPixel(GLint x,GLint y)
{
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
}
void line()
{
int x0 = 50, y0=50, xn = 300, yn = 150, x, y;
int dx, dy, //deltas
pk, //decision parameter
k; //looping variable
glClear(GL_COLOR_BUFFER_BIT);
glColor3f( 1 ,0, 0);
setPixel(x0, y0); //plot first point
// difference between starting and ending points
dx = xn - x0;
dy = yn - y0;
pk = 2 * dy - dx;
x = x0; y = y0;
for ( k = 0; k < dx-1; ++k ) {
if ( pk < 0 ) {
pk = pk + 2 * dy; //calculate next pk
//next pixel: (x+1, y )
} else {
//next pixel: (x+1, y+1)
pk = pk + 2*dy - 2*dx; //calculate next pk
++y;
}
++x;
setPixel( x, y );
}
glFlush();
}
int main(int argc,char **argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(0,0);
glutInitWindowSize(500,500);
glutCreateWindow("Bresenham Line");
init();
glutDisplayFunc( line );
glutMainLoop();
return 0;
}
#include <gl/glut.h>
using namespace std;
void drawDot (GLint x, GLint y, GLfloat r, GLfloat g, GLfloat b)
{
glColor3f(r,g,b);
glBegin (GL_POINTS);
glVertex2i (x,y);
glEnd();
}
void symmetricPixels (int x, int y, int xc, int yc, float r, float g, float b)
{ drawDot (xc + x, yc + y, r,g,b);
drawDot (xc - x, yc + y,r,g,b);
drawDot (xc + x, yc - y,r,g,b);
drawDot (xc - x, yc - y,r,g,b);
}
void Ellipse (int a, int b, int xc, int yc, float r, float g, float bl)
{ int aSq,bSq,twoASq,twoBSq,d,dx,dy,x,y;
aSq = a*a;
bSq = b*b;
twoASq = 2*aSq;
twoBSq = 2*bSq;
d = bSq - b*aSq + aSq/4;
dx = 0;
dy = twoASq*b;
x = 0;
y = b;
symmetricPixels(x,y,xc,yc,r,g,bl);
while (dx < dy)
{ x++;
dx += twoBSq;
if (d >= 0)
{ y--;
dy -= twoASq;
}
if (d < 0)
d += bSq + dx;
else
d += bSq + dx - dy;
symmetricPixels (x,y,xc,yc,r,g,bl);
}
d = (int)(bSq*(x+0.5)*(x+0.5) + aSq*(y-1)*(y-1) -
aSq*bSq);
while (y > 0)
{ y--;
dy -= twoASq;
if (d <= 0)
{ x++;
dx += twoBSq;
}
if (d > 0)
d += aSq - dy;
else
d += aSq -dy +dx;
symmetricPixels(x,y,xc,yc,r,g,bl);
}
}
void Set_Graphics( int width, int height )
{
glClearColor( 1.0, 1.0, 1.0, 0.0 );
glColor3f( 0.0f, 0.0f, 0.0f );
glViewport( 0, 0, width, height );
glMatrixMode( GL_PROJECTION );
glLoadIdentity( );
glEnable( GL_DEPTH_TEST );
gluPerspective( 45, ( float ) width / height, 1.0, 0 );
glMatrixMode( GL_MODELVIEW );
glTranslatef( 0, 0, 5 * ( -height) );
}
void Start_Line( )
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
// Line_Algo( 5, 8, 29,32 );
// Circle (40,0,0,1);
Ellipse (100,30,20,20,0,1,0);
// glFlush();
glutSwapBuffers( );
}
int main( int argc, char** argv )
{
glutInit( &argc, argv );
glutInitWindowSize( 640,480);
glutInitWindowPosition( 100, 150 );
glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow( " Elipse Drawing" );
glutDisplayFunc( Start_Line );
Set_Graphics( 100, 100 /*window_width, window_height*/ );
glutMainLoop( );
return 0;
}
7. Thuật toán xén hình
#include <glut.h>
#include <math.h>
#define INC 10
#define M_PI 3.14159265358979323846
typedef struct {
int x,y;
} Point;
Point A,B, wmax, wmin;;
float goc;
char chuot;
//-----------------------------------------
void KhoiTao(){
glClearColor(0,0,0,0);
glLineWidth(2);
wmin.x=0;wmin.y=0;
wmax.x=200;wmax.y=120;
A.x=300; A.y=200;
B.x=50; B.y=-100;
goc=0;
chuot=0;
}
int Ma(Point M){
int m=0;
if(M.x<wmin.x) m |=1;
if(M.x>wmax.x) m |=2;
if(M.y<wmin.y) m |=4;
if(M.y>wmax.y) m |=8;
return m;
}
void HoanVi(Point *A,Point *B){
Point T;
T=*A; *A=*B; *B=T;
}
Point Xoay(Point A,int g)
{
float goc_rad =g * M_PI/180;
Point T;
T.x=A.x*cos(goc_rad)-A.y*sin(goc_rad);
T.y=A.x*sin(goc_rad)+A.y*cos(goc_rad);
return T;
}
void VeDuongThang(Point A,Point B){
glBegin(GL_LINES);
glVertex2i(A.x,A.y);
glVertex2i(B.x,B.y);
glEnd();
}
void VeHCN(Point wmin,Point wmax,int g)
{
Point A,B,C,D;
A=wmin;
C=wmax;
B.x=wmax.x; B.y=wmin.y;
D.x=wmin.x; D.y=wmax.y;
A=Xoay(A,g);
B=Xoay(B,g);
C=Xoay(C,g);
D=Xoay(D,g);
glBegin(GL_LINE_LOOP);
glVertex2i(A.x,A.y);
glVertex2i(B.x,B.y);
glVertex2i(C.x,C.y);
glVertex2i(D.x,D.y);
glEnd();
}
void ClipCohen(Point A,Point B,Point wmin,Point wmax,int g){
int thoat=0 , ve=1;
double m;
while(thoat==0){
if((Ma(A)|Ma(B))==0) thoat=1; // A va B nam trong vung cn
ma(A)=ma(B)=0000
else if((Ma(A) & Ma(B))!=0) // AB nam hoan toan ben
ngoai vung cn
{
thoat =1; ve=0;
}else{
if(Ma(A)==0) HoanVi(&A,&B); //A nam trong vung cn
if(A.x==B.x) // A va B cung nam doc
{
if(A.y>wmax.y) A.y=wmax.y; //
else A.y=wmin.y;
}
else
{
m=(double)(B.y-A.y)/(B.x-A.x);
if(A.x<wmin.x)
{
A.y=A.y+(wmin.x-A.x)*m;
A.x=wmin.x;
}else if(A.x>wmax.x)
{
A.y=A.y+(wmax.x-A.x)*m;
A.x=wmax.x;
}else if(A.y<wmin.y)
{
A.x=A.x+(wmin.y-A.y)/m;
A.y=wmin.y;
}else if(A.y>wmax.y)
{
A.x=A.x+(wmax.y-A.y)/m;
A.y=wmax.y;
}
}
}
}
if(ve) VeDuongThang(Xoay(A,g),Xoay(B,g));
}
void XenHinhNhiPhan(Point A,Point B,Point wmin,Point wmax,int g){
Point P,Q,M;
if((Ma(A)|Ma(B))==0) VeDuongThang(Xoay(A,g),Xoay(B,g));
if((Ma(A)&Ma(B))!=0) return ;
if((Ma(A)!=0) &&(Ma(B)==0)) HoanVi(&A,&B);
if((Ma(A)==0) &&(Ma(B)!=0))
{
P=A;Q=B;
while((abs(P.x-Q.x)+abs(P.y-Q.y))>2)
{
M.x=(P.x+Q.x)/2;
M.y=(P.y+Q.y)/2;
if(Ma(M)==0) P=M;
else Q=M;
}
VeDuongThang(Xoay(A,g),Xoay(P,g));
}
if((Ma(A)!=0)&&(Ma(B)!=0)&&((Ma(A) & Ma(B))==0))
{
P=A;Q=B;
M.x=(P.x+Q.x)/2;
M.y=(P.y+Q.y)/2;
while(( Ma(M)!=0) && ((abs(P.x-Q.x)+abs(P.y-Q.y))>2))
{
if((Ma(P)& Ma(M)) !=0) P=M;
else Q=M;
M.x=(P.x+Q.x)/2;
M.y=(P.y+Q.y)/2;
}
if(Ma(M)==0)
{
XenHinhNhiPhan(P,M,wmin,wmax,g);
XenHinhNhiPhan(M,Q,wmin,wmax,g);
}
}
}
void Mydisplay(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0.0, 1.0, 0.0);
VeHCN(wmin,wmax,goc);
glColor3f(0.0, 0.0, 1.0);
VeDuongThang(A,B);
glColor3f(1.0, 0.0, 0.0);
ClipCohen(Xoay(A,-goc),Xoay(B,-goc),wmin,wmax,goc);
//XenHinhNhiPhan(Xoay(A,-goc),Xoay(B,-goc),wmin,wmax,goc);
glFlush();
}
void KeyboardEventHandler(int key,int x,int y)
{
switch(key)
{
case GLUT_KEY_UP:
goc += INC;
if(goc >360) goc=0;
glutPostRedisplay();
break;
case GLUT_KEY_DOWN:
goc -= INC;
if(goc <0) goc=360;
glutPostRedisplay();
break;
}
}
void MouseEventHandler(int button, int state, int x, int y)
{
if(button == GLUT_LEFT_BUTTON && state == GLUT_UP)
if(chuot==0)
{
A.x=x-300;
A.y=300-y;
chuot=1;
}
else
{
B.x=x-300;
B.y=300-y;
chuot=0;
glutPostRedisplay();
}
}
//-----------------------------------------
int main(int argc,char* arg[]){
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (600, 600);
glutInitWindowPosition (10, 10);
glutCreateWindow("Thuat Toan Xen Hinh");
gluOrtho2D(-300, 300, -300, 300);
KhoiTao();
glutMouseFunc(MouseEventHandler);
glutDisplayFunc(Mydisplay);
glutSpecialFunc(KeyboardEventHandler);
glutMainLoop();
}
----------------------------------------------
----------------------------------------------------------