public void AddEC(edgeClass ecs) //加一个edgeclass进来 //加入是否有顺序问题?排序之后就没有了 { foreach (poEdge pe in ecs.Edges) { this.edgs.Add(pe); } this.sortEC();//调用自家的排序 }
//扫描线填充核心代码 private Bitmap scanLineFillAlg(int op) { bm = new Bitmap(ClientSize.Width, ClientSize.Height); g7 = Graphics.FromImage(bm); List <Point> plst = poilst; if (poilst.Count <= 1) { return(bm);//没有或一个点时 } //由点(序列)生成边表 List <poEdge> cedges = new List <poEdge>(); int pcount = plst.Count; for (int i = 0; i < pcount; i++) { if (i == pcount - 1) { cedges.Add(new poEdge(plst[i], plst[0])); } else { cedges.Add(new poEdge(plst[i], plst[i + 1])); } } List <int> ymls = new List <int>(); foreach (poEdge pe in cedges) { int nymax = pe.ymax; if (!ymls.Contains(nymax)) { ymls.Add(nymax); } } ymls.Sort(); //构建了ET表 edgeTable etv = new edgeTable(cedges); int yminh = etv.getYmin(); int ymaxh = ymls[ymls.Count - 1]; //int ymaxh = getPoiYmax(plst); //List<poEdge> ael = new List<poEdge>(); edgeClass ael = new edgeClass(); //第三步 for (int yf = yminh; yf < ymaxh; yf++) { // if et[y]!=null: ael=et[y] if (etv.isCoutains(yf)) { ael.AddEC(etv.getECinY(yf)); }//3--1 第三步第1小步 if (ael.notNull()) { //两两配对,drawline int ect = ael.eCount(); List <double> wb = new List <double>();//排序一下 for (int k = 0; k < ect; k++) { wb.Add(ael.getEdgeX(k)); } wb.Sort(); //目前看来直接按照边配对需要较多的if语句,所以重新进行了排序 for (int j = 0; j < ect;) //画线, { float x1 = Convert.ToSingle(wb[j]); float x2 = Convert.ToSingle(wb[j + 1]); PointF pt1 = new PointF(x1, yf); PointF pt2 = new PointF(x2, yf); g7.DrawLine(scPen, pt1, pt2); j += 2; } if (ymls.Contains(yf + 1)) { ael.delEdgeYm(yf); //删除ymax==y+1的点 } ael.addEachX(); //x=x+dx }//3--2 } return(bm); }