Exemplo n.º 1
0
        private SortedList <int, List <EdgeTableNode> > CreateEdgeTable(Polygon polygon, out int minY, out int maxY)
        {
            int           key;
            EdgeTableNode value;
            SortedList <int, List <EdgeTableNode> > edgeTable = new SortedList <int, List <EdgeTableNode> >();

            foreach (Edge edge in polygon.Edges)
            {
                if (edge.V1.Y > edge.V2.Y)
                {
                    key   = edge.V2.Y;
                    value = new EdgeTableNode(edge.V2.X, (edge.deltaX / (double)edge.deltaY), edge.V1.Y);
                }
                else
                {
                    key   = edge.V1.Y;
                    value = new EdgeTableNode(edge.V1.X, (edge.deltaX / (double)edge.deltaY), edge.V2.Y);
                }
                if (!edgeTable.ContainsKey(key))
                {
                    edgeTable[key] = new List <EdgeTableNode>();
                }
                edgeTable[key].Add(value);
            }

            minY = polygon.Edges.Min(edge => Math.Min(edge.V1.Y, edge.V2.Y));
            maxY = polygon.Edges.Max(edge => Math.Max(edge.V1.Y, edge.V2.Y));
            return(edgeTable);
        }
Exemplo n.º 2
0
        private void FillPolygon(Polygon polygon)
        {
            int minY, maxY;
            SortedList <int, List <EdgeTableNode> > edgeTable = CreateEdgeTable(polygon, out minY, out maxY);
            List <EdgeTableNode> activeEdgeTable = new List <EdgeTableNode>();

            for (int y = minY; y <= maxY; ++y)
            {
                EdgeTableNode startNode = null, endNode = null;
                foreach (EdgeTableNode node in activeEdgeTable)
                {
                    if (startNode == null)
                    {
                        startNode = node;
                    }
                    else
                    {
                        endNode = node;
                        Parallel.For(Math.Max(0, startNode.X), endNode.X + 1, x =>
                        {
                            if (0 <= y && y < directBitmap.Height)
                            {
                                directBitmap[x, y] = surfaceRenderer.RenderPixel(x, y);
                            }
                        });
                        startNode = endNode = null;
                    }
                }

                if (edgeTable.ContainsKey(y))
                {
                    activeEdgeTable.AddRange(edgeTable[y]);
                }
                activeEdgeTable.Sort((node1, node2) => node1.X - node2.X);

                activeEdgeTable.RemoveAll(node => node.MaxY == y);
                foreach (EdgeTableNode node in activeEdgeTable)
                {
                    node.Increment();
                }
            }
        }