计算机图形学c实验指导五_第1页
计算机图形学c实验指导五_第2页
计算机图形学c实验指导五_第3页
计算机图形学c实验指导五_第4页
计算机图形学c实验指导五_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验五课程名称:计算机图形学实验名称:裁剪和曲线 实验日期:xx xx xx班级:xxxxxx姓名:xxxx 学号xxxx仪器编号:xx一、实验目的和要求1、掌握直线段的裁剪算法;2、掌握hermite |w线生成算法;二、实验内容1、下面的程序段在windows控制台下实现按住鼠标右键绘制一个矩形,按住鼠标左键,绘制直线段,并 利用cohen-sutherland算法实现肓线裁剪。要求理解掌握下面程序的执行过程。同时把该程序修改成mfc 框架形式。#include <gl7glut.h>#include <cmath>#include <vector>us

2、ing std:vector;class pt2dpublic:glfloat x, y;pt2d()(;pt2d( glfloat xx, glfloat yy )x = xx;y = yy;vector< pt2d > vector 1; vector< pt2d > vector2; int min = 0;int max = 600;pt2d startp;pt2d prep;pt2d box a;pt2d boxb;pt2d temp 1;pt2d temp2;bool buttonflag = true;以下是cohen-sutherland线段裁剪算法的实

3、现const glint winleftbitcode = 0x1;const glint winrightbitcode = 0x2;const glint winbottombitcode = 0x4;const glint wintopbitcodc = 0x& /区域码inline glint round( const glfloat a ) return glint( a + 0.5 ); inline glint inside( glint code ) return glint( !code ); inline glint reject( glint codel, gli

4、nt code2 ) return glint( code 1 & codc2 ); inline glint accept( glint codel, glint code2 ) return glint( !( codel i code2 ); 各种按位运算glubytc cncodc( pt2d pt) 获得外部码glubytc code = 0x00;if( pt.x < boxa.x )code = code i winleftbitcode;if( pt.x > boxb.x )code = code i winrightbitcode;if( pt.y <

5、; boxa.y )code = code i winbottombitcode;if( pt.y > boxb.y )code = code i wintopbitcode;return code;template< class type > void swap( type* x, type* y ) 交换数值的模板函数type temp; temp = *x;*x = *y;*y = temp;void lineclip( pt2d pl, pod p2 )裁剪算法 glubyte codel, code2;bool done = false, plotline = fa

6、lse;glfloat m;while( !done)code 1 = cncodc( pl );code2 = encode( p2 );glint qq = accept( code 1, code2 );if( accept( code 1, code2 )done = true;plotline = true;else if( reject( code 1, code2 )done = true;elseif( inside( codel )swap( &pl, &p2);swap( &codcl, &codc2);if( p2.x != pl.x )m

7、 = ( p2.y - pl.y ) / ( p2.x - pl.x );if( codel & winleftbitcode )pl.y += ( boxa.x - pl.x ) * m;pl.x = boxa.x;else if( codel & winrightbitcode )pl.y += ( boxb.x - pl.x ) * m;pl.x = boxb.x;else if( codel & winbottombitcode )if( p2.x != pl.x )pl.x += ( boxa.y pl.y ) / m;pl.y = boxa.y;else i

8、f( code 1 & wintopbitcodc )if( p2.x != pl.x )pl.x += ( boxb.y pl.y ) / m;pl.y = boxb.y;if( plotlinc)vector 1 .push_back( p 1 );vector2.push_back( p2 ); 裁剪后保存线段void drawlines() /绘制所有裁剪过后的线段for (int i = 0; i < vector2.size(); +i)glcolor3f( 0.0, 0.0, 1.0);glbegin( gl_l1nes );glvertex2i( vector 1

9、 i j.x, vector 1 i j.y );glvertex2i( vector2f i .x, vector2 i .y ); glend();void drawline( glint xl, glint yl, glint x2, glint y2 )glbegin( gl_lines );glvcrtcx2i( xl, yl );glvertex2i( x2, y2);glend();void drawbox()glcolor3f( 1.0, 0.0, 0.0);glpolygonmode( gl_front_and_back, gl.line); glrecti( boxa.x,

10、 boxa.y, boxb.x, boxb.y );void drawrcctanglc( glint xl, glint yl, glint x2, glint y2 ) glpolygonmode( gl_front_and_back, gl.line); glrecti( xl, yl, x2, y2 );void display( void )glclear( gl_color_buffer_b1t);glflush();void clickmousc( int btn, int state, int xn, int yn )if( btn = glut_left_button &am

11、p;& state = glut_down )/左键按下:记录线段buttonflag = true;startp.x = xn;startp.y = glutget( glut_window_height) yn;temp l.x = startp.x;templ.y = startp.y;else if( btn = glut_left_button && state = glut_up)左键释放:绘制线段startp.x = xn;startp.y = glutget( glut_window_height) - yn;temp2.x = startp.x;tem

12、p2.y = startp.y;lineclip( temp 1, temp2 );glclear( gl_color_buffer_bit);drawlincs();drawbox();else if( btn = glut_right.button && state = glut_down )右键按下:记录裁剪框glclcar( gl_color_buffer_bit);vectorl.clear();vector2.clear();buttonflag = false;startp.x = xn;startp.y = glutgct( glut_window_height

13、) - yn;boxa.x = startp.x;boxa.y = startp.y;else if( btn = glut_right_button && state = glut_up)/右键释放:裁剪框startp.x = xn;startp.y = glutget( glut_w1ndow_he1ght) yn;if( startp.x < boxa.x )boxb.x = boxa.x;boxa.x = startp.x;elseboxb.x = startp.x;if( startp.y < boxa.y ) boxb.y = boxa.y;boxa.y

14、 = startp.y;elseboxb.y = startp.y;drawbox();glflush();void movemouse( int xn, int yn ) 鼠标按卜移动时动态更新当前线段和裁剪框if( buttonflag)glcolor3f( 1.0, 1.0, 1.0);drawline( startp.x, startp.y, prep.x, prep.y );drawlines();draw b ox();prep.x = xn;prep.y = glutget( glut_window_height) yn;glcolor3f( 0.0, 1.0, 0.0);dra

15、wline( startp.x, startp.y, prep.x, prep.y );else glcolor3f( 1.0, 1.0, 1.0);drawrectangle( startp.x, startp.y, prep.x, prep.y ); drawlincs();prep.x = xn;prep.y = glutget( glut_window_height) yn; glcolor3f( 0.0, 1.0, 0.0);drawrectangle( startp.x, startp.y, prep.x, prep.y );glflush();void myinit()glmat

16、rixmodc( gl_projection); gluortho2d( min, max, min, max ); glclearcolor( 1.0, 1.0, 1.0, 1.0);int main( int argc, char *argv ) glutlnit( &argc, argv ); glutinitdisplaymodc( glut_single i glut_rgb );glutinitwindowsize( max, max );glutcreatewindow( "line clip");glutdisplayfunc( display);glutmousefunc( clickmouse );glutmotionfunc( movcmousc );myinit();glutmainloopo;return 0;2、假设窗口的宽高分別是600, 600个像素单位,定义的裁剪窗口由函数gluortho2d(-50.0,5

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论