当前位置:文档之家› 图形程序设计教材示例源代码

图形程序设计教材示例源代码

图形程序设计教材示例源代码
图形程序设计教材示例源代码

第1章OpenGL基础知识

一个简单的OpenGL程序:

#include

#include

#include

#include

void main(void)

{

auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); auxInitPosition(0,0,500,500);

auxInitWindow("simple");

glClearColor(0.0,0.0,0.0,0.0);

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0,0.0,0.0);

glRectf(-0.5,-0.5,0.5,0.5);

glFlush();

_sleep(100000);

}

绘制一个彩色的三角形。代码如下:

#include

#include

void background(void)

{

glClearColor(0.0,0.0,0.0,0.0);//设置背景颜色为黑色

}

void myDisplay(void)

{

glClear(GL_COLOR_BUFFER_BIT);//buffer设置为颜色可写

glBegin(GL_TRIANGLES);//开始画三角形

glShadeModel(GL_SMOOTH);//设置为光滑明暗模式

glColor3f(1.0,0.0,0.0);//设置第一个顶点为红色

glVertex2f(-1.0,-1.0);//设置第一个顶点的坐标为(-1.0,-1.0)

glColor3f(0.0,1.0,0.0);//设置第二个顶点为绿色

glVertex2f(0.0,-1.0);//设置第二个顶点的坐标为(0.0,-1.0)

glColor3f(0.0,0.0,1.0);//设置第三个顶点为蓝色

glVertex2f(-0.5,1.0);//设置第三个顶点的坐标为(-0.5,1.0)

glEnd();//三角形结束

glFlush();//强制OpenGL函数在有限时间内运行

}

void myReshape(GLsizei w,GLsizei h)

{

glViewport(0,0,w,h);//设置视口

glMatrixMode(GL_PROJECTION);//指明当前矩阵为GL_PROJECTION glLoadIdentity();//将当前矩阵置换为单位阵

if(w <= h)

gluOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w);//定义二维正视投影矩阵else

gluOrtho2D(-1.0,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5);

glMatrixMode(GL_MODELVIEW);//指明当前矩阵为GL_MODELVIEW

}

int main(int argc,char ** argv)

{

/*初始化*/

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

glutInitWindowSize(400,400);

glutInitWindowPosition(200,200);

/*创建窗口*/

glutCreateWindow("Triangle");/*绘制与显示*/ background();

glutReshapeFunc(myReshape); glutDisplayFunc(myDisplay); glutMainLoop();

return(0);

}

第2章 OpenGL建模技术开发实例:基本三维几何物体绘制

{

static void SetColor( int index)

if ( rgb) {

switch ( index) {

case 0:

glColor3f( 0. 0, 0. 0, 0 . 0) ;

break;

case 1:

glColor3f( 1. 0, 0. 0, 0 . 0) ;

break;

case 2:

glColor3f( 0. 0, 1. 0, 0 . 0) ;

break;

case 3:

glColor3f( 1. 0, 1. 0, 0 . 0) ;

break;

case 4:

glColor3f( 0. 0, 0. 0, 1 . 0) ;

break;

case 5:

glColor3f( 1. 0, 0. 0, 1 . 0) ;

break;

case 6:

glColor3f( 0. 0, 1. 0, 1 . 0) ;

break;

case 7:

glColor3f( 1. 0, 1. 0, 1 . 0) ;

break;

}

}

else

{

glIndexi( index) ;

}

//键盘响应函数

static void Key( unsigned char key, int x, int y) {

switch ( key)

{

case ‘1’:

mode1 = ! mode1;

glutPostRedisplay( ) ;

break;

case ‘2’:

mode2 = ! mode2;

glutPostRedisplay( ) ;

break;

case ‘3’:

RotateColorMask( ) ;

glutPostRedisplay( ) ;

break;

case 27:

exit( 0) ;

}

}

编写各图形的绘制位置设置函数。

static void Viewport( GLint row, GLint column) {

GLint x, y;

boxW = ( windW - ( COLS + 1) * GAP) / COLS;

boxH = ( windH - ( ROWS + 1 ) * GAP) / ROWS;

x = GAP + column * ( boxW + GAP) ;

y = GAP + row * ( boxH + GAP) ;

glViewport( x, y, boxW, boxH) ;

glMatrixMode( GL_PROJECTION) ;

glLoadIdentity( ) ;

glOrtho( - boxW /2, boxW /2, - boxH /2, boxH /2, 0 . 0, 1. 0) ;

glMatrixMode( GL_MODELVIEW) ;

glEnable( GL_SCISSOR_TEST) ;

glScissor( x, y, boxW, boxH) ;

}

点图元的绘制函数。

//绘制点

static void Point( void)

{

GLint i;

glBegin( GL_POINTS) ;

for ( i = 1; i < 8; i + + ) {

GLint j = i * 2;

SetColor( i) ;

glVertex2i( - j, - j) ;

glVertex2i( - j, 0) ;

glVertex2i( - j, j) ;

glVertex2i( 0, j) ;

glVertex2i( j, j) ;

glVertex2i( j, 0) ;

glVertex2i( j, - j) ;

glVertex2i( 0, - j) ;

}

glEnd( ) ;

}

线图元的绘制函数。

//绘制线

static void Lines( void)

{

GLint i;

glPushMatrix( ) ;

glTranslatef( - 12, 0, 0) ;

for ( i = 1; i < 8; i + + )

{

SetColor( i) ;

glBegin( GL_LINES) ;

glVertex2i( - boxW /4 , - boxH /4) ;

glVertex2i( boxW /4 , boxH /4) ;

glEnd( ) ;

glTranslatef( 4, 0, 0 ) ;

}

glPopMatrix( ) ;

( rgb) ? glColor3f( 1 . 0, 1. 0, 1. 0) : glIndexi( 7) ;

glBegin( GL_LINES) ;

glVertex2i( 0, 0) ;

glEnd( ) ;

}

不闭合折线图元的绘制函数。

//绘制不闭合的折线

static void LineStrip( void)

{

glBegin( GL_LINE_STRIP) ;

SetColor( 1) ;

glVertex2f( PIXEL_CENTER( - boxW /4) , PIXEL_CENTER( - boxH /4) ) ;

SetColor( 2) ;

glVertex2f( PIXEL_CENTER( - boxW /4) , PIXEL_CENTER( boxH /4) ) ;

SetColor( 3) ;

glVertex2f( PIXEL_CENTER( boxW /4) , PIXEL_CENTER( boxH /4) ) ;

SetColor( 4) ;

glVertex2f( PIXEL_CENTER( boxW /4) , PIXEL_CENTER( - boxH /4) ) ;

glEnd( ) ;

( rgb) ? glColor3f( 1 . 0, 1. 0, 1. 0) : glIndexi( 7) ;

glBegin( GL_LINE_STRIP) ;

glVertex2i( 0, 0) ;

glEnd( ) ;

}

闭合折线图元的绘制函数。

//绘制闭合折线

static void LineLoop( void)

{

glBegin( GL_LINE_LOOP) ;

SetColor( 1) ;

glVertex2f( PIXEL_CENTER( - boxW /4) , PIXEL_CENTER( - boxH /4) ) ;

SetColor( 2) ;

glVertex2f( PIXEL_CENTER( - boxW /4) , PIXEL_CENTER( boxH /4) ) ;

SetColor( 3) ;

glVertex2f( PIXEL_CENTER( boxW /4) , PIXEL_CENTER( boxH /4) ) ;

SetColor( 4) ;

glVertex2f( PIXEL_CENTER( boxW /4) , PIXEL_CENTER( - boxH /4) ) ;

glEnd( ) ;

glEnable( GL_LOGIC_OP) ;

glLogicOp( GL_XOR) ;

glEnable( GL_BLEND) ;

glBlendFunc( GL_ONE, GL_ONE) ;

SetColor( 5) ;

glBegin( GL_LINE_LOOP) ;

glVertex2f( PIXEL CENTER(-boxW /8) , PIXEL_CENTER(-boxH /8) ) ;

glVertex2f( PIXEL_CENTER(- boxW /8) , PIXEL_CENTER( boxH /8) ) ;

glEnd( ) ;

glBegin( GL_LINE_LOOP) ;

glVertex2f( PIXEL_CENTER(- boxW /8) , PIXEL_CENTER( boxH /8 + 5) ) ;

glVertex2f( PIXEL_CENTER(boxW /8) , PIXEL_CENTER( boxH /8 + 5) ) ;

glEnd( ) ;

glDisable( GL_LOGIC_OP) ;

glDisable( GL_BLEND) ;

SetColor( 6) ;

glBegin( GL_POINTS) ;

glVertex2i( 0, 0) ;

glEnd( ) ;

( rgb) ? glColor3f( 1 . 0, 1. 0, 1. 0) : glIndexi( 7) ;

glBegin( GL_LINE_LOOP) ;

glVertex2i( 0, 0) ;

glEnd( ) ;

}

位图图元的绘制函数

//绘制位图

static void Bitmap( void)

{

glBegin( GL_LINES) ;

SetColor( 1) ;

glVertex2i( - boxW /2 , 0 ) ;

glVertex2i( boxW /2 , 0 ) ;

glVertex2i( 0, - boxH /2) ;

glVertex2i( 0, boxH /2) ;

SetColor( 2) ;

glVertex2i( 0, - 3) ;

glVertex2i( 0, - 3 + OPENGL_HEIGHT) ;

SetColor( 3) ;

glVertex2i( 0, - 3) ;

glVertex2i( OPENGL_WIDTH, - 3 ) ;

glEnd( ) ;

SetColor( 4) ;

glPixelStorei( GL_UNPACK_LSB_FIRST, GL_TRUE) ;

glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ) ;

glRasterPos2i( 0 , 0) ;

glBitmap( OPENGL_WIDTH, OPENGL_HEIGHT, 0, 3, 0. 0 , 0. 0, OpenGL_ bits) ;

}

