首页 图形学三维线段的裁剪显示

图形学三维线段的裁剪显示

举报
开通vip

图形学三维线段的裁剪显示三维线段的裁剪及显示专业:信计0902小组成员:王文祥、高天宇、何弯弯、崔文强、王豹时间:2011年12月28日课程设计题目:三维线段的裁剪及显示题目要求:对于三维线段,裁剪体为长方体,应用端点编码或Liang-Barsky裁剪算法对线段进行裁剪,做XOY平面的平行投影,要求分别绘制裁剪体、带裁剪线段和裁剪后线段。任务分析:(1)长方体及三维线段的显示流程;任务包括长方体的定义:三维点结构(齐次坐标,结构中应有x,y,z,w分量);面结构,其实为面的外环,即构成该面的顶点序列(逆时针顺序);三维线段的两个端点;三维...

图形学三维线段的裁剪显示
三维线段的裁剪及显示专业:信计0902小组成员:王文祥、高天宇、何弯弯、崔文强、王豹时间:2011年12月28日课程设计题目:三维线段的裁剪及显示题目要求:对于三维线段,裁剪体为长方体,应用端点编码或Liang-Barsky裁剪算法对线段进行裁剪,做XOY平面的平行投影,要求分别绘制裁剪体、带裁剪线段和裁剪后线段。任务分析:(1)长方体及三维线段的显示流程;任务包括长方体的定义:三维点结构(齐次坐标,结构中应有x,y,z,w分量);面结构,其实为面的外环,即构成该面的顶点序列(逆时针顺序);三维线段的两个端点;三维几何变换;平行投影变换;窗口-视区变换;(2)三维线段的端点编码或Liang-Barsky裁剪算法;任务长方体的六个边界定义,三维点的端点编码,三维线段端点编码裁剪算法;核心算法描述:Liang_Barsky裁剪算法基本思想:更快的直线裁剪算法基于线段的参数化方程的分析,可以把直线方程写成以下形式:其中,若点满足:则该点在窗口内。首先按参数化形式写出该形式的裁剪条件:这四个不等式可以表示为:其中,参数p,q定义为:若,其中,k对应于该裁剪边界(k=0,1,2,3,4,5,6对应于左、右、下、上边界)若,则线段完全在边界外;若,则线段平行于该裁剪边界并且在窗口内;当,线段从裁剪边界延长线的外部延伸到内部;当,线段从裁剪边界的内部延伸到外部;算法步骤①定义结构和变量定义三维齐次坐标结构和面结构;定义长方体表面模型,顶点表为顶点结构数组pts[8],面表为面结构数组faces[6];定义待裁剪线段的两个端点p1,p2和裁剪后线段的两个端点p3,p4。②变量初始化在视图类构造函数中给顶点表赋值;给面表赋值(注意顶点序列顺序);给待裁剪线段端点赋值;给待裁剪线段端点赋原点值进行初始化。③在视图类中添加计算端点编码的函数;添加三维线段裁决的函数。定义线段裁剪时用到的六条边界,各边界的取值为长方体相应的值。④分别对长方体、待裁剪线段、裁剪后线段进行绕X轴旋转,再绕Y轴旋转。⑤分别对长方体、待裁剪线段、裁剪后线段进行以XOY平面为投影平面的平行投影变换。⑥分别对长方体、待裁剪线段、裁剪后线段进行窗口视区变换,注意窗口的选区。⑦显示变换后长方体,用实线绘制待裁剪线段,定义画笔,用虚线绘制裁剪后线段。程序核心代码:视图类头文件//Draw3DView.h:interfaceoftheCDraw3DViewclass///////////////////////////////////////////////////////////////////////////////#if!defined(AFX_DRAW3DVIEW_H__49195EF8_8785_46EA_89D5_35CD8D2F85C7__INCLUDED_)#defineAFX_DRAW3DVIEW_H__49195EF8_8785_46EA_89D5_35CD8D2F85C7__INCLUDED_#if_MSC_VER>1000#pragmaonce#endif//_MSC_VER>1000#definePI3.1415926//定义三维齐次坐标结构typedefstructtagHOMOCOORD{floatx;floaty;floatz;floatw;}HOMOCOORD;//定义边的结构typedefstructtagLINE{intp1,p2;}LINE;//定义面的结构typedefstructtagPLANE{intv0,v1,v2,v3;boolisvisible;}PLANE;//定义点的结构,需要浮点数的x,ytypedefstructtagMYPOINT{floatx,y;}MYPOINT;classCDraw3DView:publicCView{protected://createfromserializationonlyCDraw3DView();DECLARE_DYNCREATE(CDraw3DView)//Attributespublic:CDraw3DDoc*GetDocument();//Operationspublic://Overrides//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX_VIRTUAL(CDraw3DView)public:virtualvoidOnDraw(CDC*pDC);//overriddentodrawthisviewvirtualBOOLPreCreateWindow(CREATESTRUCT&cs);protected:virtualBOOLOnPreparePrinting(CPrintInfo*pInfo);virtualvoidOnBeginPrinting(CDC*pDC,CPrintInfo*pInfo);virtualvoidOnEndPrinting(CDC*pDC,CPrintInfo*pInfo);//}}AFX_VIRTUAL//Implementationpublic:intCT(floatp,floatq,float*u1,float*u2);voidLB(HOMOCOORDp1,HOMOCOORDp2,intxl,intxr,intyb,intyt,intzf,intzb);HOMOCOORDGetN(HOMOCOORDp1,HOMOCOORDp2,HOMOCOORDp3);voidRotateY(intangle);voidRotateX(intangle);voidDrawMy3DGraphics();virtual~CDraw3DView();#ifdef_DEBUGvirtualvoidAssertValid()const;virtualvoidDump(CDumpContext&dc)const;#endifprotected:HOMOCOORD*pts,*p,*pp;MYPOINT*pts2D,*p2D,*pp2D;PLANE*faces;intptn,fn;//Generatedmessagemapfunctionsprotected://{{AFX_MSG(CDraw3DView)//NOTE-theClassWizardwilladdandremovememberfunctionshere.//DONOTEDITwhatyouseeintheseblocksofgeneratedcode!//}}AFX_MSGDECLARE_MESSAGE_MAP()};#ifndef_DEBUG//debugversioninDraw3DView.cppinlineCDraw3DDoc*CDraw3DView::GetDocument(){return(CDraw3DDoc*)m_pDocument;}#endif///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}//MicrosoftVisualC++willinsertadditionaldeclarationsimmediatelybeforethepreviousline.#endif//!defined(AFX_DRAW3DVIEW_H__49195EF8_8785_46EA_89D5_35CD8D2F85C7__INCLUDED_)视图类源文件//Draw3DView.cpp:implementationoftheCDraw3DViewclass//#include"stdafx.h"#include"Draw3D.h"#include"math.h"#include"Draw3DDoc.h"#include"Draw3DView.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CDraw3DViewIMPLEMENT_DYNCREATE(CDraw3DView,CView)BEGIN_MESSAGE_MAP(CDraw3DView,CView)//{{AFX_MSG_MAP(CDraw3DView)//NOTE-theClassWizardwilladdandremovemappingmacroshere.//DONOTEDITwhatyouseeintheseblocksofgeneratedcode!//}}AFX_MSG_MAP//StandardprintingcommandsON_COMMAND(ID_FILE_PRINT,CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT,CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview)END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CDraw3DViewconstruction/destructionCDraw3DView::CDraw3DView(){//TODO:addconstructioncodehere}CDraw3DView::~CDraw3DView(){}BOOLCDraw3DView::PreCreateWindow(CREATESTRUCT&cs){//TODO:ModifytheWindowclassorstylesherebymodifying//theCREATESTRUCTcsreturnCView::PreCreateWindow(cs);}///////////////////////////////////////////////////////////////////////////////CDraw3DViewdrawingvoidCDraw3DView::OnDraw(CDC*pDC){CDraw3DDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedatahereDrawMy3DGraphics();}///////////////////////////////////////////////////////////////////////////////CDraw3DViewprintingBOOLCDraw3DView::OnPreparePrinting(CPrintInfo*pInfo){//defaultpreparationreturnDoPreparePrinting(pInfo);}voidCDraw3DView::OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/){//TODO:addextrainitializationbeforeprinting}voidCDraw3DView::OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/){//TODO:addcleanupafterprinting}///////////////////////////////////////////////////////////////////////////////CDraw3DViewdiagnostics#ifdef_DEBUGvoidCDraw3DView::AssertValid()const{CView::AssertValid();}voidCDraw3DView::Dump(CDumpContext&dc)const{CView::Dump(dc);}CDraw3DDoc*CDraw3DView::GetDocument()//non-debugversionisinline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDraw3DDoc)));return(CDraw3DDoc*)m_pDocument;}#endif//_DEBUG///////////////////////////////////////////////////////////////////////////////CDraw3DViewmessagehandlersvoidCDraw3DView::DrawMy3DGraphics(){p=newHOMOCOORD[4];p[0].x=2;p[0].y=-3;p[0].z=2;p[0].w=1;p[1].x=-2;p[1].y=3;p[1].z=-2;p[1].w=1;p[2].x=2;p[2].y=-3;p[2].z=2;p[2].w=1;p[3].x=-2;p[3].y=3;p[3].z=-2;p[3].w=1;//形体定义ptn=8;pts=newHOMOCOORD[ptn];//设置长方体pts[0].x=1;pts[0].y=2;pts[0].z=1;pts[0].w=1;pts[1].x=-1;pts[1].y=2;pts[1].z=1;pts[1].w=1;pts[2].x=-1;pts[2].y=-2;pts[2].z=1;pts[2].w=1;pts[3].x=1;pts[3].y=-2;pts[3].z=1;pts[3].w=1;pts[4].x=1;pts[4].y=2;pts[4].z=-1;pts[4].w=1;pts[5].x=-1;pts[5].y=2;pts[5].z=-1;pts[5].w=1;pts[6].x=-1;pts[6].y=-2;pts[6].z=-1;pts[6].w=1;pts[7].x=1;pts[7].y=-2;pts[7].z=-1;pts[7].w=1;///给定义面的指针分配内存;fn=6;faces=newPLANE[fn];//设置立方体各面faces[0].v0=0;faces[0].v1=1;faces[0].v2=2;faces[0].v3=3;faces[0].isvisible=false;faces[1].v0=4;faces[1].v1=5;faces[1].v2=1;faces[1].v3=0;faces[1].isvisible=false;faces[2].v0=5;faces[2].v1=6;faces[2].v2=2;faces[2].v3=1;faces[2].isvisible=false;faces[3].v0=6;faces[3].v1=7;faces[3].v2=3;faces[3].v3=2;faces[3].isvisible=false;faces[4].v0=7;faces[4].v1=4;faces[4].v2=0;faces[4].v3=3;faces[4].isvisible=false;faces[5].v0=7;faces[5].v1=6;faces[5].v2=5;faces[5].v3=4;faces[5].isvisible=false;pts2D=newMYPOINT[ptn];p2D=newMYPOINT[2];inti;LB(p[0],p[1],-1,1,-2,2,1,-1);RotateX(20);RotateY(30);HOMOCOORDview;//视线方向view.x=0;view.y=0;view.z=1;view.w=1;for(i=0;i<fn;i++){PLANEf=faces[i];HOMOCOORDN=GetN(pts[f.v0],pts[f.v1],pts[f.v2]);if(N.x*view.x+N.y*view.y+N.z*view.z>0)faces[i].isvisible=true;}//平行投影变换for(i=0;i<ptn;i++){pts2D[i].x=pts[i].x;pts2D[i].y=pts[i].y;}for(i=0;i<4;i++){p2D[i].x=p[i].x;p2D[i].y=p[i].y;}//窗口-视区变换实现过程floatwxl=-3,wxr=3,wyb=-3,wyt=3;intvxl=0,vxr=500,vyb=0,vyt=400;floatsx=(vxr-vxl)/(wxr-wxl),sy=(vyt-vyb)/(wyt-wyb),dx=vxl-sx*wxl,dy=vyb-sy*wyb;for(i=0;i<ptn;i++){pts2D[i].x=sx*pts2D[i].x+dx;pts2D[i].y=sy*pts2D[i].y+dy;}for(i=0;i<4;i++){p2D[i].x=sx*p2D[i].x+dx;p2D[i].y=sy*p2D[i].y+dy;}//图形显示CClientDCdc(this);dc.MoveTo(p2D[0].x,p2D[0].y);//实线dc.LineTo(p2D[1].x,p2D[1].y);CPen*pOld,newpen(PS_DOT,1,RGB(0,0,0));pOld=dc.SelectObject(&newpen);dc.MoveTo(p2D[2].x,p2D[2].y);dc.LineTo(p2D[3].x,p2D[3].y);for(i=0;i<fn;i++)//显示每个面上的各边{//设置画笔为虚线PLANEf=faces[i];if(!f.isvisible)//如果该面为不可见面{dc.MoveTo(pts2D[f.v0].x,pts2D[f.v0].y);dc.LineTo(pts2D[f.v1].x,pts2D[f.v1].y);dc.LineTo(pts2D[f.v2].x,pts2D[f.v2].y);dc.LineTo(pts2D[f.v3].x,pts2D[f.v3].y);dc.LineTo(pts2D[f.v0].x,pts2D[f.v0].y);}}dc.SelectObject(pOld);//把画笔设置为原理的实线for(i=0;i<fn;i++)//显示每个面上的各边{PLANEf=faces[i];if(f.isvisible)//如果该面为不可见面{dc.MoveTo(pts2D[f.v0].x,pts2D[f.v0].y);dc.LineTo(pts2D[f.v1].x,pts2D[f.v1].y);dc.LineTo(pts2D[f.v2].x,pts2D[f.v2].y);dc.LineTo(pts2D[f.v3].x,pts2D[f.v3].y);dc.LineTo(pts2D[f.v0].x,pts2D[f.v0].y);}}}voidCDraw3DView::RotateX(intangle){floata=angle*PI/180;for(inti=0;i<ptn;i++){floatx,y,z;y=pts[i].y;z=pts[i].z;x=pts[i].x;pts[i].y=y*cos(a)-z*sin(a);pts[i].z=y*sin(a)+z*cos(a);}for(i=0;i<4;i++){floatx,y,z;y=p[i].y;z=p[i].z;x=p[i].x;p[i].y=y*cos(a)-z*sin(a);p[i].z=y*sin(a)+z*cos(a);}}voidCDraw3DView::RotateY(intangle){floatb=angle*PI/180;for(inti=0;i<ptn;i++){floatx,y,z;x=pts[i].x;z=pts[i].z;y=pts[i].y;pts[i].x=x*cos(b)-z*sin(b);pts[i].z=x*sin(b)+z*cos(b);}for(i=0;i<4;i++){floatx,y,z;x=p[i].x;z=p[i].z;y=p[i].y;p[i].x=x*cos(b)-z*sin(b);p[i].z=x*sin(b)+z*cos(b);}}HOMOCOORDCDraw3DView::GetN(HOMOCOORDp1,HOMOCOORDp2,HOMOCOORDp3){floatx1=p2.x-p1.x,y1=p2.y-p1.y,z1=p2.z-p1.z;floatx2=p3.x-p2.x,y2=p3.y-p2.y,z2=p3.z-p2.z;HOMOCOORDN;N.x=y1*z2-y2*z1;N.y=-(x1*z2-x2*z1);N.z=x1*y2-x2*y1;returnN;}voidCDraw3DView::LB(HOMOCOORDp1,HOMOCOORDp2,intxl,intxr,intyb,intyt,intzf,intzb)//裁剪主函数{floatu1=0.0,u2=1.0,dx=p2.x-p1.x,dy=p2.y-p1.y,dz=p2.z-p1.z;inti;if(CT(-dx,p1.x-xl,&u1,&u2))//裁减左边界if(CT(dx,xr-p1.x,&u1,&u2))//裁减右边界if(CT(-dy,p1.y-yb,&u1,&u2))//裁减下边界if(CT(dy,yt-p1.y,&u1,&u2))//裁减上边界if(CT(-dz,p1.z-zb,&u1,&u2))//裁减后边界if(CT(dz,zf-p1.z,&u1,&u2))//裁减前边界{if(u1<=u2)//如果直线在窗口内{p[2].x=p1.x+u1*dx;p[2].y=p1.y+u1*dy;p[2].z=p1.z+u1*dz;p[2].w=1;p[3].x=p1.x+u2*dx;p[3].y=p1.y+u2*dy;p[3].z=p1.z+u2*dz;p[3].w=1;}}}intCDraw3DView::CT(floatp,floatq,float*u1,float*u2)//对每个面的裁剪{floatr;intremainflag=1;if(p<0.0)//直线从该边界外部延伸到窗口内部{r=q/p;*u1=(*u1>r)?*u1:r;}elseif(p>0.0)//直线从该边界内部延伸到窗口外部{r=q/p;*u2=(*u2<r)?*u2:r;}else//p=0.0即直线与该边界平行if(q<0.0)//直线完全在窗口外remainflag=0;returnremainflag;}程序运行结果截图:总结:本次实验基本上完成了目标。在实验过程中,我加深了对计算机图形学和C++编程的理解,同时也学到了很多书上没有的东西,如:定义一个长方体,投影,旋转,裁剪等变换。在实验过程中,我们查阅了一些资料,并且参看了很多的程序,也感觉到了一个团队之间合作的重要性,最终实现了该程序。总的来说,这次实验我们学到了很多的东西。1.陈元琰,张睿哲,吴东编著.计算机图形学实用技术(第二版).北京:清华大学出版社,20072.龙熙华,张卫国,李立红编著.计算机图形学实验教程.西安:西北工业大学出版社,2011_1071227764.unknown_1386589901.unknown_1386590394.unknown_1386761611.unknown_1386589924.unknown_1386589807.unknown_1386589889.unknown_1071227846.unknown_1386589762.unknown_1071227664.unknown_1071227748.unknown_1071227629.unknown
本文档为【图形学三维线段的裁剪显示】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥12.0 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
xxj7584
暂无简介~
格式:doc
大小:99KB
软件:Word
页数:0
分类:
上传时间:2020-07-06
浏览量:18