计算机图形学多边形裁剪与填充课程设计Word文档下载推荐.docx
- 文档编号:8288868
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:25
- 大小:167.64KB
计算机图形学多边形裁剪与填充课程设计Word文档下载推荐.docx
《计算机图形学多边形裁剪与填充课程设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《计算机图形学多边形裁剪与填充课程设计Word文档下载推荐.docx(25页珍藏版)》请在冰点文库上搜索。
确定多边形所占有的最大扫描线数,得到多边形顶点的最小和最大y值(ymin和ymax),从y=ymin到y=ymax,每次用一条扫描进行填充。
对一条扫描线填充的过程可分为四个步骤:
a.求交b.排序c.交点配对d.区间填色。
二、进度安排
第3周星期一8:
00——12:
00
星期二8:
00
星期三8:
星期四8:
星期五8:
第4周星期一8:
附:
课程设计报告装订顺序:
封面、任务书、目录、正文、附件(A4大小的图纸及程序清单)、评分。
正文的格式:
一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;
行距为22。
正文的内容:
一、课题的主要功能;
二、课题的功能模块的划分(要求画出模块图);
三、主要功能的实现(至少要有一个主要模块的流程图);
四、程序调试;
五、总结;
六、附件(所有程序的原代码,要求对程序写出必要的注释)。
正文总字数要求在5000字以上(不含程序原代码)。
一、题目内容说明:
1、交互式地实现多边形的裁剪和填充。
2、功能要求:
1)窗口功能设计。
2)实现鼠标画多边形与数据存储功能。
4)实现鼠标剪裁窗口选择功能。
5)实现多边形裁剪和填充功能。
二、总体设计:
本程序使用MFC实现多边形的裁剪和填充绘图程序。
基本思想是一次用窗口的一条边裁剪多边形,窗口的一条边以及延长线构成裁剪线,改线把平面分成两个部分:
用一条裁剪边多多边形进行裁剪,得到一个顶点序列,作为吓一条裁剪边处理过程的输入点。
仅用一条裁剪边时,逐次多边形裁剪框图:
在CGraphics类的CutRectangular(CRect)函数中实现对多边形的裁剪
在CGraphics类中的FillPlogon函数中实现多边形的填充算法。
三、模块设计:
各个程序函数的功能,参数,变量的说明:
MFC应用程序框架中类的详细解析:
1.MainFrm:
创建窗口及窗口里的菜单、工具栏、状态栏等实现交互的按钮。
1)函数intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct){}创建菜单、工具栏、状栏。
2)BOOLCMainFrame:
PreCreateWindow(CREATESTRUCT&
cs)设置窗口的大小和初始位置。
2.图像裁剪View:
视图,负责内存数据与用户的交互,包括数据的显示、菜单的选取,鼠标的响应。
1.voidCMyView:
OnLButtonDown(UINTnFlags,CPointpoint){}对鼠标按下左键的响应,如果是自定义裁剪的区域操作就捕获鼠标按下的点,画裁剪区域,如果是自定义点坐标的操作就捕获鼠标的点画多边形。
2.voidCMyView:
OnMouseMove(UINTnFlags,CPointpoint){}对鼠标移动的响应。
用捕获的点画出相应的矩形裁剪边框。
画边框的时候,先用白色擦出原先的矩形边框,再用虚线画出新的举行边框
3.voidCMyView:
OnRButtonUp(UINTnFlags,CPointpoint){}对鼠标放开左键的相应。
如果是自定义点的坐标,就获取新的初始裁减矩形范围。
4.voidCMyView:
OnLButtonUp(UINTnFlags,CPointpoint){}对鼠标放开左键的响应
5.voidCMyView:
OnInitialUpdate(){}初始化裁剪区域和在窗口中画一个矩形和一个五角星。
6.voidCMyView:
OnDraw(CDC*pDC){}重画窗口,用voidCMyView:
OnInitialUpdate{}来启动它,通过消息映射表处理菜单、工具条、快捷键和其他用户消息。
定义裁剪矩形区域,并赋值。
当自定义多边形坐标时,在各个点坐标处画一个小圆,以显示点的位置。
画出多边形。
3.图像裁剪DOC:
文档,负责内存数据与磁盘的交互。
1、voidCMyDoc:
OnFillployon(){}
2、voidCMyDoc:
OnUpdateFillployon(CCmdUI*pCmdUI){}
3、voidCMyDoc:
OnCutRect(){}
4、voidCMyDoc:
OnUpdateCutRect(CCmdUI*pCmdUI){}
4.CGraphics:
实现多边形的填充和裁剪。
1、构造函数CGraphics():
PointCount(10),Point(NULL){}初始化五角星的顶点坐标。
2、析构函数~CGraphics(){}删除动态生成的Point指针。
3、boolDrawPloyon(CDC*);
在指定设备中画多边形。
4、boolFillPloyon(CDC*);
填充多边形。
5、boolInterCross(CPoint,CPoint,CPoint,CPoint,CPoint&
);
判断两条线段是否相交。
6、boolCutRect(CRect);
对多边形进行裁剪。
7、boolIsInSquareRgn(CRect,CPoint,int);
对多边形裁剪时,判断线段断点是否在可视一侧。
8、boolSortArray(int*,int);
冒泡排序。
四、详细设计:
1、创建窗口、菜单、工具栏、状栏的函数。
intCMainFrame:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CFrameWnd:
OnCreate(lpCreateStruct)==-1)
return-1;
if(!
m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP
|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||
!
m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("
Failedtocreatetoolbar\n"
//failtocreate
}
m_wndStatusBar.Create(this)||
m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
Failedtocreatestatusbar\n"
//TODO:
Deletethesethreelinesifyoudon'
twantthetoolbarto
//bedockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&
m_wndToolBar);
return0;
}
2、鼠标按下左键的响应函数
voidCMyView:
OnLButtonDown(UINTnFlags,CPointpoint)
//对鼠标按下左键的相应
CScrollView:
OnLButtonDown(nFlags,point);
if(m_bDefineRect)
{
//如果是自定义裁减的区域的操作
SetCapture();
//捕获鼠标
m_bCaptured=TRUE;
CDC*dc=GetDC();
CRectrect(TopLeft,BottomRight);
dc->
SelectStockObject(WHITE_PEN);
Rectangle(rect);
InvalidateRect(rect,false);
TopLeft=point;
:
SetCursor(:
LoadCursor(NULL,IDC_CROSS));
//设置鼠标样子为十字形的
if(m_bDefinePointV)
//如果是自定义点坐标的操作
PointArray.Add(point);
CRectellipseRect;
ellipseRect.top=point.y-5;
ellipseRect.bottom=point.y+5;
ellipseRect.left=point.x-5;
ellipseRect.right=point.x+5;
InvalidateRect(ellipseRect,true);
3、鼠标移动时的响应函数
OnMouseMove(UINTnFlags,CPointpoint)
CScrollView:
OnMouseMove(nFlags,point);
//对鼠标移动时的相应
if(m_bCaptured)
//画出相应的矩形裁减边框
//用白色擦除原先的矩形边框
BottomRight=point;
CRectnewrect(TopLeft,BottomRight);
CPenpen;
pen.CreatePen(PS_DOT,1,RGB(0,0,0));
SelectObject(pen);
Rectangle(newrect);
//用虚线画出新的矩形边框
OnLButtonUp(UINTnFlags,CPointpoint)
OnLButtonUp(nFlags,point);
//对鼠标放开左键的响应
ReleaseCapture();
m_bCaptured=false;
m_bDefineRect=false;
OnViewDefineRect()
//设置是否自定义裁减区域
m_bDefineRect=true;
OnEditDefinePoint()
//设置是否自定义点的坐标
m_bDefinePointV=true;
}
4、放开鼠标右键的响应
OnRButtonUp(UINTnFlags,CPointpoint)
////对鼠标放开右键的相应
OnRButtonUp(nFlags,point);
CMyDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
pDoc->
m_grahics.PointCount=PointArray.GetSize();
if(pDoc->
m_grahics.Point)
deletepDoc->
m_grahics.Point;
m_grahics.Point=newCPoint[pDoc->
m_grahics.PointCount];
for(inti=0;
i<
pDoc->
m_grahics.PointCount;
i++)
pDoc->
m_grahics.Point[i]=PointArray.GetAt(i);
//对Point点坐标重新赋值
PointArray.RemoveAll();
m_bDefinePointV=false;
CRectrect;
this->
GetClientRect(rect);
InvalidateRect(rect);
//获取新的初始裁减矩形范围
intminX=pDoc->
m_grahics.Point[0].x,minY=pDoc->
m_grahics.Point[0].y;
intmaxX=pDoc->
m_grahics.Point[0].x,maxY=pDoc->
for(i=1;
{
if(minX>
pDoc->
m_grahics.Point[i].x)
minX=pDoc->
m_grahics.Point[i].x;
if(minY>
m_grahics.Point[i].y)
minY=pDoc->
m_grahics.Point[i].y;
if(maxX<
maxX=pDoc->
if(maxY<
maxY=pDoc->
}
TopLeft=CPoint(minX,minY);
BottomRight=CPoint(maxX,maxY);
5、初始化函数
OnInitialUpdate()
OnInitialUpdate();
CSizesizeTotal;
sizeTotal.cx=sizeTotal.cy=100;
SetScrollSizes(MM_TEXT,sizeTotal);
CMyDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//设置初始的裁减区域
intminX=pDoc->
intmaxX=pDoc->
for(inti=1;
if(minX>
minX=pDoc->
if(minY>
minY=pDoc->
if(maxX<
maxX=pDoc->
if(maxY<
maxY=pDoc->
TopLeft=CPoint(minX,minY);
BottomRight=CPoint(maxX,maxY);
6、重画窗口的函数,是MFC自动生成的,我们可以在里面添加自己的代码,用来实现消息映射表处理菜单、工具条、快捷键和其他用户消息。
OnDraw(CDC*pDC)
adddrawcodefornativedatahere
intleft,top,right,buttom;
left=min(TopLeft.x,BottomRight.x);
right=max(TopLeft.x,BottomRight.x);
top=min(TopLeft.y,BottomRight.y);
buttom=max(TopLeft.y,BottomRight.y);
CRectrect(left,top,right,buttom);
//定义裁减矩形区域,并赋值
CPenpenDot,penSolid;
penDot.CreatePen(PS_DOT,1,RGB(0,0,0));
pDC->
SelectObject(penDot);
//用虚线画出裁减矩形区域
penSolid.CreatePen(PS_SOLID,1,RGB(0,0,0));
SelectObject(penSolid);
if(PointArray.GetSize())
//当自定义多边形点坐标时,在各个点坐标处画一个小圆,以显示点的位置
inti;
for(i=0;
PointArray.GetSize();
pDC->
MoveTo(PointArray.GetAt(i));
CRectellipseRect;
ellipseRect.top=PointArray.GetAt(i).y-5;
ellipseRect.bottom=PointArray.GetAt(i).y+5;
ellipseRect.left=PointArray.GetAt(i).x-5;
ellipseRect.right=PointArray.GetAt(i).x+5;
Ellipse(ellipseRect);
if(pDoc->
bCutRect)
//判断是否裁减,若是,则根据裁减区域进行裁减
m_grahics.CutRect(rect);
bCutRect=false;
m_grahics.DrawPloyon(pDC);
//画出多边形
bFillPloyon)
//判断是否填充,根据需要进行相应的操作
m_grahics.FillPloyon(pDC);
bFillPloyon=false;
7、在指定的pDC设备中,画多边形
boolCGraphics:
DrawPloyon(CDC*pDC)
if(PointCount<
3)
returnfalse;
//若多边形小于三个点则返回
MoveTo(Point[0]);
PointCount;
pDC->
LineTo(Point[i]);
LineTo(Point[0]);
//在pDC中画出多边形
returntrue;
8、填充多边形函数,重量级的函数
//在指定的pDC设备中,填充多边形
FillPloyon(CDC*pDC)
intminX=Point[0].x,minY=Point[0].y;
intmaxX=Point[0].x,maxY=Point[0].y;
Point[i].x)
minX=Point[i].x;
Point[i].y)
minY=Point[i].y;
maxX=Point[i].x;
maxY=Point[i].y;
//获取多边形中所有坐标点的最大值和最小值,作为扫描线循环的范围
CUIntArraymyArray;
intx,y;
for(y=minY;
y<
maxY;
y++)
//扫描线从minY开始到maxY
//对每条边进行循环
CPointPointCross;
intbeforeI=BeforeIndex(i)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 多边形 裁剪 填充 课程设计