Example #1
0
 public void AddEC(edgeClass ecs)  //加一个edgeclass进来
 //加入是否有顺序问题?排序之后就没有了
 {
     foreach (poEdge pe in ecs.Edges)
     {
         this.edgs.Add(pe);
     }
     this.sortEC();//调用自家的排序
 }
Example #2
0
        //扫描线填充核心代码
        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);
        }