三角形图元的绘制函数。

//绘制三角形

static void Triangles( void)

{

glBegin( GL_TRIANGLES) ;

SetColor( 1) ;

glVertex2i( - boxW /4 , - boxH /4) ;

SetColor( 2) ;

glVertex2i( - boxW /8 , - boxH /16) ;

SetColor( 3) ;

glVertex2i( boxW /8 , - boxH /16) ;

SetColor( 4) ;

glVertex2i( - boxW /4 , boxH /4) ;

SetColor( 5) ;

glVertex2i( - boxW /8 , boxH /16) ;

SetColor( 6) ;

glVertex2i( boxW /8 , boxH /16) ;

glEnd( ) ;

( rgb) ? glColor3f( 1 . 0, 1. 0, 1. 0) : glIndexi( 7) ;

glBegin( GL_TRIANGLES) ;

glVertex2i( 0, 0) ;

glVertex2i( - 100, 100) ;

glEnd( ) ;

}

连线三角形串图元的绘制函数。

//绘制线性的连线三角形串

static void TriangleStrip( void)

{

glBegin( GL_TRIANGLE _STRIP) ;

SetColor( 1) ;

glVertex2i( - boxW /4 , - boxH /4) ;

SetColor( 2) ;

glVertex2i( - boxW /4 , boxH /4) ;

SetColor( 3) ;

glVertex2i( 0, - boxH /4) ;

SetColor( 4) ;

glVertex2i( 0, boxH /4) ;

SetColor( 5) ;

glVertex2i( boxW /4 , - boxH /4) ;

glVertex2i( boxW /4 , boxH /4) ;

glEnd( ) ;

( rgb) ? glColor3f( 1 . 0, 1. 0, 1. 0) : glIndexi( 7) ;

glBegin( GL_TRIANGLE _STRIP) ;

glVertex2i( 0, 0) ;

glVertex2i( - 100, 100) ;

glEnd( ) ;

}

扇形连线三角形串图元的绘制函数。

//绘制扇形的连线三角形串

static void TriangleFan( void)

