图形学三维线段的裁剪显示.doc_第1页
图形学三维线段的裁剪显示.doc_第2页
图形学三维线段的裁剪显示.doc_第3页
图形学三维线段的裁剪显示.doc_第4页
图形学三维线段的裁剪显示.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

三维线段的裁剪及显示专 业:信计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对应于左、右、下、上边界)若,则线段完全在边界外;若,则线段平行于该裁剪边界并且在窗口内;当,线段从裁剪边界延长线的外部延伸到内部;当,线段从裁剪边界的内部延伸到外部;算法步骤 定义结构和变量 定义三维齐次坐标结构和面结构;定义长方体表面模型,顶点表为顶点结构数组pts8,面表为面结构数组faces6;定义待裁剪线段的两个端点p1,p2和裁剪后线段的两个端点p3,p4。 变量初始化 在视图类构造函数中给顶点表赋值;给面表赋值(注意顶点序列顺序);给待裁剪线段端点赋值;给待裁剪线段端点赋原点值进行初始化。 在视图类中添加计算端点编码的函数;添加三维线段裁决的函数。定义线段裁剪时用到的六条边界,各边界的取值为长方体相应的值。 分别对长方体、待裁剪线段、裁剪后线段进行绕X轴旋转,再绕Y轴旋转。 分别对长方体、待裁剪线段、裁剪后线段进行以XOY平面为投影平面的平行投影变换。 分别对长方体、待裁剪线段、裁剪后线段进行窗口视区变换,注意窗口的选区。 显示变换后长方体,用实线绘制待裁剪线段,定义画笔,用虚线绘制裁剪后线段。 程序核心代码:视图类头文件/ Draw3DView.h : interface of the CDraw3DView class/#if !defined(AFX_DRAW3DVIEW_H_49195EF8_8785_46EA_89D5_35CD8D2F85C7_INCLUDED_)#define AFX_DRAW3DVIEW_H_49195EF8_8785_46EA_89D5_35CD8D2F85C7_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#define PI 3.1415926/定义三维齐次坐标结构typedef struct tagHOMOCOORDfloat x;float y;float z;float w;HOMOCOORD;/定义边的结构typedef struct tagLINEint p1,p2;LINE;/定义面的结构typedef struct tagPLANEint v0, v1, v2, v3;bool isvisible;PLANE;/定义点的结构,需要浮点数的x,ytypedef struct tagMYPOINTfloat x,y;MYPOINT;class CDraw3DView : public CViewprotected: / create from serialization onlyCDraw3DView();DECLARE_DYNCREATE(CDraw3DView)/ Attributespublic:CDraw3DDoc* GetDocument();/ Operationspublic:/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CDraw3DView)public:virtual void OnDraw(CDC* pDC); / overridden to draw this viewvirtual BOOL PreCreateWindow(CREATESTRUCT& cs);protected:virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);/AFX_VIRTUAL/ Implementationpublic:int CT(float p,float q,float *u1,float *u2);void LB(HOMOCOORD p1,HOMOCOORD p2,int xl,int xr,int yb,int yt,int zf,int zb);HOMOCOORD GetN(HOMOCOORD p1,HOMOCOORD p2,HOMOCOORD p3);void RotateY(int angle);void RotateX(int angle);void DrawMy3DGraphics();virtual CDraw3DView();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected:HOMOCOORD *pts,*p,*pp;MYPOINT *pts2D,*p2D,*pp2D;PLANE *faces;int ptn,fn;/ Generated message map functionsprotected:/AFX_MSG(CDraw3DView)/ NOTE - the ClassWizard will add and remove member functions here./ DO NOT EDIT what you see in these blocks of generated code !/AFX_MSGDECLARE_MESSAGE_MAP();#ifndef _DEBUG / debug version in Draw3DView.cppinline CDraw3DDoc* CDraw3DView:GetDocument() return (CDraw3DDoc*)m_pDocument; #endif/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations immediately before the previous line.#endif / !defined(AFX_DRAW3DVIEW_H_49195EF8_8785_46EA_89D5_35CD8D2F85C7_INCLUDED_)视图类源文件/ Draw3DView.cpp : implementation of the CDraw3DView class/#include stdafx.h#include Draw3D.h#includemath.h#include Draw3DDoc.h#include Draw3DView.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CDraw3DViewIMPLEMENT_DYNCREATE(CDraw3DView, CView)BEGIN_MESSAGE_MAP(CDraw3DView, CView)/AFX_MSG_MAP(CDraw3DView)/ NOTE - the ClassWizard will add and remove mapping macros here./ DO NOT EDIT what you see in these blocks of generated code!/AFX_MSG_MAP/ Standard printing commandsON_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()/ CDraw3DView construction/destructionCDraw3DView:CDraw3DView()/ TODO: add construction code hereCDraw3DView:CDraw3DView()BOOL CDraw3DView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs);/ CDraw3DView drawingvoid CDraw3DView:OnDraw(CDC* pDC)CDraw3DDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereDrawMy3DGraphics();/ CDraw3DView printingBOOL CDraw3DView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CDraw3DView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add extra initialization before printingvoid CDraw3DView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add cleanup after printing/ CDraw3DView diagnostics#ifdef _DEBUGvoid CDraw3DView:AssertValid() constCView:AssertValid();void CDraw3DView:Dump(CDumpContext& dc) constCView:Dump(dc);CDraw3DDoc* CDraw3DView:GetDocument() / non-debug version is inlineASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CDraw3DDoc);return (CDraw3DDoc*)m_pDocument;#endif /_DEBUG/ CDraw3DView message handlersvoid CDraw3DView:DrawMy3DGraphics()p=new HOMOCOORD4;p0.x=2; p0.y=-3; p0.z=2; p0.w=1;p1.x=-2; p1.y=3; p1.z=-2; p1.w=1;p2.x=2; p2.y=-3; p2.z=2; p2.w=1;p3.x=-2; p3.y=3; p3.z=-2; p3.w=1;/形体定义ptn=8;pts=new HOMOCOORDptn;/设置长方体pts0.x=1; pts0.y=2; pts0.z=1; pts0.w=1;pts1.x=-1; pts1.y=2; pts1.z=1; pts1.w=1;pts2.x=-1; pts2.y=-2; pts2.z=1; pts2.w=1;pts3.x=1; pts3.y=-2; pts3.z=1; pts3.w=1;pts4.x=1; pts4.y=2; pts4.z=-1; pts4.w=1;pts5.x=-1; pts5.y=2; pts5.z=-1; pts5.w=1;pts6.x=-1; pts6.y=-2; pts6.z=-1; pts6.w=1;pts7.x=1; pts7.y=-2; pts7.z=-1; pts7.w=1;/给定义面的指针分配内存;fn=6;faces=new PLANEfn;/设置立方体各面faces0.v0=0; faces0.v1=1; faces0.v2=2; faces0.v3=3; faces0.isvisible =false;faces1.v0=4; faces1.v1=5; faces1.v2=1; faces1.v3=0; faces1.isvisible =false;faces2.v0=5; faces2.v1=6; faces2.v2=2; faces2.v3=1; faces2.isvisible =false;faces3.v0=6; faces3.v1=7; faces3.v2=3; faces3.v3=2; faces3.isvisible =false;faces4.v0=7; faces4.v1=4; faces4.v2=0; faces4.v3=3; faces4.isvisible =false;faces5.v0=7; faces5.v1=6; faces5.v2=5; faces5.v3=4; faces5.isvisible =false;pts2D=new MYPOINTptn;p2D=new MYPOINT2;int i;LB(p0,p1,-1,1,-2,2,1,-1); RotateX(20); RotateY(30);HOMOCOORD view; /视线方向view.x=0; view.y=0; view.z=1;view.w=1;for(i=0;i0)facesi.isvisible=true;/平行投影变换for(i=0;iptn;i+)pts2Di.x=ptsi.x;pts2Di.y=ptsi.y;for(i=0;i4;i+)p2Di.x=pi.x;p2Di.y=pi.y;/窗口-视区变换实现过程float wxl=-3,wxr=3,wyb=-3,wyt=3;int vxl=0,vxr=500,vyb=0,vyt=400;float sx=(vxr-vxl)/(wxr-wxl),sy=(vyt-vyb)/(wyt-wyb),dx=vxl-sx*wxl,dy=vyb-sy*wyb;for(i=0;iptn;i+)pts2Di.x=sx*pts2Di.x+dx;pts2Di.y=sy*pts2Di.y+dy;for(i=0;i4;i+)p2Di.x=sx*p2Di.x+dx;p2Di.y=sy*p2Di.y+dy;/图形显示CClientDC dc(this);dc.MoveTo (p2D0.x,p2D0.y);/实线dc.LineTo (p2D1.x,p2D1.y);CPen *pOld,newpen(PS_DOT,1,RGB(0,0,0);pOld=dc.SelectObject(&newpen); dc.MoveTo (p2D2.x,p2D2.y);dc.LineTo (p2D3.x,p2D3.y);for( i=0;ifn;i+) /显示每个面上的各边 /设置画笔为虚线PLANE f=facesi;if(!f.isvisible ) /如果该面为不可见面dc.MoveTo (pts2Df.v0 .x,pts2Df.v0.y);dc.LineTo (pts2Df.v1.x,pts2Df.v1.y);dc.LineTo (pts2Df.v2.x,pts2Df.v2.y);dc.LineTo (pts2Df.v3.x,pts2Df.v3.y);dc.LineTo (pts2Df.v0.x,pts2Df.v0.y);dc.SelectObject(pOld); /把画笔设置为原理的实线for( i=0;ifn;i+) /显示每个面上的各边PLANE f=facesi;if(f.isvisible ) /如果该面为不可见面dc.MoveTo (pts2Df.v0 .x,pts2Df.v0.y);dc.LineTo (pts2Df.v1.x,pts2Df.v1.y);dc.LineTo (pts2Df.v2.x,pts2Df.v2.y);dc.LineTo (pts2Df.v3.x,pts2Df.v3.y);dc.LineTo (pts2Df.v0.x,pts2Df.v0.y);void CDraw3DView:RotateX(int angle)float a=angle*PI/180;for(int i=0;iptn;i+)float x,y,z;y=ptsi.y;z=ptsi.z;x=ptsi.x;ptsi.y=y*cos(a)-z*sin(a);ptsi.z=y*sin(a)+z*cos(a);for(i=0;i4;i+)float x,y,z;y=pi.y;z=pi.z;x=pi.x;pi.y=y*cos(a)-z*sin(a);pi.z=y*sin(a)+z*cos(a);void CDraw3DView:RotateY(int angle)float b=angle*PI/180;for(int i=0;iptn;i+)float x,y,z;x=ptsi.x;z=ptsi.z;y=ptsi.y;ptsi.x=x*cos(b)-z*sin(b);ptsi.z=x*sin(b)+z*cos(b);for(i=0;i4;i+)float x,y,z;x=pi.x;z=pi.z;y=pi.y;pi.x=x*cos(b)-z*sin(b);pi.z=x*sin(b)+z*cos(b);HOMOCOORD CDraw3DView:GetN(HOMOCOORD p1, HOMOCOORD p2, HOMOCOORD p3) float x1=p2.x-p1.x, y1=p2.y-p1.y,z1=p2.z-p1.z;float x2=p3.x-p2.x, y2=p3.y-p2.y, z2=p3.z-p2.z;HOMOCOORD N;N.x=y1*z2-y2*z1; N.y=-(x1*z2-x2*z1); N.z=x1*y2-x2*y1;return N;void CDraw3DView:LB(HOMOCOORD p1, HOMOCOORD p2, int xl, int xr, int yb

温馨提示

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

最新文档

评论

0/150

提交评论