private void DrawPolygon(PolygonBase polygon, Graphics graphs) { if (polygon.Vertices.Count < 2) return; var path = new GraphicsPath(); if (polygon.IsClosedFigure) path.StartFigure(); path.AddLines(polygon.Vertices.ToPoints()); if (polygon.IsClosedFigure) path.CloseFigure(); using (var b = new SolidBrush(polygon.FillColor)) using (var p = new Pen(polygon.OutlineColor, polygon.OutlineWidth)) { p.DashStyle = polygon.OutlineDash; if (polygon.GetShapeType() != ShapeType.FreePencil) graphs.FillPath(b, path); //_filler.FillByScanline(graphs, polygon, polygon.FillColor); graphs.DrawPath(p, path); } }
public void ScanLineFillPolygon(Graphics graph, PolygonBase shape, Color color) { if (shape.Vertices.Count < 3) return; if (shape.GetShapeType() == ShapeType.FreePencil) return; var rec = new Rectangle(Point.Round(shape.Location), Size.Round(shape.Size)); if (rec.Location.Equals(Point.Empty)) return; rec.X -= 1; rec.Y -= 1; rec.Width += 2; rec.Height += 2; //var h = rec.Y + 1; var h = rec.Y + rec.Height; var et = new SortedDoublyLinkedList<CActiveEdge>[h]; var active = new SortedDoublyLinkedList<CActiveEdge>(); for (int i = 0; i < h; i++) et[i] = new SortedDoublyLinkedList<CActiveEdge>(); BuildEdgeList(shape.Vertices.ToList(), ref et); //for (int i = rec.Y - rec.Height; i < rec.Y; i++) for (int i = rec.Y; i < rec.Y + rec.Height; i++) { buildActiveList(ref active, ref et[i]); if (active.Count != 0) { using (var p = new Pen(color, 1F)) FillScan(i, ref active, graph, p); updateEdgeList(i, ref active); active.Sort(); } } }