图形图像实验二 直线段的绘制_第1页
图形图像实验二 直线段的绘制_第2页
图形图像实验二 直线段的绘制_第3页
图形图像实验二 直线段的绘制_第4页
图形图像实验二 直线段的绘制_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

实验二直线段的绘制1.实验目的通过直线段的绘制,进一步理解Bresenham直线绘制算法以及Windows环境下交互式绘图的基本过程。2.实验内容通过鼠标交互的方式绘制直线段,绘制的过程可以参照Window中自带的“画图”软件。线段的绘制不能调用系统的绘制线段的函数,必须自己实现Bresenham线段光栅化算法,求得线段的所有离散点,并使用SetPixel函数绘制出每个离散点。3、实验过程Bresenham线段绘制算法流程以斜率小于1的情况为例,Bresenham线段绘制算法的基本流程为:画点,,,计算初始误差值;求直线的下一点位置:,若,则;否则,画点;计算下一个误差:若,则;否则,;若,则结束操作,否则转步骤(2)。通用情况下的伪代码描述为://通用Bresenham算法://(x1,y1)(x2,y2),整数点//Sign(x)=1,0,-1当x>0,=0,<0//变量初始化x=x1;y=y1;dx=abs(x2-x1);dy=abs(y2-y1);s1=Sign(x2-x1);s2=Sign(y2-y1);//根据直线斜率的符号,交互dx和dyifdy>dxthenTemp=dx;dx=dy;dy=Temp;Interchange=1;elseInterchange=0;endif//误差补偿e=2*dy-dx;//主循环fori=1todx setpixel(x,y); if(e>0) if(Interchange==1)then x=x+s1; else y=y+s2; endif e=e-2*dx; endif if(Interchange==1)then y=y+s2; else x=x+s1; endif e=e+2dy; nexti;Finish4.2鼠标交互MFC中鼠标的交互通过消息响应实现。若鼠标左键按下时确定线段的起点,鼠标移动时实时预览当前的线段,坐标左键弹起时确定线段的终点,则分别需要响应WM_LBUTTONDOWN、WM_MOUSEMOVE、WM_LBUTTONUP三个消息。消息响应的添加方式如REF_Ref354925992\h图1所示。为了保存绘制的多条线段,定义线段的类CLine(类的定义自己实现),并将线段保存在数组当中:std::vector<Cline*>m_vecLines;3.选择对应的消息,并添加消息响应函数1.右击view类,选择“Properties”2.在属性页中选择“3.选择对应的消息,并添加消息响应函数1.右击view类,选择“Properties”2.在属性页中选择“Message”图SEQ图\*ARABIC1消息响应的添加方式(1)鼠标左键按下时,记录线段的起点位置voidCDrawLineView::OnLButtonDown(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefault m_pTempLine=newCLine(point,point); CView::OnLButtonDown(nFlags,point);}(2)鼠标移动时,预览当前线段voidCDrawLineView::OnMouseMove(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefault if(nFlags&MK_LBUTTON) { m_pTempLine->SetEndPoint(point); Invalidate(TRUE); } CView::OnMouseMove(nFlags,point);}(3)鼠标左键弹起时,确定线段的终点,保存该线段voidCDrawLineView::OnLButtonUp(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefault if(m_pTempLine) { m_vecLines.push_back(m_pTempLine); m_pTempLine=NULL; } CView::OnLButtonUp(nFlags,point);}4.3双缓冲的绘制为了实时预览当前绘制的线段,在鼠标移动时需频繁刷新屏幕,这容易产生闪烁的现象。产生闪烁的主要原因是:通常的绘制模式为单缓冲区机制,该机制下显示内容的计算和绘制针对同一缓冲区,若计算尚未完成又需进行屏幕的刷新,则容易出现闪烁的现象。解决这一现象的主要方法为双缓冲机制,如REF_Ref354929012\h图2所示,该机制采用两个帧缓冲区,一个帧缓冲区用于显示内容的计算与更新,另一个帧缓冲区用于显示内容的显示,当显示内容计算完成以后,两个帧缓冲区互换。图SEQ图\*ARABIC2双缓冲区机制MFC中利用双缓冲机制进行绘制的基本过程如下:(1)创建兼容内存DC以及兼容位图,创建的DC以及位图相当于提供一个额外的帧缓冲区;//创建兼容内存DC CDCmemDC; memDC.CreateCompatibleDC(pDC); CRectrectClient; GetClientRect(&rectClient); //创建兼容位图 CBitmapbmp;bmp.CreateCompatibleBitmap(pDC,rectClient.Width(),rectClient.Height());(2)将兼容位图放入兼容内存DC; //将兼容位图放入兼容DC,并清除背景 memDC.SelectObject(bmp); memDC.FillSolidRect(rectClient,pDC->GetBkColor());(3)利用该兼容内存DC进行绘制; if(m_pTempLine) DrawLine(&memDC,*m_pTempLine); for(size_ti=0;i<m_vecLines.size();++i) { DrawLine(&memDC,*m_vecLines[i]); }(4)绘制结束后,利用BitBlt()函数将兼容内存DC中的内容拷贝到前台。pDC->BitBlt(0,0,rectClient.Width(),rectClient.Height(),&memDC,0,0,SRCCOPY);除此之外,由于我们在绘制

温馨提示

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

评论

0/150

提交评论