计算机图形学学习心得精编3篇

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

精编资料,供您参考计算机图形学学习心得精编3篇【前言导读】由三一刀客最美丽的网友为您分享整理的“计算机图形学学习心得精编3篇”文档资料,以供您学习参考,希望这篇文档对您有所帮助,喜欢就分享给朋友们呢!计算机图形学学习心得1一、实验目的了解梁友栋算法和编码裁剪算法并利用该算法思想实现某一图形或直线段的裁剪,加深对梁友栋算法和编码裁剪算法的理解。二、实验内容利用梁友栋算法(参数化线段裁剪算法)或编码裁剪算法变成实现对直线段或者任一图形的裁剪。三、实验原理梁友栋算法简介如下:设线段两端点坐标分别为P1(x1,y1)和P2(x2,y2),则其参数化直线方程可写成下列形式:0≤u≤1当u=0时,得点P1,当u=1时,得点P2。线段的裁剪条件可以由下面的不等式表示:Wxl≤x1﹢uΔx≤Wxr;Wyb≤y1﹢uΔy≤Wyt这四个不等式可以表示为:upk≤qkk=1,2,3,4其中,参数p,q定义为:p1﹦-Δx,q1﹦x1﹣Wxlp2﹦Δx,q2﹦Wxr﹣x1p3﹦-Δy,q3﹦y1﹣Wybp4﹦Δy,q4﹦Wyt﹣y1下标k=1,2,3,4分别对应裁剪窗口的左、右、下、上四条边界线。如果线段平行于裁剪窗口的某两边界,则必有相应的pk﹦0,如果还满足qk0时,直线是从裁剪窗口第k条边界线的内部延伸到外部。当pk不等于零时,可以计算出线段与第k条裁剪窗口边界线的交点参数:根据定义,对于每条线段,pk中必有两个小于零,而另两个大于零。对于小于零的pk,直线同第k条裁剪窗口边线是从外到内相遇的,此时如果线段同第k条裁剪窗口边界线有交点的话,是参数u从0变大时遇到的,这时计算出相应的rk值,取0和各个rk值之中的最大值记为u1。与此相反,对于大于零的pk,计算出相应的rk值,取1和各个rk值之中的最小值记为u2。两个参数u1和u2定义了在裁剪窗口内的线段部分。如果u1u2,则线段完全落在裁剪窗口之外,应被舍弃。否则被裁剪线段可见部分的端点由参数u1和u2计算出来。四、实验环境WindowsXPVisualC++五、实验步骤精编资料,供您参考进入VisualC++环境,在菜单中选择“FileàNewàProjects”,然后选择“MFCAppWizard(exe)”新建一个工程文件单击“OK”,在弹出的对话框中选择“Singledocument”,单击“Finish”,在VisualC++编程界面中选择CMyView单击右键,选择“AddMemberFunction”,在弹出的对话框中添写“void”和函数名。//图形裁减:implementationoftheCMyViewclass//#include#include图形裁减。h#include图形裁减#include图形裁减#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CMyViewIMPLEMENT_DYNCREATE(CMyView,CView)BEGIN_MESSAGE_MAP(CMyView,CView)//{{AFX_MSG_MAP(CMyView)//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///////////////////////////////////////////////////////////////////////////////CMyViewconstruction/destructionCMyView::CMyView{//TODO:addconstructioncodehere}CMyView::~CMyView精编资料,供您参考{}BOOLCMyView::PreCreateWindow(CREATESTRUCT&cs){//TODO:ModifytheWindowclassorstylesherebymodifying//theCREATESTRUCTcsreturnCView::PreCreateWindow(cs);}///////////////////////////////////////////////////////////////////////////////CMyViewdrawingvoidCMyView::OnDraw(CDC*pDC){CMyDoc*pDoc=GetDocument;ASSERT_VALID(pDoc);LINECLIP;//TODO:adddrawcodefornativedatahere}///////////////////////////////////////////////////////////////////////////////CMyViewprintingBOOLCMyView::OnPreparePrinting(CPrintInfo*pInfo){//defaultpreparationreturnDoPreparePrinting(pInfo);}voidCMyView::OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/){//TODO:addextrainitializationbeforeprinting}voidCMyView::OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/){//TODO:addcleanupafterprinting}///////////////////////////////////////////////////////////////////////////////CMyViewdiagnostics#ifdef_DEBUGvoidCMyView::AssertValidconst精编资料,供您参考{CView::AssertValid;}voidCMyView::Dump(CDumpContext&dc)const{CView::Dump(dc);}CMyDoc*CMyView::GetDocument//non-debugversionisinline{ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CMyDoc)));return(CMyDoc*)m_pDocument;}#endif//_DEBUG///////////////////////////////////////////////////////////////////////////////CMyViewmessagehandlersvoidCMyView::LINECLIP{//使用梁友栋-Basky直线裁剪算法CDC*pDC=GetDC;//取得绘图设备环境上下文指针//设置不同颜色画笔CPennewpen1(PS_SOLID,0,RGB(183,198,0));//窗口颜色CPennewpen2(PS_SOLID,0,RGB(0,0,1));//待裁剪线段颜色CPennewpen3(PS_SOLID,0,RGB(160,1,255));//裁剪后可见线段颜色//辅助变量floatp[4],q[4],u[4];floatu1,u2,r[4];intx1,y1,x2,y2,x0,y0,x3,y3;intdx,dy,k;intwxl=300,wxr=450,wyb=100,wyt=400;//绘制裁剪窗口pDC-SelectObject(&newpen1);pDC-Rectangle(wxl,wyt,wxr,wyb);x1=100;y1=200;x2=600;y2=400;//绘制被裁剪线段pDC-SelectObject(&newpen2);精编资料,供您参考pDC-MoveTo(x1,y1);pDC-LineTo(x2,y2);//计算dx=x2-x1;dy=y2-y1;p[0]=(float)-dx;p[1]=(float)dx;p[2]=(float)-dy;p[3]=(float)(dy);q[0]=(float)(x1-wxl);q[1]=(float)(wxr-x1);q[2]=(float)(y1-wyb);q[3]=(float)(wyt-y1);for(k=0;k{if((p[k]==0))//垂直或水平线段,由不为0的另外两个参数确定可见部分{u[k]=1000;}else{r[k]=q[k]/p[k];if(p[k]u[k]=(0r[k])?0:r[k];//取用0与r[k]中的大值elseu[k]=(r[k]}}//参数在0-1之间变化,超出为无效参数u1=;u2=;for(k=0;k{if(p[k]u1=(u[k]u1)?u[k]:u1;//取用0与u[k]中的大值elseu2=(u[k]}//满足条件为可见部分线段if(u1{//计算可见部分线段x0=(int)(x1+u1*dx);y0=(int)(y1+u1*dy);x3=(int)(x1+u2*dx);y3=(int)(y1+u2*dy);//绘制窗口内可见线段pDC-SelectObject(&newpen3);精编资料,供您参考pDC-MoveTo(x0,y0);pDC-LineTo(x3,y3);}}六、实验结果与分析本图中矩形内紫色线段为裁剪之后可见线段,外部的黑色线段部分为带裁剪部分。七、实验中遇到的问题及解决方法1.对于VisualC++的工程文件即:MFC的环境不熟悉,开始时编写视图View下的程序在步骤上尚有困难,不知道该怎样使用该环境,再参考了一些相关书籍和求教于其他人之后,这个问题得到了解决。2.最初只是在后面添加了自编程序,并没有在“OnDraw”里面加入该程序的调用,程序编译没有错误,但运行后只是一个窗口,并没有图像,后来在同学的帮助下发现了这个错误,改正后程序顺利运行。3.程序编写过程中的语法不再是问题,偶尔有疏忽的时候,编译时一般就能改正了。4.在程序编写时对于点的坐标值不是很注意,随意定义了一些点,造成直线画到了图形的外面。计算机图形学学习心得2计算机图形学是利用计算机研究图形的表示、生成、处理和显示的科学。简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。从处理技术上来看,图形主要分为两类,一类是基于线条信息表示的,如工程图、等高线地图、曲面的线框图等,另一类是明暗图,也就是通常所说的真实感图形。经过30多年的发展,计算机图形学已成为计算机科学中最为活跃的分支之一,并得到广泛的应用。在科技高度发展的今天,计算机在人们之中的作用越来越突出。而C语言作为一种计算机的语言,我们学习它,有助于我们更好的了解计算机,更好的学习计算机图形学。因此,C语言对我们计算机图形学的学习尤其重要,而我们也需要一定的C语言基础知识。在这个学期里,我们班级的学生在计算机图形学老师何老师的带领下进行了计算机图形学的上机实践学习。在这

1 / 20
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功