{

GLint vx[ 8 ] [ 2 ] ;

GLint x0, y0, x1, y1 , x2, y2, x3, y3;

GLint i;

y0 = - boxH /4;

y1 = y0 + boxH /2 /3;

y2 = y1 + boxH /2 /3;

y3 = boxH /4;

x0 = - boxW /4;

x1 = x0 + boxW /2 /3;

x2 = x1 + boxW /2 /3;

x3 = boxW /4;

vx[ 0] [ 0] = x0; vx[ 0] [ 1 ] = y1;

vx[ 1] [ 0] = x0; vx[ 1] [ 1 ] = y2;

vx[ 2] [ 0] = x1; vx[ 2] [ 1 ] = y3;

vx[ 3] [ 0] = x2; vx[ 3] [ 1 ] = y3;

vx[ 4] [ 0] = x3; vx[ 4] [ 1 ] = y2;

vx[ 5] [ 0] = x3; vx[ 5] [ 1 ] = y1;

vx[ 6] [ 0] = x2; vx[ 6] [ 1 ] = y0;

vx[ 7] [ 0] = x1; vx[ 7] [ 1 ] = y0;

glBegin( GL_TRIANGLE _FAN) ;

SetColor( 7) ;

glVertex2i( 0, 0) ;

for ( i = 0; i < 8; i + + ;

{

glVertex2iv( vx[ i] ) ;

}

glEnd( ) ;

( rgb) ? glColor3f( 1 . 0, 1. 0, 1. 0) : glIndexi( 7) ;

glBegin( GL_TRIANGLE _FAN) ;

glVertex2i( 0, 0) ;

glVertex2i( - 100, 100) ;

glEnd( ) ;

}

矩形图元的绘制函数。

//绘制矩形

static void Rect( void)

{

( rgb) ? glColor3f( 1 . 0, 0. 0, 1. 0) : glIndexi( 5) ;

glRecti( - boxW /4, - boxH /4, boxW /4, boxH /4) ; }

//绘制连线多边形

static void Polygons( void)

{

GLint vx[ 8 ] [ 2 ] ;

GLint x0, y0, x1, y1 , x2, y2, x3, y3;

GLint i;

y0 = - boxH /4;

y1 = y0 + boxH /2 /3;

y2 = y1 + boxH /2 /3;

y3 = boxH /4;

x0 = - boxW /4;

x1 = x0 + boxW /2 /3;

x2 = x1 + boxW /2 /3;

x3 = boxW /4;

vx[ 0] [ 0] = x0; vx[ 0] [ 1 ] = y1;

vx[ 1] [ 0] = x0; vx[ 1] [ 1 ] = y2;

vx[ 2] [ 0] = x1; vx[ 2] [ 1 ] = y3;

vx[ 3] [ 0] = x2; vx[ 3] [ 1 ] = y3;

vx[ 4] [ 0] = x3; vx[ 4] [ 1 ] = y2;

vx[ 5] [ 0] = x3; vx[ 5] [ 1 ] = y1;

vx[ 6] [ 0] = x2; vx[ 6] [ 1 ] = y0;

vx[ 7] [ 0] = x1; vx[ 7] [ 1 ] = y0;

glBegin( GL_POLYGON) ;

for ( i = 0; i < 8; i + + ) {

SetColor( 7 - i) ;

glVertex2iv( vx[ i] ) ;

}

glEnd( ) ;

( rgb) ? glColor3f( 1 . 0, 1. 0, 1. 0) : glIndexi( 7) ;

glBegin( GL_POLYGON) ;

glVertex2i( 0, 0) ;

glVertex2i( 100, 100) ;

glEnd( ) ;

}

独立连线的四边形图元的绘制函数。

//绘制多个独立的连线四边形

static void Quads( void)

{

glBegin( GL_QUADS) ;

SetColor( 1) ;

glVertex2i( - boxW /4 , - boxH /4) ;

SetColor( 2) ;

glVertex2i( - boxW /8 , - boxH /16) ;

SetColor( 3) ;

glVertex2i( boxW /8 , - boxH /16) ;

SetColor( 4) ;

glVertex2i( boxW /4 , - boxH /4) ;

SetColor( 5) ;

glVertex2i( - boxW /4 , boxH /4) ;

SetColor( 6) ;

glVertex2i( - boxW /8 , boxH /16) ;

SetColor( 7) ;

glVertex2i( boxW /8 , boxH /16) ;

SetColor( 0) ;

glVertex2i( boxW /4 , boxH /4) ;

glEnd( ) ;

( rgb) ? glColor3f( 1 . 0, 1. 0, 1. 0) : glIndexi( 7) ;

glBegin( GL_QUADS) ;

glVertex2i( 0, 0) ;

glVertex2i( 100, 100) ;

glVertex2i( - 100, 100) ;

glEnd( ) ;

}

连续连线四边形串图元的绘制函数。

//绘制连续的连线四边形串

static void QuadStrip( void)

{

glBegin( GL_QUAD_STRIP) ;

SetColor( 1) ;

glVertex2i( - boxW /4 , - boxH /4) ;

SetColor( 2) ;

glVertex2i( - boxW /4 , boxH /4) ;

SetColor( 3) ;

glVertex2i( 0, - boxH /4) ;

SetColor( 4) ;

glVertex2i( 0, boxH /4) ;

SetColor( 5) ;

glVertex2i( boxW /4 , - boxH /4) ;

SetColor( 6) ;

glVertex2i( boxW /4 , boxH /4) ;

glEnd( ) ;

( rgb) ? glColor3f( 1 . 0, 1. 0, 1. 0) : glIndexi( 7) ;

glBegin( GL_QUAD_STRIP) ;

glVertex2i( 0, 0) ;

glVertex2i( 100, 100) ;

glVertex2i( - 100, 100) ;

glEnd( ) ;

绘制Bezier 曲线的实例.

// 定义控制点

GLfloat ctrlpoints[ 4] [ 3 ] = {

{ - 4. 0, - 4. 0, 0. 0} , { - 2. 0, 4. 0, 0. 0 } ,

{2. 0, - 4. 0, 0. 0} , {4. 0, 4. 0, 0. 0 } };

void init( void)

{

glClearColor( 0. 0, 0 . 0, 0. 0, 0. 0) ;

glShadeModel( GL_FLAT) ;

//定义一个一维求值器

glMap1f( GL_MAP1_VE RTEX_3, 0. 0, 1. 0, 3 , 4, &ctrlpoints[ 0 ] [ 0 ] ) ;

//启动映射

glEnable( GL_MAP1_VERTEX_3) ;

}

③Beizer 曲线的显示函数。在该函数中首先计算曲线坐标,然后以点的模式绘制控点。

void display( void)

{

int i;

glClear( GL_COLOR_BUFFER_BIT) ;

glColor3f( 1 . 0 , 1. 0, 1. 0) ;

glBegin( GL_LINE _STRIP) ;

for ( i = 0; i < = 30; i + + )

// 计算曲线坐标

glEvalCoord1f( ( GLfloat) i /30 . 0) ;

glEnd( ) ;

// 以点的模式绘制控制点

glPointSize( 5. 0) ;

glColor3f( 1 . 0 , 1. 0, 0. 0) ;

glBegin( GL_POINTS) ;

for ( i = 0; i < 4; i + + )

glVertex3fv( &ctrlpoints[ i] [ 0] ) ;

glEnd( ) ;

glFlush( ) ;

}

绘制Bezier曲面的实例.

// 定义控制点

GLfloat ctrlpoints[ 4] [ 4 ] [ 3] = {

{ { - 1.5 ,-1.5,4.0},{-0.5,-1.5,2.0} ,

{0.5,-1.5,-1.0},{1.5,-1.5,2.0}},

{ {-1.5,-0.5,1.0},{-0.5,-0.5,3.0},

{0.5,-0.5,0.0},{1.5,-0.5,-1.0}},

{ {-1.5,0.5,4.0},{-0.5,0.5,0.0},

{0.5,0.5,3.0},{1.5,0.5,4.0}},

{ {-1.5,1.5,-2.0},{-0.5,1.5,-2.0} ,

{0.5,1.5,0.0},{1.5,1.5,-1.0}}

};

void init( void)

{

glClearColor ( 0. 0, 0 . 0, 0. 0, 0. 0) ;

//定义一个二维求值器

glMap2f( GL_MAP2_VE RTEX_3, 0, 1, 3, 4,0, 1, 12, 4, &ctrlpoints[ 0] [ 0] [ 0] ) ;

glEnable( GL_MAP2_VERTEX_3);

//定义二维网格坐标

glMapGrid2f( 20, 0. 0, 1. 0, 20, 0. 0, 1 . 0) ;

glEnable( GL_DEPTH_TEST) ;

glShadeModel( GL_FLAT) ;

}

③Beizer曲面的显示函数。在该函数中首先计算二维曲面坐标,然后以封闭线框的模式绘制各控制点。

void display( void)

{

int i, j;

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ;

glColor3f( 1 . 0 , 1. 0, 1. 0) ;

glPushMatrix ( ) ;

glRotatef( 85 . 0 , 1. 0, 1. 0, 1. 0 ) ;

for ( j = 0; j < = 8 ; j + + )

{

glBegin( GL_LINE_STRIP) ;

for ( i = 0; i < = 30; i + + )

//计算二维曲面坐标

glEvalCoord2f( ( GLfloat) i /30 . 0, ( GLfloat) j /8. 0) ;

glEnd( ) ;

glBegin( GL_LINE_STRIP) ;

for ( i = 0; i < = 30; i + + )

//计算二维曲面坐标

glEvalCoord2f( ( GLfloat) j /8. 0, ( GLfloat) i /30. 0) ;

glEnd( ) ;

}

glPopMatrix ( ) ;

glFlush( ) ;

}

绘制NURBS曲面的实例

INRE AL sknots[ S_NUMKNOTS] =

{- 1.0,-1.0,-1.0,0.0 ,1.0,2.0,3.0, 4.0,

4 . 0, 5. 0, 6. 0, 7. 0 , 8. 0, 9. 0, 9. 0, 9 . 0

};

INRE AL glutnots[ T_NUMKNOTS] =

{1 . 0, 1. 0, 1. 0, 2. 0 , 2. 0, 2. 0

};

Point ctlpoints[ S_NUMPOINTS] [ T_NUMPOINTS] =

{

{{4.0,2.0,2.0,1.0} , {4. 0, 1. 6 , 2. 5, 1. 0} , {4 . 0 , 2. 0, 3. 0, 1. 0 } },

{{5.0,4.0,2.0,1.0} , {5. 0, 4. 0 , 2. 5, 1. 0} , {5 . 0 , 4. 0, 3. 0, 1. 0 } },

{{6.0,5.0,2.0,1.0} , {6. 0, 5. 0 , 2. 5, 1. 0} , {6 . 0 , 5. 0, 3. 0, 1. 0 } },

{ { SQRT_TWO* 6. 0, SQRT_TWO* 6. 0 , SQRT_TWO* 2. 0, SQRT_TWO} , { SQRT_TWO* 6. 0, SQRT_TWO* 6. 0 , SQRT_TWO* 2. 5, SQRT_TWO} , { SQRT_TWO* 6. 0, SQRT_TWO* 6. 0 , SQRT_TWO* 3. 0, SQRT_TWO} },

{{5.2,6.7,2.0, 1. 0} , {5. 2, 6. 7 , 2. 5, 1. 0} , {5 . 2 , 6. 7, 3. 0, 1. 0 } },

{ { SQRT_TWO* 4. 0, SQRT_TWO* 6. 0 , SQRT_TWO* 2. 0, SQRT_TWO} , { SQRT_TWO* 4. 0, SQRT_TWO* 6. 0 , SQRT_TWO* 2. 5, SQRT_TWO} , { SQRT_TWO* 4. 0, SQRT_TWO* 6. 0 , SQRT_TWO* 3. 0, SQRT_TWO}

},

{{4.0,5.2,2.0, 1. 0} , {4. 0, 4. 6 , 2. 5, 1. 0} , {4 . 0 , 5. 2, 3. 0, 1. 0 } },79

{ { SQRT_TWO* 4. 0, SQRT_TWO* 6. 0 , SQRT_TWO* 2. 0, SQRT_TWO} , { SQRT_TWO* 4. 0, SQRT_TWO* 6. 0 , SQRT_TWO* 2. 5, SQRT_TWO} , { SQRT_TWO* 4. 0, SQRT_TWO* 6. 0 , SQRT_TWO* 3. 0, SQRT_TWO}

},

{{2.8,6.7,2.0,1.0} , {2. 8, 6. 7 , 2. 5, 1. 0} , {2 . 8 , 6. 7, 3. 0, 1. 0 } },

{ { SQRT_TWO* 2. 0, SQRT_TWO* 6. 0 , SQRT_TWO* 2. 0, SQRT_TWO} , { SQRT_TWO* 2. 0, SQRT_TWO* 6. 0 , SQRT_TWO* 2. 5, SQRT_TWO} , { SQRT_TWO* 2. 0, SQRT_TWO* 6. 0 , SQRT_TWO* 3. 0, SQRT_TWO} },

{{2.0,5.0,2.0 ,1.0}, {2. 0, 5. 0 , 2. 5, 1. 0} , {2 . 0 , 5. 0, 3. 0, 1. 0 } },

{{3.0,4.0,2.0 ,1.0}, {3. 0, 4. 0 , 2. 5, 1. 0} , {3 . 0 , 4. 0, 3. 0, 1. 0 } },

{{4.0,2.0,2.0 ,1.0}, {4. 0, 1. 6 , 2. 5, 1. 0} , {4 . 0 , 2. 0, 3. 0, 1. 0 } }};

static void Init( void)

{

// 创建一个NURBS 对象

theNurbs = gluNewNurbsRenderer( ) ;

gluNurbsCallback( theNurbs, GLU_ERROR, ErrorCallback) ;

// 定义NURBRS 对象的属性

gluNurbsProperty( theNurbs, GLU_SAMPLING_TOLERANCE, 15 . 0 ) ;

gluNurbsProperty(theNurbs,GLU_DISPLAY_MODE,GLU_OUTLINE_PA TCH) ; expectedError = GLU_INV ALID_ENUM;

gluNurbsProperty( theNurbs, ~0, 15. 0) ;

expectedError = GLU_NURBS_ERROR13;

gluEndSurface( theNurbs) ;

expectedError = 0;

glColor3f( 1. 0, 1. 0, 1 . 0) ;

}

//编写键盘响应函数

static void Key( unsigned char key, int x, int y)

{

switch ( key) {

case 27:

exit(0);

}

}

// 键盘响应函数

static void SpecialKey( int key, int x, int y)

{

switch ( key)

{

case GLUT_KEY_DOWN:

rotX - = 5;

glutPostRedisplay( ) ;

break;

case GLUT_KEY_UP:

rotX + = 5;

glutPostRedisplay( ) ;

break;

case GLUT_KEY_LEFT:

rotY - = 5;

glutPostRedisplay( ) ;

break;

case GLUT_KEY_RIGHT:

rotY + = 5;

glutPostRedisplay( ) ;

break;

}

}

//NURBS对象绘制函数

static void Draw( void)

{

glClear( GL_COLOR_BUFFER_BIT) ;

glPushMatrix( ) ;

glTranslatef( 4. 0, 4 . 5, 2. 5) ;

glRotatef( rotY, 1, 0, 0 ) ;

glRotatef( rotX, 0, 1, 0 ) ;

glTranslatef( - 4. 0, - 4 . 5, - 2. 5) ;

// 绘制NURBS 曲面

gluBeginSurface( theNurbs) ;

gluNurbsSurface( theNurbs, S_NUMKNOTS, sknots, T_NUMKNOTS, glutnots,

4 * T_NUMPOINTS, 4, &ctlpoints[ 0 ] [ 0] [ 0] , S_ORDER,

计算机图形学实验一

实验一二维基本图元的生成与填充 实验目的 1.了解并掌握二维基本图元的生成算法与填充算法。 2.实现直线生成的DDA算法、中点算法和Bresenham算法。 3.实现圆和椭圆生成的DDA和中点算法, 对几种算法的优缺点有感性认识。 二.实验内容和要求 1.选择自己熟悉的任何编程语言, 建议使用VC++6.0。 2.创建良好的用户界面,包括菜单,参数输入区域和图形显示区域。 3.实现生成直线的DDA算法、中点算法和Bresenham算法。 4.实现圆弧生成的中点算法。 5.实现多边形生成的常用算法, 如扫描线算法,边缘填充算法。 6.实现一般连通区域的基于扫描线的种子填充算法。 7.将生成算法以菜单或按钮形式集成到用户界面上。 8.直线与圆的坐标参数可以用鼠标或键盘输入。 6. 可以实现任何情形的直线和圆的生成。 实验报告 1.用户界面的设计思想和框图。 2.各种实现算法的算法思想。 3.算法验证例子。 4.上交源程序。 直线生成程序设计的步骤如下: 为编程实现上述算法,本程序利用最基本的绘制元素(如点、直线等),绘制图形。如图1-1所示,为程序运行主界面,通过选择菜单及下拉菜单的各功能项分别完成各种对应算法的图形绘制。 图1-1 基本图形生成的程序运行界面 2.创建工程名称为“基本图形的生成”单文档应用程序框架

(1)启动VC,选择“文件”|“新建”菜单命令,并在弹出的新建对话框中单击“工程”标签。 (2)选择MFC AppWizard(exe),在“工程名称”编辑框中输入“基本图形的生成”作为工程名称,单击“确定”按钮,出现Step 1对话框。 (3)选择“单个文档”选项,单击“下一个”按钮,出现Step 2对话框。 (4)接受默认选项,单击“下一个”按钮,在出现的Step 3~Step 5对话框中,接受默认选项,单击“下一个”按钮。 (5)在Step 6对话框中单击“完成”按钮,即完成“基本图形的生成”应用程序的所有选项,随后出现工程信息对话框(记录以上步骤各选项选择情况),如图1-2所示,单击“确定”按钮,完成应用程序框架的创建。 图1-2 信息程序基本 3.编辑菜单资源 设计如图1-1所示的菜单项。在工作区的ResourceView标签中,单击Menu项左边“+”,然后双击其子项IDR_MAINFRAME,并根据表1-1中的定义编辑菜单资源。此时VC已自动建好程序框架,如图1-2所示。 表1-1菜单资源表 菜单标题菜单项标题标示符ID 直线DDA算法生成直线ID_DDALINE Bresenham算法生成直线ID_BRESENHAMLINE 中点算法生成直线ID_MIDPOINTLINE 4.添加消息处理函数 利用ClassWizard(建立类向导)为应用程序添加与菜单项相关的消息处理函数,ClassName栏中选择CMyView,根据表1-2建立如下的消息映射函数,ClassWizard会自动完成有关的函数声明。 表1-2菜单项的消息处理函数 菜单项ID消息消息处理函数ID_DDALINE CONMMAN OnDdaline

计算机图形学实验

实验1 直线的绘制 实验目的 1、通过实验,进一步理解和掌握DDA和Bresenham算法; 2、掌握以上算法生成直线段的基本过程; 3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段的绘制。实验环境 计算机、Turbo C或其他C语言程序设计环境 实验学时 2学时,必做实验。 实验内容 用DDA算法或Besenham算法实现斜率k在0和1之间的直线段的绘制。 实验步骤 1、算法、原理清晰,有详细的设计步骤; 2、依据算法、步骤或程序流程图,用C语言编写源程序; 3、编辑源程序并进行调试; 4、进行运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、把源程序以文件的形式提交; 7、按格式书写实验报告。 实验代码:DDA: # include # include

void DDALine(int x0,int y0,int x1,int y1,int color) { int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { putpixel((int)(x+0.5),(int)(y+0.5),4); x+=xIncre; y+=yIncre; } } main(){ int gdriver ,gmode ;

计算机图形与可视化课程设计

课程设计课程名称:计算机图形学与可视化学生姓名: 学号: 专业班级: 指导老师: 院系名称:

课程设计任务书 设 计 题 目 利用迭代函数系统生成分形图案成绩课 程设计主要内容迭代函数系统(Iteration Function System,简称IFS)是以仿射变换为框架,根据几何对象的整体与局部具有自相似的结构,将总体形状以一定的概率按不同的仿射变换迭代下去,直至得到满意的分型图形。迭代函数系统绘制分形图形有两种方法:确定性迭代算法和随机性迭代算法。本文将以此原理出发,分析分形图形的生成方法,探索一些利用IFS产生丰富的分形图形的简便方法及具体应用。 具体内容请看下面的正文。 指导教师评语建议:从学生的工作态度、工作量、设计(论文)的创造性、学术性、实用性及书面表达能力等方面给出评价。 签名: 20 年月日

目录 一.系统功能介绍 (4) 二.设计思路 (6) 三.模块图 (6) 四.小组成员及任务分配 (7) 五.主要算法介绍 (7) 六.源代码 (8) 七.程序使用说明 (8) 八.调试结果 (8) 九.总结 (14) 十.参考文献 (15)

正文: 一.系统功能介绍 迭代函数系统(Iteration Function System,简称IFS)最早是由Hutchision 在1981年提出的。美国佐治亚理工学院的M F Bamsley等人在SIGGRAMPH’88国际会议上对IFS所作的专题报告,使IFS成为分形图像压缩的基础,从而使IFS成为分形图形学最有生命力的领域之一。 迭代函数系统(IFS)是以仿射变换为框架,根据几何对象的整体与局部具有自相似的结构,将总体形状以一定的概率按不同的仿射变换迭代下去,直至得到满意的分形图形。 目前使用的迭代函数系统绘制分形图的算法主要有两种:确定性迭代算法和随机性迭代算法。它们都是通过IFS码进行迭代而产生图形的方法。 确定性迭代算法是通过仿射变换得到的。其基本原理就是找一个初始集,对集上的每一个点,根据给定的仿射变换公式进行数据变换,便可得到新的点集。这样通过多次迭代,便可绘制所需的图形。并且每个图形的局部和整体相似。只要其仿射变换系数相同,即IFS码相同,当迭代次数足够大时,最终生成的图形是相同的。 随机性迭代算法用到了概率,从而可以对图形的细节和颜色进行控制。随机性迭代算法的基本原理就是利用一个给定的IFS码{:j=1,2,…,N}(每一个仿射变换对应于一个概率),从任选的一个初始点(,)出发,依据其概率分布{,,,…,},从{:j=1,2,…,N}中选择相应的进行仿射变换,可得到新的点(,)。然后再由概率选择相应的进行变换,进而得到新的点(,)。这样反复迭代,便可得到一系列的点{(,),(,),(,),…}。这些点集显示在屏幕上,便得到一个完整的分形图。 分形,又称碎形,通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。分形思想的根源可以追溯到公元17世纪,而对分形使用严格的数学处理则始于一个世纪后卡尔·魏尔施特拉斯、格奥尔格·康托尔和费利克斯·豪斯多夫对连续而不可微函数的研究。但是分形一词直到1975年才由本华·曼德博创造出,来自拉丁文,有“零碎”、“破裂”之意。一个数学意义上分形的生成是基于一个不断迭代的方程式,即一种基于递归的反馈系统。分形有几种类型,可以分别依据表现出的精确自相似性、半自相似性和统计自相似性来定义。虽然分形是一个数学构造,它们同样可以在自然界中被找到,这使得它们被划入艺术作

计算机图形学实验报告

《计算机图形学》实验报告姓名:郭子玉 学号:2012211632 班级:计算机12-2班 实验地点:逸夫楼507 实验时间:15.04.10 15.04.17

实验一 1 实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力; 编程实现DDA 算法、Bresenham 中点算法;对于给定起点和终点的直线,分别调用DDA 算法和Bresenham 中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel 等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。 2 实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One (自制平台) 3 实验结果 3.1 程序流程图 (1)DDA 算法 是 否 否 是 是 开始 计算k ,b K<=1 x=x+1;y=y+k; 绘点 x<=X1 y<=Y1 绘点 y=y+1;x=x+1/k; 结束

(2)Mid_Bresenham 算法 是 否 否 是 是 是 否 是 否 开始 计算dx,dy dx>dy D=dx-2*dy 绘点 D<0 y=y+1;D = D + 2*dx - 2*dy; x=x+1; D = D - 2*dy; x=x+1; x

3.2程序代码 //-------------------------算法实现------------------------------// //绘制像素的函数DrawPixel(x, y); (1)DDA算法 void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) { //----------请实现DDA算法------------// float k, b; float d; k = float(Y1 - Y0)/float(X1 - X0); b = float(X1*Y0 - X0*Y1)/float(X1 - X0); if(fabs(k)<= 1) { if(X0 > X1) { int temp = X0; X0 = X1; X1 = temp; }

课程设计报告-车牌识别系统的设计

车牌识别系统的设计 一、摘要: 随这图形图像技术的发展,现在的车牌识别技术准确率越来越高,识别速度越来越快。无论何种形式的车牌识别系统,它们都是由触发、图像采集、图像识别模块、辅助光源和通信模块组成的。车牌识别系统涉及光学、电器、电子控制、数字图像处理、计算视觉、人工智能等多项技术。触发模块负责在车辆到达合适位置时,给出触发信号,控制抓拍。辅助光源提供辅助照明,保证系统在不同的光照条件下都能拍摄到高质量的图像。图像预处理程序对抓拍的图像进行处理,去除噪声,并进行参数调整。然后通过车牌定位、字符识别,最后将识别结果输出。 二、设计目的和意义: 设计目的: 1、让学生巩固理论课上所学的知识,理论联系实践。 2、锻炼学生的动手能力,激发学生的研究潜能,提高学生的协作精神。 设计意义: 车牌定位系统的目的在于正确获取整个图像中车牌的区域,并识别出车牌号。通过设计实现车牌识别系统,能够提高学生分析问题和解决问题的能力,还能培养一定的科研能力。 三、设计原理: 牌照自动识别是一项利用车辆的动态视频或静态图像进行牌照号码、牌照颜色自动识别的模式识别技术。其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。某些牌照识别系统还具有通过视频图像判断车辆驶入视野的功能称之为视频车辆检测。一个完整的牌照识别系统应包括车辆检测、图像采集、牌照识别等几部分。当车辆检测部分检测到车辆到达时触发图像采集单元,采集当前的视频图像。牌照识别单元对图像进行处理,定位出牌照位置,再将牌照中的字符分割出来进行识别,然后组成牌照号码输出。 四、详细设计步骤:

计算机图形学实验报告 (2)

中南大学信息科学与工程学院 实验报告实验名称 实验地点科技楼四楼 实验日期2014年6月 指导教师 学生班级 学生姓名 学生学号 提交日期2014年6月

实验一Window图形编程基础 一、实验类型:验证型实验 二、实验目的 1、熟练使用实验主要开发平台VC6.0; 2、掌握如何在编译平台下编辑、编译、连接和运行一个简单的Windows图形应用程序; 3、掌握Window图形编程的基本方法; 4、学会使用基本绘图函数和Window GDI对象; 三、实验内容 创建基于MFC的Single Document应用程序(Win32应用程序也可,同学们可根据自己的喜好决定),程序可以实现以下要求: 1、用户可以通过菜单选择绘图颜色; 2、用户点击菜单选择绘图形状时,能在视图中绘制指定形状的图形; 四、实验要求与指导 1、建立名为“颜色”的菜单,该菜单下有四个菜单项:红、绿、蓝、黄。用户通过点击不同的菜单项,可以选择不同的颜色进行绘图。 2、建立名为“绘图”的菜单,该菜单下有三个菜单项:直线、曲线、矩形 其中“曲线”项有级联菜单,包括:圆、椭圆。 3、用户通过点击“绘图”中不同的菜单项,弹出对话框,让用户输入绘图位置,在指定位置进行绘图。

五、实验结果: 六、实验主要代码 1、画直线:CClientDC *m_pDC;再在OnDraw函数里给变量初始化m_pDC=new CClientDC(this); 在OnDraw函数中添加: m_pDC=new CClientDC(this); m_pDC->MoveTo(10,10); m_pDC->LineTo(100,100); m_pDC->SetPixel(100,200,RGB(0,0,0)); m_pDC->TextOut(100,100); 2、画圆: void CMyCG::LineDDA2(int xa, int ya, int xb, int yb, CDC *pDC) { int dx = xb - xa; int dy = yb - ya; int Steps, k; float xIncrement,yIncrement; float x = xa,y= ya; if(abs(dx)>abs(dy))

Qt 图形 课程设计

郑州科技学院QT课程设计 题目图形图像的绘制 学生姓名 专业班级 学号 所在系信息工程学院 指导教师 完成时间年月日

目录 1. 概述 (4) 1.1 背景说明 (4) 1.1.1简介 (4) 1.1.2 功能和优势 (4) 1.2 项目名称 (5) 1.3 项目功能 (5) 1.4 项目基本框架结构 (5) 2. 各模块功能的介绍 (6) 2.1 工具栏 (6) 2.1.1 file文件 (6) 2.1.2 help帮助 (7) 2.2 操纵台 (7) 2.2.1 style线型选择 (7) 2.2.2 width画笔宽度 (8) 2.2.3 color画笔颜色 (8) 2.2.4 clear清空画板 (9) 2.2.5 绘制图形 (9) 2.2.6 erasor 橡皮擦 (10) 2.2.7坐标定位 (11) 2.2.8画布 (11) 2.3 布局格式 (11) 3. 详细设计 (12) 3.1 子菜单功能的实现 (12) 3.1.1 New功能的实现 (12) 3.1.2 Open 功能的实现 (13) 3.1.3 Save 功能的实现 (13) 3.1.4 SaveAs 功能的实现 (14) 3.1.5 Exit 功能的实现 (15) 3.2悬浮窗内各个功能的实现 (15) 3.2.1 Style功能的实现 (15)

3.2.2 Width 功能的实现 (16) 3.2.3 Color 功能的实现 (17) 3.2.4 Clear 功能的实现 (18) 3.2.5 绘图功能的实现 (19) 3.2.6 erasor 功能的实现 (20) 3.3鼠标形状设置 (20) 3.4 坐标位置显示功能的实现 (21) 4. 项目中所用到的QT知识介绍 (21) 4.1 信号与槽 (21) 4.2 创建主窗口 (23) 4.3 自定义窗口部件 (23) 4.4 布局管理 (23) 4.5 QT中的事件机制 (24) 4.6 二维图形的绘制 (25) 4.7 项目中建立的类 (25) 4.8 类之间的相互关系 (25) 结束语 (26) 致谢 (26) 参考文献 (27)

《计算机图形学实验报告》

一、实验目的 1、掌握中点Bresenham直线扫描转换算法的思想。 2掌握边标志算法或有效边表算法进行多边形填充的基本设计思想。 3掌握透视投影变换的数学原理和三维坐标系中几何图形到二维图形的观察流程。 4掌握三维形体在计算机中的构造及表示方法 二、实验环境 Windows系统, VC6.0。 三、实验步骤 1、给定两个点的坐标P0(x0,y0),P1(x1,y1),使用中点Bresenham直线扫描转换算法画出连接两点的直线。 实验基本步骤 首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。 其次、使用中点Bresenham直线扫描转换算法实现自己的画线函数,函数原型可表示如下: void DrawLine(CDC *pDC, int p0x, int p0y, int p1x, int p1y); 在函数中,可通过调用CDC成员函数SetPixel来画出扫描转换过程中的每个点。 COLORREF SetPixel(int x, int y, COLORREF crColor ); 再次、找到文档视图程序框架视图类的OnDraw成员函数,调用DrawLine 函数画出不同斜率情况的直线,如下图:

最后、调试程序直至正确画出直线。 2、给定多边形的顶点的坐标P0(x0,y0),P1(x1,y1),P2(x2,y2),P3(x3,y3),P4(x4,y4)…使用边标志算法或有效边表算法进行多边形填充。 实验基本步骤 首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。 其次、实现边标志算法或有效边表算法函数,如下: void FillPolygon(CDC *pDC, int px[], int py[], int ptnumb); px:该数组用来表示每个顶点的x坐标 py :该数组用来表示每个顶点的y坐标 ptnumb:表示顶点个数 注意实现函数FillPolygon可以直接通过窗口的DC(设备描述符)来进行多边形填充,不需要使用帧缓冲存储。(边标志算法)首先用画线函数勾画出多边形,再针对每条扫描线,从左至右依次判断当前像素的颜色是否勾画的边界色,是就开始填充后面的像素直至再碰到边界像素。注意对顶点要做特殊处理。 通过调用GDI画点函数SetPixel来画出填充过程中的每个点。需要画线可以使用CDC的画线函数MoveTo和LineTo进行绘制,也可以使用实验一实现的画直线函数。 CPoint MoveTo(int x, int y ); BOOL LineTo(int x, int y ); 实现边标志算法算法需要获取某个点的当前颜色值,可以使用CDC的成员函数 COLORREF GetPixel(int x, int y ); 再次、找到文档视图程序框架视图类的OnDraw成员函数,调用FillPolygon 函数画出填充的多边形,如下: void CTestView::OnDraw(CDC* pDC) { CTestcoodtransDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

计算机图形学实验二

实验报告 课程名称:计算机图形学 实验项目:区域填充算法 实验仪器:计算机 系别:计算机学院 专业:计算机科学与技术 班级姓名:计科1602/ 学号:2016011 日期:2018-12-8 成绩: 指导教师:

一.实验目的(Objects) 1.实现多边形的扫描线填充算法。 二.实验内容 (Contents) 实现多边形的扫描线填充算法,通过鼠标,交互的画出一个多边形,然后利用种子填充算法,填充指定的区域。不能使用任何自带的填充区域函数,只能使用画点、画线函数或是直接对图像的某个像素进行赋值操作;

三.实验内容 (Your steps or codes, Results) //widget.cpp //2016CYY Cprogramming #include"widget.h" #include #include #include using namespace std; #define H 1080 #define W 1920 int click = 0; //端点数量 QPoint temp; QPoint first; int result = 1; //判断有没有结束 int sign = 1; //2为画线 int length = 5; struct edge { int ymax; float x; float dx; edge *next; }; edge edge_; QVector edges[H]; QVector points;//填充用 bool fin = false; QPoint *Queue = (QPoint *)malloc(length * sizeof(QPoint)); //存放端点的数组 Widget::Widget(QWidget *parent) : QWidget(parent) { } Widget::~Widget() { } void Widget::mouseMoveEvent(QMouseEvent *event) { setMouseTracking(true); if (click > 0 && result != 0) { startPt = temp; endPt =event->pos(); sign = 2; update(); } } void Widget::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { } else if (event->button() == Qt::RightButton) { sign = 2;

C语言课程设计--计算器(图形界面)

扬州大 学 题目一个简易计算器的设计与实现 班级 学号 姓名 指导教师 成绩 老师评语: 扬州大学信息工程学院 2010 年6 月25

目录 一、程序设计目的: (1) 二、程序设计内容: (1) 三、课程设计所补充的内容:补充的函数或算法…………3,4 四、系统总体设计 (4) 五、系统详细设计………………………………………5,6,7,8 六、运行结果………………………………………………8,9,10 七、系统调试…………………………………………8,9,10,11 八、课程设计体会总结………………………………8,9,10,11

1 课程设计目的 (1).课程设计是一项综合性实践环节,是对平时实验的一个补充,课程设计内容包括课程的主要理论知识,但由于C语言对初学者较难掌握,因而对一个完整的C语言程序不适合平时实验。通过课程设计可以达到综合设计C语言程序的目的。 (2)通过本课程设计,可以培养独立思考,综合运用所学有关相应知识的能力,能更好地使用C语言的知识,更好地了解C语言的好处和其可用性!掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级程序设计能力。为后续各门计算机课程的学习和毕业设计打下坚实基础! (3)通过本程序训练程序设计的基本技能,掌握字符串的表示方法和字符串函数的功能、自学掌握四则运算的算法及WIN-TC的图形操作的基本知识、键盘上特殊键的获取及图形方式下光标的显示。 2 课程设计内容 目的:本课程的课程设计要求学生模拟实现一个简单计算器,要求(1)能够实现四则运算,并能支持优先级运算。(2)三角与反三角运算:如sinx,cosx等。(3)指数对数运算:如log(x),lnx,e的x次方等。(4)其他运算:如X!,x 的累加等。(4)不允许调用库函数,使用自行开发的程序实现常用函数运算。(5)进一步考虑计算器外观设计,用可视化界面给出计算器外观、功能按键及输入界面。 使用说明:执行加法运算,'—'表示执行减法运算,表示执行乘法运算,'/'表示除法运算.‘Q’表示退出计算器‘C’表示清零,’=’表示得出结果'^'表示执行x的y次方,'e'表示执行e的x次方操作,'&'表示执行累加操作.,你可以可以用键盘上的上下左右键对光标进行移动,当光标移动到计算器按键上时,按ENTER即可执行该键的操作!最后按“=”则可得出结果。 3 课题设计的补充知识 本程序通过int specialkey(void)和#include来实现对屏幕的操作,通过调用int arrow()函数,int specialkey(void)和#include来实现对光标的操作。计算机图形采用Turbo C 2.0绘图程序制作。因此涉及C的图形程序设计知识。此外,由于不允许调用库函数,则要自行开发程序实现sinx,cosx,e的x次方函数运算,则可以根据幂级数的展开式来设计实现其运算的算法,而x的阶乘和x的累加则可用for语句来实现。 最后,不得不说说四则运算的算法,有两种方法可以实现:(1)利用堆栈实现四则运算(2)还可以用递归整数的四则运算。 sinx函数 #include

计算机图形学实验C++代码

一、bresenham算法画直线 #include #include #include void draw_pixel(int ix,int iy) { glBegin(GL_POINTS); glVertex2i(ix,iy); glEnd(); } void Bresenham(int x1,int y1,int xEnd,int yEnd) { int dx=abs(xEnd-x1),dy=abs(yEnd-y1); int p=2*dy-dx; int twoDy=2*dy,twoDyMinusDx=2*dy-2*dx; int x,y; if (x1>xEnd) { x=xEnd;y=yEnd; xEnd=x1; } else { x=x1; y=y1; } draw_pixel(x,y); while(x

} void myinit() { glClearColor(0.8,1.0,1.0,1.0); glColor3f(0.0,0.0,1.0); glPointSize(1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,500.0,0.0,500.0); } void main(int argc,char **argv ) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(500,500); glutInitWindowPosition(200.0,200.0); glutCreateWindow("CG_test_Bresenham_Line example"); glutDisplayFunc(display); myinit(); glutMainLoop(); } 二、中点法绘制椭圆 #include #include #include inline int round(const float a){return int (a+0.5);} void setPixel(GLint xCoord,GLint yCoord) { glBegin(GL_POINTS); glVertex2i(xCoord,yCoord); glEnd(); } void ellipseMidpoint(int xCenter,int yCenter,int Rx,int Ry) { int Rx2=Rx*Rx; int Ry2=Ry*Ry; int twoRx2=2*Rx2; int twoRy2=2*Ry2; int p; int x=0; int y=Ry; int px=0; int py=twoRx2*y; void ellipsePlotPoints(int,int,int,int);

计算机图形学实验报告

计算机图形学 实验报告 姓名:谢云飞 学号:20112497 班级:计算机科学与技术11-2班实验地点:逸夫楼507 实验时间:2014.03

实验1直线的生成 1实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析 实验数据的能力; 编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的 直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记 录两种算法的绘制时间;利用excel等数据分析软件,将试验结果编 制成表格,并绘制折线图比较两种算法的性能。 2实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One(自制平台)。 本实验提供名为 Experiment_Frame_One的平台,该平台提供基本 绘制、设置、输入功能,学生在此基础上实现DDA算法和Mid_Bresenham 算法,并进行分析。 ?平台界面:如错误!未找到引用源。所示 ?设置:通过view->setting菜单进入,如错误!未找到引 用源。所示 ?输入:通过view->input…菜单进入.如错误!未找到引用 源。所示 ?实现算法: ◆DDA算法:void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) Mid_Bresenham法:void CExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)

3实验结果 3.1程序流程图 1)DDA算法流程图:开始 定义两点坐标差dx,dy,以及epsl,计数k=0,描绘点坐标x,y,x增 量xIncre,y增量yIncre ↓ 输入两点坐标x1,y1,x0,y0 ↓ dx=x1-x0,dy=y1-y0; _________↓_________ ↓↓ 若|dx|>|dy| 反之 epsl=|dx| epsl=|dy| ↓________...________↓ ↓ xIncre=dx/epsl; yIncre=dy/epsl ↓ 填充(强制整形)(x+0.5,y+0.5); ↓←←←← 横坐标x+xIncre; 纵坐标y+yIncre; ↓↑ 若k<=epsl →→→k++ ↓ 结束 2)Mid_Bresenham算法流程图开始 ↓ 定义整形dx,dy,判断值d,以及UpIncre,DownIncre,填充点x,y ↓ 输入x0,y0,x1,y1 ______↓______ ↓↓ 若x0>x1 反之 x=x1;x1=x0;x0=x; x=x0;

计算机图形学课设(含所有程序图文)

计算机图形学课程设计报告 系(院):计算机科学学院 专业班级:信计11102 姓名:吴家兴 学号:201106262 指导教师:严圣华 设计时间:2014.6.16 - 2014.6.26 设计地点:10教机房

(此处目录根据自己情况可以调整改动) 一、课程设计目的 ................................................. 错误!未定义书签。 二、课程设计具体要求..................................... 错误!未定义书签。 三、需求分析与总体设计 ..................................... 错误!未定义书签。 四、详细设计与实现[含关键代码和实现界面] ... 错误!未定义书签。 五、小结......................................................................................... 错误!未定义书签。 一、课程设计目的 计算机图形学课程设计是验证、巩固和补充课堂讲授的理论知识的必要环节,通过上机实验,培养学生的自学能力、动手能力、综合运用知识解决实际问题的能力。要求学生运用计算机图形学理论与技术设计、编写、调试程序并撰写课程设计报告。 二、课程设计具体要求 1.独立完成设计并撰写课程设计报告。 2.在规定时间将程序和设计报告用附件(信计111X班XXX 图形学课设报告.RAR)发送到274548837@https://www.doczj.com/doc/e212161041.html,,并上交纸质打印稿(A4纸10页左右)。 3. 课程设计报告内容包括: (1)列出设计者姓名及本人详细信息、所用开发工具; (2)程序的基本功能介绍; (3)程序实现步骤和关键算法的理论介绍; (4)关键源代码实现说明。(不要打印全部源程序!) (5)程序运行界面截图(3幅左右) (6)课设总结和自我评价。 4.《计算机图形学》课程的知识结构体系: (1)课设为期两周:总学时为40学时,2学分 (2)学生必须完成二维线画图元和二维填充图元两个大功能。二维裁剪和二维图形变换至少实现两个内容。总共不少于10个算法。 (3)程序应做到:通用性、交互性、界面友好性!

计算机图形学实验二报告

计算机科学与通信工程学院 实验报告 课程计算机图形学 实验题目曲线拟合 学生姓名 学号 专业班级 指导教师 日期

成绩评定表

曲线拟合 1. 实验内容 1. 绘制三次Bezier曲线 (1)给定四个已知点P1—P4,以此作为控制顶点绘制一段三次Bezier曲线。 (2)给定四个已知点P1—P4,以此作为曲线上的点绘制一段三次Bezier曲线。 2. 绘制三次B样条曲线 给定六个已知点P1—P6,以此作为控制顶点绘制一条三次B样条曲线。 2. 实验环境 软硬件运行环境:Windows XP 开发工具:visual studio 2008 3. 问题分析 1. 绘制三次Bezier曲线 Bezier曲线是用N+1个顶点(控制点)所构成的N根折线来定义一根N阶曲线。本次实验中的三次Bezier曲线有4个顶点,设它们分别为P0,P1,P2,P3,那么对于曲线上各个点Pi(x,y)满足下列关系: P(t)=[(-P0+3P1-3P2+3P3)t3+(3P0-6P1+3P2)t2+(-3P0+3P2)t+(P0+4P1+P2)]/6 X(t)=[(-X0+3X1-3X2+3X3)t3+(3X0-6X1+3X2)t2+(-3X0+3X2)t+(X0+4X1+X2)]/6 Y(t)=[(-Y0+3Y1-3Y2+3Y3)t3+(3Y0-6Y1+3Y2)t2+(-3Y0+3Y2)t+(Y0+4Y1+Y2)]/6 其中P0、P1、P2、P3为四个已知的点,坐标分别为(X0、Y0)、(X1、Y1)、(X1、Y2) 、(X3、Y3)。所以只要确定控制点的坐标,该曲线可通过编程即可绘制出来。 2. 绘制三次B样条曲线 三次B样条函数绘制曲线的光滑连接条件为:对于6个顶点,取P1、P2、P3、P4 4个顶点绘制在第一段三次样条曲线,再取P2、P3、P4、P5 这4个顶点绘制在第二段三次样条曲线,总计可绘制3段光滑连接的三次样条曲线。 4. 算法设计 程序框架 //DiamondView.h class CDiamondView : public CView { ……

基于某LinuxQT图形图像课程设计

科技学院 QT课程设计

题目制作画图工具学生 专业班级 学号 所在系 指导教师 完成时间年月日

目录 1概述 (1) 1.1项目名称 (1) 1.2 画图工具基本框架 (1) 1.3 画图工具功能介绍 (2) 1.3.1菜单 (2) 1.3.2线型选择 (3) 1.3.3画笔宽度 (3) 1.3.4画笔颜色 (3) 1.3.5清空画板 (3) 1.3.6绘制图形 (3) 1.3.7橡皮擦 (3) 1.3.8坐标定位 (3) 1.4 制作画图工具使用的编程语言 (4) 1.5 编译环境 (4) 1.6 使用QT编程语言制作画图工具的优势 (4) 1.7 项目制作过程中应用到的QT知识 (4) 1.7.1信号与槽 (4) 1.7.2对话框 (4) 1.7.3创建主窗口 (4)

1.7.5布局管理 (5) 1.7.6 QT中的事件机制 (5) 1.7.7二维图形的绘制 (5) 1.8 项目中建立的类 (5) 1.9 类之间的相互关系 (5) 2 总体设计 (6) 2.1 主窗口 (6) 2.1.1创建主窗口 (6) 2.1.2添加菜单 (6) 2.1.3添加子菜单 (6) 2.1.4创建状态栏 (7) 2.2 悬浮窗 (7) 2.2.1线型选项 (7) 2.2.2画笔宽度调节 (8) 2.1.3画笔颜色选择 (8) 2.2.4清空画板 (9) 2.2.5绘制图形 (9) 2.2.6橡皮擦 (9) 2.3 画板 (10)

2.3.2画布的颜色初始化 (10) 2.3.3画板大小 (10) 3 详细设计 (10) 3.1 子菜单功能的实现 (10) 3.1.1 New功能的实现 (10) 3.1.2 Open 功能的实现 (11) 3.1.3 Save 功能的实现 (11) 3.1.4 SaveAs 功能的实现 (12) 3.2 悬浮窗各个功能的实现 (13) 3.2.1 Style功能的实现 (13) 3.2.2 Width 功能的实现 (14) 3.2.3 Color 功能的实现 (14) 3.2.4 Clear 功能的实现 (16) 3.2.5 绘图功能的实现 (16) 3.2.6 eraser 功能的实现 (17) 3.3 鼠标形状设置 (17) 3.4 坐标位置显示功能的实现 (17) 结束语 (18) 致谢 (19) 参考文献 (20)

计算机图形学实验报告

.

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握DDA直线扫描转换算法。 3.深入了解直线扫描转换的编程思想。 二、【实验内容】 1.利用DDA的算法原理,编程实现对直线的扫描转换。 2.加强对DDA算法的理解和掌握。 三、【测试数据及其结果】 四、【实验源代码】 #include

#include #include #include GLsizei winWidth=500; GLsizei winHeight=500; void Initial(void) { glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } void DDALine(int x0,int y0,int x1,int y1) { glColor3f(1.0,0.0,0.0); int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { glPointSize(3); glBegin(GL_POINTS); glV ertex2i(int(x+0.5),(int)(y+0.5)); glEnd(); x+=xIncre; y+=yIncre; } } void Display(void) { glClear(GL_COLOR_BUFFER_BIT); DDALine(100,100,200,180); glFlush(); }

计算机图形学课程设计

《计算机图形学》实验报告 题目: 3D真实感场景 绘制 姓名: 郭继杰 学号: 2014214168 班级: 地信141 学院: 理学院 指导老师: 解山娟 日期: 2017年1月1日 一、实验目的 结合一学期所学计算机图形学知识,基于专业背景,使用OpenGL 绘制简单的3D真实感图形场景。 二、实验要求 应用光栅化算法、多边形裁剪计算以及消隐算法在场景绘制中, 其中真实感场景绘制包括颜色模型、纹理模型、雾化模型、运动模型 以及环境光、漫反射、镜面反射等光照模型设置。 三、实验小组及任务分工 小组成员任务分工 金城纹理贴图,颜色模型,雾化模型 郭继杰运动模型,光照模型

沈黎达材料收集,代码整合 四、实验内容 1、实验前期工作 前期工作经过小组成员充分讨论,资料收集,最终确定小组实验模板为以下两幅场景。目标就是实现一艘简单3D帆船模型以及一辆3D小车模型 2、程序编译环境:Visual Studio 2012 3、光照模型建立过程 光照模型建立流程图: 3、1设置光照模型相应指数

3、2打开光源 光照模型设计过程有两点注意的就是: 1、glShadeModel函数用于控制opengl中绘制指定两点间其她点颜色的过渡模式,参数一般为GL_SMOOTH、GL_FLAT,如果两点的颜色相同,使用两个参数效果相同,如果两点颜色不同,GL_SMOOTH会出现过渡效果,GL_FLAT 则只就是以指定的某一点的单一色绘制其她所有点。 glShadeModel(GL_FLAT) 着色模式glShadeModel(GL_SMOOTH)着色模式(可以瞧出GL_SMOOTH模式下颜色更加光滑) 2、需要使用光照模型时必须启用,glEnable(GL_LIGHTING)(启用灯源)、glEnable(GL_LIGHT0)(启用光源),否则所有灯光效果都会无效。效果对比如下图所示。

相关主题
文本预览
相关文档 最新文档