文档详情

区域填充算法运行代码.doc

发布:2017-03-20约7.58千字共6页下载文档
文本预览下载声明
/// summary /// 扫描线填充算法填充触发事件 /// /summary /// param name=sender/param /// param name=e/param private void scanLineFillingToolStripMenuItem_Click(object sender, EventArgs e) { slf.ScanLinePolygonFill(P,g,XiangSu); } private void label2_Click(object sender, EventArgs e) { } private void 四联通填充ToolStripMenuItem_Click(object sender, EventArgs e) { tempp.X = tempP[3].X + XiangSu;//选取第4个点内侧(随机猜测) tempp.Y = tempP[3].Y + XiangSu; checkBox.Enabled = false;//让绘制过程中不能改变选择 do_check();//也要检查一遍,不然会出现错误 FloodSeedFill(tempp); checkBox.Enabled = true;//恢复 } /// summary /// 初始化新边表 /// 算法通过遍历所有的顶点获得边的信息,然后根据与此边有关的前后两个顶点的情况 /// 确定此边的ymax是否需要-1修正。ps和pe分别是当前处理边的起点和终点,pss是起 /// 点的前一个相邻点,pee是终点的后一个相邻点,pss和pee用于辅助判断ps和pe两个 /// 点是否是左顶点或右顶点,然后根据判断结果对此边的ymax进行-1修正,算法实现非 /// 常简单,注意与扫描线平行的边是不处理的,因为水平边直接在HorizonEdgeFill() /// 函数中填充了。 /// /summary private void InitScanLineNewEdgeTable(ListEDGE[] NET, ListPoint Q, int ymin, int ymax) { Listint temp = new Listint(); EDGE e; for (int i = 0; i Q.Count; i++) { Point ps = Q[i]; Point pe = Q[(i + 1) % Q.Count]; Point pss = Q[(i - 1 + Q.Count) % Q.Count]; Point pee = Q[(i + 2) % Q.Count]; if (pe.Y != ps.Y)//不处理平行线 { e = new EDGE(); e.dx = (double)(pe.X - ps.X) / (double)(pe.Y - ps.Y) * XiangSu; if (pe.Y ps.Y) { e.xi = ps.X; if (pee.Y = pe.Y) e.ymax = pe.Y - XiangSu; else e.ymax = pe.Y; NET[ps.Y - ymin]
显示全部
相似文档