版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 阿坝州农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(网校专用)
- 定西市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及1套参考答案详解
- 泰安市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(夺冠)
- 安阳市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(突破训练)
- 天水市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(巩固)
- 2026年福州市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)带答案详解
- 定西市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(a卷)
- 2026年周口市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(满分必刷)
- 大连市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(名校卷)
- 2026年衡水市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(培优a卷)
- 2025广东东莞市寮步镇人民政府招聘专职安全员10人考前自测高频考点模拟试题及答案详解一套
- 2024石家庄市国企招聘考试真题及答案
- 远程机器人手术操作指南(2025版)
- 2025天津宏达投资控股有限公司及所属企业招聘工作人员笔试模拟试题及答案解析
- 2025年度北京市公务员录用考试行政职业能力测验试卷真题及答案
- 五年(2021-2025)高考地理真题分类汇编:专题12 交通(全国)(原卷版)
- 消防证考试题目及答案
- 麦肯锡思维培训
- 新能源汽车企业财务风险分析及防范研究-以北汽蓝谷为例
- DB11-T 941-2021 无机纤维喷涂工程技术规程
- 隧道正洞机械开挖(电子雷管引爆)项目专项预算定额
评论
0/150
提交评论