Example #1
0
        public override void ScanLine(OpenGL gl)
        {
            ET = new List <List <AEL> >();
            /*Tạo Edge Table*/
            for (int y = ymin; y <= ymax; y++)
            {
                List <AEL> subList = new List <AEL>();
                ET.Add(subList);
            }

            for (int i = 0; i < Vertex.Count; i++)
            {
                int y = Vertex[i].Y;
                int x = Vertex[i].X;

                if (ET[y - ymin].Count == 0)
                {
                    AEL t = new AEL();
                    t.x = x;
                    ET[y - ymin].Add(t);
                    ET[y - ymin].Add(t);
                }
                else
                {
                    AEL t = new AEL();
                    t.x             = Math.Min(ET[y - ymin][0].x, x);
                    ET[y - ymin][0] = t;
                    t.x             = Math.Max(ET[y - ymin][1].x, x);
                    ET[y - ymin][1] = t;
                }
            }
            gl.Color(colorFilling.R / 255.0, colorFilling.G / 255.0, colorFilling.B / 255.0);
            gl.Begin(OpenGL.GL_LINES);
            for (int y = ymin; y <= ymax; y++)
            {
                if (ET[y - ymin].Count != 0)
                {
                    gl.Vertex(ET[y - ymin][0].x, y);
                    gl.Vertex(ET[y - ymin][1].x, y);
                }
            }
            gl.End();
            gl.Flush();
        }
Example #2
0
        virtual public void AddEdge(OpenGL gl)
        {
            /*Them cac canh*/
            Edge = new List <AEL>();
            AEL t;

            ymin = Vertex[0].Y;
            ymax = Vertex[0].Y;
            for (int i = 0; i < Vertex.Count - 1; i++)
            {
                t         = new AEL();
                t.y_upper = Math.Max(Vertex[i].Y, Vertex[i + 1].Y);
                t.y_lower = Math.Min(Vertex[i].Y, Vertex[i + 1].Y);
                t.x       = Vertex[i].Y > Vertex[i + 1].Y ? Vertex[i + 1].X : Vertex[i].X;
                if (t.y_lower == t.y_upper)
                {
                    t.slope = 0;
                }
                else
                {
                    t.slope = (Vertex[i].X - Vertex[i + 1].X) * 1.0 / (Vertex[i].Y - Vertex[i + 1].Y) * 1.0;
                }

                // Tinh chỉnh lại dữ liệu
                //TH1: Giảm:
                //TH2: Tăng

                if (i == 0)
                {
                    // Giảm
                    if (Vertex[i + 1].Y < Vertex[i].Y && Vertex[i].Y < Vertex[Vertex.Count - 1].Y)
                    {
                        t.y_upper--;
                    }
                    else //Tăng
                    if (Vertex[i + 2].Y > Vertex[i + 1].Y && Vertex[i + 1].Y > Vertex[i].Y)
                    {
                        t.y_upper--;
                    }
                }
                else
                {
                    //Giảm
                    if (Vertex[i + 1].Y < Vertex[i].Y && Vertex[i].Y < Vertex[i - 1].Y)
                    {
                        t.y_upper--;
                    }
                    else
                    if (i == Vertex.Count - 2)
                    {
                        if (Vertex[0].Y > Vertex[i + 1].Y && Vertex[i + 1].Y > Vertex[i].Y)
                        {
                            t.y_upper--;
                        }
                    }
                    else
                    if (Vertex[i + 2].Y > Vertex[i + 1].Y && Vertex[i + 1].Y > Vertex[i].Y)
                    {
                        t.y_upper--;
                    }
                }
                Edge.Add(t);
                ymin = Math.Min(ymin, Vertex[i + 1].Y);
                ymax = Math.Max(ymax, Vertex[i + 1].Y);
            }

            t         = new AEL();
            t.y_upper = Math.Max(Vertex[Vertex.Count - 1].Y, Vertex[0].Y);
            t.y_lower = Math.Min(Vertex[Vertex.Count - 1].Y, Vertex[0].Y);
            t.x       = Vertex[Vertex.Count - 1].Y > Vertex[0].Y ? Vertex[0].X : Vertex[Vertex.Count - 1].X;

            if (t.y_lower == t.y_upper)
            {
                t.slope = 0;
            }
            else
            {
                t.slope = (Vertex[Vertex.Count - 1].X - Vertex[0].X) * 1.0 / (Vertex[Vertex.Count - 1].Y - Vertex[0].Y) * 1.0;
            }
            //Giảm
            if (Vertex[0].Y < Vertex[Vertex.Count - 1].Y && Vertex[Vertex.Count - 1].Y < Vertex[Vertex.Count - 2].Y)
            {
                t.y_upper--;
            }

            else
            if (Vertex[Vertex.Count - 1].Y < Vertex[0].Y && Vertex[0].Y < Vertex[1].Y)
            {
                t.y_upper--;
            }
            Edge.Add(t);
        }
Example #3
0
        virtual public void ScanLine(OpenGL gl)
        {
            boundaryFill = false;
            scanLine     = true;
            ET           = new List <List <AEL> >();
            BegList      = new List <AEL>();
            /*Tạo Edge Table*/
            for (int y = ymin; y <= ymax; y++)
            {
                List <AEL> subList = new List <AEL>();
                ET.Add(subList);
            }

            for (int i = 0; i < Edge.Count; i++)
            {
                if (Edge[i].y_lower != Edge[i].y_upper)
                {
                    int y = Edge[i].y_lower;
                    ET[y - ymin].Add(Edge[i]);
                }
            }
            /**/
            for (int y = ymin; y <= ymax; y++)
            {
                for (int i = 0; i < ET[y - ymin].Count; i++)
                {
                    BegList.Add(ET[y - ymin][i]);
                }

                /*Sort*/
                BegList = BegList.OrderBy(o => o.x).ToList();
                /*Lấp*/
                gl.Color(colorFilling.R / 255.0, colorFilling.G / 255.0, colorFilling.B / 255.0);
                gl.Begin(OpenGL.GL_LINES);
                for (int i = 0; i < BegList.Count; i += 2)
                {
                    if (i + 1 < BegList.Count)
                    {
                        gl.Vertex(BegList[i].x, y);
                        gl.Vertex(BegList[i + 1].x, y);
                    }
                }
                gl.End();
                gl.Flush();
                /*Xóa*/
                int j = 0;
                while (j < BegList.Count)
                {
                    if (BegList[j].y_upper == y)
                    {
                        BegList.RemoveAt(j);
                    }
                    else
                    {
                        j++;
                    }
                }

                /*Update*/
                for (int i = 0; i < BegList.Count; i++)
                {
                    AEL t = new AEL();
                    t.slope    = BegList[i].slope;
                    t.y_lower  = BegList[i].y_lower;
                    t.y_upper  = BegList[i].y_upper;
                    t.x        = BegList[i].x + BegList[i].slope;
                    BegList[i] = t;
                }
            }