基本图形处理技术-区域填充之多边形边缘填充
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.在OnDraw函数中添加以下代码: void CTestView::OnDraw(CDC* pDC) { CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here DrawPolygon();//绘制多边形 }
m=i,n=i+1;//对点的循环
if(7==n) n=0; k=(double(Point[m].x-Point[n].x))/(Point[m].y-Point[n].y); //计算1/k
if(Point[m].y<Point[n].y)//得到每条边的y最大和y最小值
{ ymin=Point[m].y; ymax=Point[n].y; x=Point[m].x;//得到x|ymin } else { ymin=Point[n].y; ymax=Point[m].y; x=Point[n].x; }
for(y=ymin;y<ymax;y++)//对每一条边循环 { for(int j=ROUND(x);j<MaxX;j++) //对每一条扫描线与边的交点的右侧像素循环 { if(dc.GetPixel(j,ROUND(y))==FillColor)//如果像素的颜色是填充色 { dc.SetPixel(j,ROUND(y),CBackColor);//改为背景色 } else { dc.SetPixel(j,ROUND(y),FillColor);//使用填充色填充 } } x+=k;//计算下一个x起点值 } } }
4.为构造函数添加以下代码: CTestView::CTestView() { // TODO: add construction code here FillColor=RGB(0,0,0); Point[0]=CPoint(550,400); Point[1]=CPoint(350,600); Point[2]=CPoint(250,350); Point[3]=CPoint(350,50); Point[4]=CPoint(500,250); Point[5]=CPoint(600,50); Point[6]=CPoint(800,450); }
void CTestView::Onfillcolor ()//菜单函数 { // TODO: Add your command handler code here RedrawWindow(); AfxGetMainWnd()->SetWindowText("多边形边缘填 充算法");//显示标题 GetMaxX();GetMaxY(); Draw(); }
void CTestView::GetMaxX()//求屏幕最大x值 { CRect rect; //定义矩形 GetClientRect(rect);//获得当前窗口大小,左上(0,0),右下是窗口结束位置 MaxX=rect.right; } void CTestView::GetMaxY()//求屏幕最大y值 { CRect rect; GetClientRect(rect); MaxY=rect.bottom; }
边缘填充算法
步骤
1.建立边缘填充工程
2.为视图类添加成员变量
protected: int MaxX,MaxY;//屏幕x和y的最大坐标 CPoint Point[7];//定义多边形顶点 COLORREF FillColor;//填充色
3.为视图类添加成员函数
public:
void GetMaxX();//获得屏幕的最大x值函数 void GetMaxY();//获得屏幕的最大y值函数 void DrawPolygon();//绘制多边形 void Draw();//填充函数
8.在文件适当位置添加代码
#define ROUND(a) int(a+0.5) //舍入
void CTestView::Draw()//填充多边形
{ COLORREF CBacBaidu NhomakorabeaColor=RGB(255,255,255);//白色 CClientDC dc(this);//当前的窗口指针 int m,n,ymin,ymax; double x,y,k;
for(int i=0;i<=6;i++)//对于多边形所有边循环 {
void CTestView::DrawPolygon()//绘制多边形函数 { CClientDC dc(this); int m,n; for(int j=0;j<=6;j++) { m=j,n=j+1; if(7==n) n=0; dc.MoveTo(Point[m]); dc.LineTo(Point[n]); } }
5.建立菜单项(调色板和填充)
ID ID_palette
名称 调色板
函数
ID_fillcolor
边缘填 充
6.添加菜单响应函数 void CTestView::Onpalette ()//选择填充色 { // TODO: Add your command handler code here CColorDialog ccd(FillColor); if(ccd.DoModal()==IDOK) { FillColor=ccd.GetColor(); } }