实验三计算机图形学多边形填充算法汇总Word文档下载推荐.docx
- 文档编号:916476
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:29
- 大小:94.58KB
实验三计算机图形学多边形填充算法汇总Word文档下载推荐.docx
《实验三计算机图形学多边形填充算法汇总Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验三计算机图形学多边形填充算法汇总Word文档下载推荐.docx(29页珍藏版)》请在冰点文库上搜索。
OnDrawPic)
END_MESSAGE_MAP()
//CChildView消息处理程序
BOOLCChildView:
PreCreateWindow(CREATESTRUCT&
cs)
if(!
CWnd:
PreCreateWindow(cs))
returnFALSE;
cs.dwExStyle|=WS_EX_CLIENTEDGE;
cs.style&
=~WS_BORDER;
cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
:
LoadCursor(NULL,IDC_ARROW),reinterpret_cast<
HBRUSH>
(COLOR_WINDOW+1),NULL);
TRUE;
return
CChildView:
OnPaint()void{
);
this//用于绘制的设备上下文CPaintDCdc(//TODO:
在此处添加消息处理程序代码DrawGraph();
OnPaint()不要为绘制消息而调用//
点表//CChildView:
ReadPoint()void
P[0].x=50;
P[0].y=100;
P[1].x=-150;
P[1].y=300;
P[2].x=-250;
P[2].y=50;
P[3].x=-150;
P[3].y=-250;
P[4].x=0;
P[4].y=-50;
P[5].x=100;
P[5].y=-250;
P[6].x=300;
P[6].y=150;
绘制多边形边界//CChildView:
DrawPolygon(CDC*pDC)void
CLine;
newCLine*line=
CP2t;
//绘制多边形for(inti=0;
i<
7;
i++)
if(i==0)
line->
MoveTo(pDC,P[i]);
t=P[i];
else
line->
LineTo(pDC,P[i]);
}
//闭合多边形line->
LineTo(pDC,t);
deleteline;
voidCChildView:
DrawGraph()//绘制图形
CRectrect;
//定义客户区
GetClientRect(&
rect);
//获得客户区的大小
CDC*pDC=GetDC();
//定义设备上下文指针
pDC->
SetMapMode(MM_ANISOTROPIC);
//自定义坐标系
//设置窗口比例pDC->
SetWindowExt(rect.Width(),rect.Height());
SetViewportExt(rect.Width(),-rect.Height());
轴水平向右,xy轴//设置视区比例,且垂直向上
SetViewportOrg(rect.Width()/2,rect.Height()/2);
//设置客户区中心为坐标系原点
rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);
矩形与客户区重合//
if(!
bFill)
DrawPolygon(pDC);
//绘制多边形
else
FillPolygon(pDC);
填充多边形//ReleaseDC(pDC);
释放DC
//}
FillPolygon(CDC*pDC)//填充多边形
for(inti=0;
i++)转储顶点坐标,//y坐标取为整数{
P1[i].x=P[i].x;
P1[i].y=Round(P[i].y);
P1[i].c=CRGB(bRed/255.0,bGreen/255.0,bBlue/255.0);
//CFill*fill=newCFill;
动态分配内存
//fill->
SetPoint(P1,7);
初始化Fill对象
建立桶表//fill->
CreateBucket();
fill->
CreateEdge();
//建立边表
Gouraud(pDC);
//填充多边形
//撤销内存deletefill;
intCChildView:
OnCreate(LPCREATESTRUCTlpCreateStruct)
if(CWnd:
OnCreate(lpCreateStruct)==-1)
return-1;
//TODO:
在此添加您专用的创建代码
bFill=FALSE;
ReadPoint();
0;
OnDrawPic()void{
在此添加命令处理程序代码//TODO:
COLORREFGetClr=RGB(0,0,0);
//调色板颜色CColorDialogccd(GetClr,CC_SOLIDCOLOR);
if(IDOK==ccd.DoModal())调用颜色对话框选取填充色//GetClr=ccd.GetColor();
;
return//bRed=GetRValue(GetClr);
获取红色分量
bGreen=GetGValue(GetClr);
//获取绿色分量
获取蓝色分量//bBlue=GetBValue(GetClr);
bFill=TRUE;
Invalidate();
2.使用MFC技术实现多边形边缘填充算法,参考界面效果如下:
//demoView.cpp:
CdemoView类的实现
#includestdafx.h
#includedemo.h
#includedemoDoc.h
#includedemoView.h
#include<
#defineRound(d)int(floor(d+0.5))//四舍五入宏定义
#ifdef_DEBUG
#definenewDEBUG_NEW
//CdemoView
IMPLEMENT_DYNCREATE(CdemoView,CView)
BEGIN_MESSAGE_MAP(CdemoView,CView)
//标准打印命令
ON_COMMAND(ID_,&
CView:
On)
CdemoView:
//CdemoView构造/析构
CdemoView()
//TODO:
在此处添加构造代码
~CdemoView()
BOOLCdemoView:
在此处通过修改
//CREATESTRUCTcs来修改窗口类或样式
CView:
PreCreateWindow(cs);
return}
//CdemoView绘制)CdemoView:
OnDraw(CDC*/*pDC*/void{
CdemoDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
(!
pDoc)if
//TODO:
在此处为本机数据添加绘制代码DrawGraph();
打印//CdemoView
CdemoView:
On()void{
);
thisAFXPrintPreview(}
OnPreparePrinting(CPrintInfo*pInfo)
默认准备//
DoPreparePrinting(pInfo);
return
)/*pInfo*//*pDC*/voidCdemoView:
OnBeginPrinting(CDC*,CPrintInfo*
添加额外的打印前进行的初始化过程//TODO:
)CdemoView:
OnEndPrinting(CDC*void/*pDC*/,CPrintInfo*/*pInfo*/{
添加打印后进行的清理过程//TODO:
OnRButtonUp(UINTnFlags,CPointpoint)void{
ClientToScreen(&
point);
point);
thisOnContextMenu(}
voidCdemoView:
OnContextMenu(CWnd*pWnd,CPointpoint)
TRUE);
thistheApp.GetContextMenuManager()->
ShowPopupMenu(IDR_POPUP_EDIT,point.x,point.y,
点表voidCdemoView:
ReadPoint()//
P[4].y=-50;
DrawPolygon(CDC*pDC)void{
计算多边形边界//(forinti=0;
(P[i].x>
MaxX)if
MaxX=P[i].x;
(P[i].x<
MinX)ifMinX=P[i].x;
(P[i].y>
MaxY)ifMaxY=P[i].y;
(P[i].y<
MinY)
if
MinY=P[i].y;
newCLine*line=
CP2t;
绘制多边形//intfor(i=0;
(i==0)if
line->
//闭合多边形//line->
MoveTo(pDC,CP2(MinX,MinY));
绘制包围盒line->
LineTo(pDC,CP2(MinX,MaxY));
LineTo(pDC,CP2(MaxX,MaxY));
LineTo(pDC,CP2(MaxX,MinY));
LineTo(pDC,CP2(MinX,MinY));
FillPolygon(CDC*pDC)
COLORREFBClr=RGB(255,255,255);
//背景色
//填充色COLORREFFClr=GetClr;
//边的最小y值与最大y值intymin,ymax;
//x,y当前点,kdoublex,y,k;
斜率的倒数
循环多边形所有边//i=0;
i++)int(for
j=(i+1)%7;
int
/k//k=(P[i].x-P[j].x)/(P[i].y-P[j].y);
计算if(P[i].y<
P[j].y)的最大值与最小值y得到每条边//
ymin=Round(P[i].y);
ymax=Round(P[j].y);
x|ymin
得到//x=P[i].x;
ymin=Round(P[j].y);
ymax=Round(P[i].y);
x=P[j].x;
沿每一条边循环扫描线//(y=ymin;
y<
ymax;
y++)for
m=Round(x);
m<
MaxX;
m++)(forint对每一条扫描线与边的交点的右侧像素循环//{
if//如果是填充色(FClr==pDC->
GetPixel(m,Round(y)))
置为背景色pDC->
SetPixelV(m,Round(y),BClr);
//else
置为填充色//pDC->
SetPixelV(m,Round(y),FClr);
起点坐标x计算下一条扫描线的//x+=k;
绘制图形//CdemoView:
DrawGraph()void{
//CRectrect;
定义客户区
获得客户区的大小//GetClientRect(&
CDC*pDC=GetDC();
//设置窗口比例pDC->
轴x轴水平向右,y//设置视区比例,且垂直向上
//设置客户区中心为坐标系原点rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);
//矩形与客户区重合
DC
//释放
//CdemoView诊断
AssertValid()const
AssertValid();
constvoidCdemoView:
Dump(CDumpContext&
dc)
Dump(dc);
//const非调试版本是内联的CdemoDoc*CdemoView:
GetDocument()
ASSERT(m_pDocument->
IsKindOf(RUNTIME_CLASS(CdemoDoc)));
(CdemoDoc*)m_pDocument;
//_DEBUG
消息处理程序//CdemoView
OnInitialUpdate()void{
OnInitialUpdate();
///TODO:
在此添加专用代码和或调用基类bFill=FALSE;
GetClr=RGB(0,0,0);
MinX=MaxX=P[0].x;
MinY=MaxY=P[0].y;
在此添加命令处理程序代码CColorDialogccd(GetClr,CC_SOLIDCOLOR);
if(IDOK==ccd.DoModal())//调用颜色对话框选取填充色
GetClr=ccd.GetColor();
returnbFill=TRUE;
Invalidate(FALSE);
}3.使用MFC技术实现种子填充算法,参考界面效果如下:
ON_WM_LBUTTONDOWN()
SeedClr=RGB(255,0,0);
来修改窗口类或样式//CREATESTRUCTcs
return//TODO:
在此处为本机数据添加绘制代码DrawGraph();
//CdemoView打印CdemoView:
thisAFXPrintPreview(}
默认准备//
returnDoPreparePrinting(pInfo);
OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
添加额外的打印前进行的初始化过程
)/*pInfo*/voidCdemoView:
OnEndPrinting(CDC*/*pDC*/,CPrintInfo*
添加打印后进行的清理过程}
OnContextMenu(this}
OnContextMenu(CWnd*pWnd,CPointpoint)void{
TRUE);
thistheApp.GetCon
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 计算机 图形学 多边形 填充 算法 汇总
![提示](https://static.bingdoc.com/images/bang_tan.gif)