实验三计算机图形学多边形填充算法汇总Word下载.docx

上传人:b****7 文档编号:22502492 上传时间:2023-02-04 格式:DOCX 页数:27 大小:56.80KB
下载 相关 举报
实验三计算机图形学多边形填充算法汇总Word下载.docx_第1页
第1页 / 共27页
实验三计算机图形学多边形填充算法汇总Word下载.docx_第2页
第2页 / 共27页
实验三计算机图形学多边形填充算法汇总Word下载.docx_第3页
第3页 / 共27页
实验三计算机图形学多边形填充算法汇总Word下载.docx_第4页
第4页 / 共27页
实验三计算机图形学多边形填充算法汇总Word下载.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

实验三计算机图形学多边形填充算法汇总Word下载.docx

《实验三计算机图形学多边形填充算法汇总Word下载.docx》由会员分享,可在线阅读,更多相关《实验三计算机图形学多边形填充算法汇总Word下载.docx(27页珍藏版)》请在冰豆网上搜索。

实验三计算机图形学多边形填充算法汇总Word下载.docx

#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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 交通运输

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1