实验三计算机图形学多边形填充算法汇总Word下载.docx
《实验三计算机图形学多边形填充算法汇总Word下载.docx》由会员分享,可在线阅读,更多相关《实验三计算机图形学多边形填充算法汇总Word下载.docx(27页珍藏版)》请在冰豆网上搜索。
#defineRound(d)int(floor(d+0.5))//四舍五入宏定义
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
//CChildView
CChildView:
:
CChildView()
{
}
~CChildView()
BEGIN_MESSAGE_MAP(CChildView,CWnd)
ON_WM_PAINT()
ON_WM_CREATE()
ON_COMMAND(ID_DRAW_PIC,&
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);
returnTRUE;
voidCChildView:
OnPaint()
CPaintDCdc(this);
//用于绘制的设备上下文
//TODO:
在此处添加消息处理程序代码
DrawGraph();
//不要为绘制消息而调用CWnd:
OnPaint()
ReadPoint()//点表
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;
DrawPolygon(CDC*pDC)//绘制多边形边界
CLine*line=newCLine;
CP2t;
for(inti=0;
i<
7;
i++)//绘制多边形
{
if(i==0)
{
line->
MoveTo(pDC,P[i]);
t=P[i];
}
else
LineTo(pDC,P[i]);
}
}
line->
LineTo(pDC,t);
//闭合多边形
deleteline;
DrawGraph()//绘制图形
CRectrect;
//定义客户区
GetClientRect(&
rect);
//获得客户区的大小
CDC*pDC=GetDC();
//定义设备上下文指针
pDC->
SetMapMode(MM_ANISOTROPIC);
//自定义坐标系
SetWindowExt(rect.Width(),rect.Height());
//设置窗口比例
SetViewportExt(rect.Width(),-rect.Height());
//设置视区比例,且x轴水平向右,y轴垂直向上
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)//填充多边形
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对象
CreateBucket();
//建立桶表
CreateEdge();
//建立边表
Gouraud(pDC);
//填充多边形
deletefill;
//撤销内存
intCChildView:
OnCreate(LPCREATESTRUCTlpCreateStruct)
if(CWnd:
OnCreate(lpCreateStruct)==-1)
return-1;
在此添加您专用的创建代码
bFill=FALSE;
ReadPoint();
return0;
OnDrawPic()
在此添加命令处理程序代码
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类的实现
demoDoc.h"
demoView.h"
//CdemoView
IMPLEMENT_DYNCREATE(CdemoView,CView)
BEGIN_MESSAGE_MAP(CdemoView,CView)
//标准打印命令
ON_COMMAND(ID_FILE_PRINT,&
CView:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,&
ON_COMMAND(ID_FILE_PRINT_PREVIEW,&
CdemoView:
OnFilePrintPreview)
//CdemoView构造/析构
CdemoView()
在此处添加构造代码
~CdemoView()
BOOLCdemoView:
cs)
在此处通过修改
//CREATESTRUCTcs来修改窗口类或样式
returnCView:
PreCreateWindow(cs);
//CdemoView绘制
voidCdemoView:
OnDraw(CDC*/*pDC*/)
CdemoDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
pDoc)
在此处为本机数据添加绘制代码
//CdemoView打印
OnFilePrintPreview()
AFXPrintPreview(this);
OnPreparePrinting(CPrintInfo*pInfo)
//默认准备
returnDoPreparePrinting(pInfo);
OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
添加额外的打印前进行的初始化过程
OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
添加打印后进行的清理过程
OnRButtonUp(UINTnFlags,CPointpoint)
ClientToScreen(&
point);
OnContextMenu(this,point);
OnContextMenu(CWnd*pWnd,CPointpoint)
theApp.GetContextMenuManager()->
ShowPopupMenu(IDR_POPUP_EDIT,point.x,point.y,this,TRUE);
ReadPoint()//点表
DrawPolygon(CDC*pDC)
i++)//计算多边形边界
if(P[i].x>
MaxX)
MaxX=P[i].x;
if(P[i].x<
MinX)
MinX=P[i].x;
if(P[i].y>
MaxY)
MaxY=P[i].y;
if(P[i].y<
MinY)
MinY=P[i].y;
i++)//绘制多边形
//闭合多边形
MoveTo(pDC,CP2(MinX,MinY));
//绘制包围盒
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;
//填充色
intymin,ymax;
//边的最小y值与最大y值
doublex,y,k;
//x,y当前点,k斜率的倒数
i++)//循环多边形所有边
intj=(i+1)%7;
k=(P[i].x-P[j].x)/(P[i].y-P[j].y);
//计算/k
P[j].y)//得到每条边y的最大值与最小值
ymin=Round(P[i].y);
ymax=Round(P[j].y);
x=P[i].x;
//得到x|ymin
ymin=Round(P[j].y);
ymax=Round(P[i].y);
x=P[j].x;
for(y=ymin;
y<
ymax;
y++)//沿每一条边循环扫描线
for(intm=Round(x);
m<
MaxX;
m++)//对每一条扫描线与边的交点的右侧像素循环
{
if(FClr==pDC->
GetPixel(m,Round(y)))//如果是填充色
pDC->
SetPixelV(m,Round(y),BClr);
//置为背景色
else
SetPixelV(m,Round(y),FClr);
//置为填充色
}
x+=k;
//计算下一条扫描线的x起点坐标
DrawGraph()//绘制图形
//定义客户区
//获得客户区的大小
//绘制多边形
//填充多边形
//释放DC
//CdemoView诊断
AssertValid()const
CView:
AssertValid();
Dump(CDumpContext&
dc)const
Dump(dc);
CdemoDoc*CdemoView:
GetDocument()const//非调试版本是内联的
ASSERT(m_pDocument->
IsKindOf(RUNTIME_CLASS(CdemoDoc)));
return(CdemoDoc*)m_pDocument;
#endif//_DEBUG
//CdemoView消息处理程序
OnInitialUpdate()
OnInitialUpdate();
在此添加专用代码和/或调用基类
GetClr=RGB(0,0,0);
MinX=MaxX=P[0].x;
MinY=MaxY=P[0].y;
if(IDOK==ccd.DoModal())//调用颜色对话框选取填充色
Invalidate(FALSE);
3.使用MFC技术实现种子填充算法,参考界面效果如下:
ON_WM_LBUTTONDOWN()
SeedClr=RGB(255,0,0);
OnContextMenu(CWnd*pWnd,CPoi