예제 #1
0
        public List <ETentry> getEgdeTable(List <Point4D> polygon)
        {
            List <ETentry> edgeTable = new List <ETentry>();
            Point4D        temp      = polygon.Last();

            foreach (var v in polygon)
            {
                ETentry et = new ETentry();
                et.ymin = (int)Math.Min(v.Y, temp.Y);
                et.ymax = (int)Math.Max(v.Y, temp.Y);
                if (v.Y < temp.Y)
                {
                    et.xmin = (float)v.X;
                }
                else
                {
                    et.xmin = (float)temp.X;
                }

                if (v.Y < temp.Y)
                {
                    et.zmin = (float)v.Z;
                }
                else
                {
                    et.zmin = (float)temp.Z;
                }
                float dy = (float)(v.Y - temp.Y);
                float dx = (float)(v.X - temp.X);
                float dz = (float)(v.Z - temp.Z);
                //if (dy == 0) et.oneoverm = 0;
                if (dy == 0)
                {
                    continue;
                }
                et.oneoverm = (float)dx / (float)dy;
                et.dzOVERdy = (float)dz / (float)dy;
                edgeTable.Add(et);

                temp = v;
            }

            edgeTable.Sort((p, q) => p.ymin.CompareTo(q.ymin));

            return(edgeTable);
        }
예제 #2
0
        public List <ETentry> getEgdeTable(List <Point> polygon)
        {
            List <ETentry> edgeTable = new List <ETentry>();
            Point          temp      = polygon.Last();

            foreach (var v in polygon)
            {
                ETentry et = new ETentry();
                et.ymin = Math.Min(v.Y, temp.Y);
                et.ymax = Math.Max(v.Y, temp.Y);
                //et.xmin = Math.Min(v.X, temp.X); //wspolrzedna x od ymin
                if (v.Y < temp.Y)
                {
                    et.xmin = v.X;
                }
                else
                {
                    et.xmin = temp.X;
                }
                int dy = (v.Y - temp.Y);
                int dx = (v.X - temp.X);
                //if (dy == 0) et.oneoverm = 1;
                //if (dx == 0) et.oneoverm = 0;
                if (dy == 0)
                {
                    et.oneoverm = 0;
                }
                //if( dx != 0 && dy != 0) et.oneoverm = (float) dy / (float) dx;
                if (dy != 0)
                {
                    et.oneoverm = (float)dx / (float)dy;
                }
                //et.b = v.Y - et.oneoverm * v.X;
                //et.next = null;
                edgeTable.Add(et);

                temp = v;
            }

            edgeTable.Sort((p, q) => p.ymin.CompareTo(q.ymin));

            return(edgeTable);
        }
예제 #3
0
        public void fillPolygon(List <Point> polygon, Color color)
        {
            List <ETentry> edgeTable       = getEgdeTable(polygon);
            ETentry        ETmin           = edgeTable[0];
            int            y               = ETmin.ymin;
            List <ETentry> activeEdgeTable = new List <ETentry>();
            SolidBrush     br              = new SolidBrush(color);

            while (edgeTable.Count != 0 || activeEdgeTable.Count != 0)
            {
                List <ETentry> toRemove = new List <ETentry>();
                foreach (var et in edgeTable)
                {
                    if (et.ymin == y)
                    {
                        activeEdgeTable.Add(et);
                        toRemove.Add(et);
                    }
                    else
                    {
                        break;
                    }
                }
                foreach (var et in toRemove)
                {
                    edgeTable.Remove(et);
                }
                toRemove.Clear();
                activeEdgeTable.Sort((p, q) => p.xmin.CompareTo(q.xmin));

                for (int n = 0; n < activeEdgeTable.Count; n += 2)
                {
                    //int border1 = (int)((y - activeEdgeTable[n].b) / (activeEdgeTable[n].oneoverm / 1));
                    //int border2 = (int)((y - activeEdgeTable[n + 1].b) / (activeEdgeTable[n + 1].oneoverm / 1));
                    //if(border1 > border2)
                    //{
                    //    int temp = border1;
                    //    border1 = border2;
                    //    border2 = temp;
                    //}
                    //for (int a = border1; a <= border2; a++)
                    for (int a = (int)activeEdgeTable[n].xmin; (int)a <= activeEdgeTable[n + 1].xmin; a++)
                    {
                        graphics.FillRectangle(br, a, y, 1, 1);
                    }
                }

                ++y;

                foreach (var e in activeEdgeTable.ToList())
                {
                    if (e.ymax == y)
                    {
                        activeEdgeTable.Remove(e);
                    }
                }

                foreach (var e in activeEdgeTable.ToList())
                {
                    e.xmin += e.oneoverm;
                }
            }
        }
예제 #4
0
        public Bitmap fillPolygon(List <Point4D> polygon, Color color, Bitmap bmp)
        {
            Bitmap         bmpt            = bmp;
            List <ETentry> edgeTable       = getEgdeTable(polygon);
            ETentry        ETmin           = edgeTable[0];
            int            y               = ETmin.ymin;
            List <ETentry> activeEdgeTable = new List <ETentry>();
            SolidBrush     br              = new SolidBrush(color);

            while (edgeTable.Count != 0 || activeEdgeTable.Count != 0)
            {
                List <ETentry> toRemove = new List <ETentry>();
                foreach (var et in edgeTable)
                {
                    if (et.ymin == y)
                    {
                        activeEdgeTable.Add(et);
                        toRemove.Add(et);
                    }
                    else
                    {
                        break;
                    }
                }
                foreach (var et in toRemove)
                {
                    edgeTable.Remove(et);
                }
                toRemove.Clear();
                activeEdgeTable.Sort((p, q) => p.xmin.CompareTo(q.xmin));

                for (int n = 0; n < activeEdgeTable.Count; n += 2)
                {
                    if (n + 1 < activeEdgeTable.Count)
                    {
                        float tempZ = activeEdgeTable[n].zmin;
                        float diff  = (activeEdgeTable[n + 1].zmin - activeEdgeTable[n].zmin) / (activeEdgeTable[n + 1].xmin - activeEdgeTable[n].xmin);
                        for (int a = (int)activeEdgeTable[n].xmin; a <= activeEdgeTable[n + 1].xmin; a++)
                        {
                            if (a < pictureBox1.Width && y < pictureBox1.Height && a >= 0 && y >= 0)
                            {
                                if (tempZ >= zBuffer[a, y])
                                {
                                    bmpt.SetPixel(a, y, color);
                                    zBuffer[a, y] = tempZ;
                                }
                            }
                            tempZ += diff;
                        }
                    }
                }

                ++y;

                foreach (var e in activeEdgeTable.ToList())
                {
                    if (e.ymax == y)
                    {
                        activeEdgeTable.Remove(e);
                    }
                }

                foreach (var e in activeEdgeTable.ToList())
                {
                    e.xmin += e.oneoverm; //dx/dy
                    e.zmin += e.dzOVERdy;
                }
            }
            return(bmpt);
        }