Control PathClip() { var control = new Drawable { Size = new Size(350, 250) }; control.Paint += (sender, e) => { var path = new GraphicsPath(); path.AddEllipse(25, 25, 50, 50); path.AddRectangle(125, 25, 50, 50); path.AddLines(new PointF(225, 25), new PointF(225, 75), new PointF(275, 50)); path.CloseFigure(); e.Graphics.SetClip(path); if (ResetClip) e.Graphics.ResetClip(); e.Graphics.FillRectangle(Brushes.Blue, path.Bounds); path.Transform(Matrix.FromTranslation(0, 75)); e.Graphics.SetClip(path); if (ResetClip) e.Graphics.ResetClip(); e.Graphics.FillRectangle(Brushes.Red, path.Bounds); path.Transform(Matrix.FromTranslation(0, 75)); e.Graphics.SetClip(path); if (ResetClip) e.Graphics.ResetClip(); e.Graphics.FillRectangle(Brushes.Green, path.Bounds); }; PropertyChanged += (sender, e) => { if (e.PropertyName == "ResetClip") control.Invalidate(); }; return control; }
GraphicsPath CreatePath() { var path = new GraphicsPath(); path.MoveTo(new Point(10, 10)); path.LineTo(new Point(20, 90)); path.LineTo(new Point(10, 60)); path.LineTo(new Point(90, 80)); path.LineTo(new Point(60, 30)); return path; }
public GraphicsPathSection() { StartFigures = true; PenThickness = 1; path = CreateMainPath(); var layout = new DynamicLayout(); layout.AddSeparateRow(null, StartFiguresControl(), CloseFiguresControl(), ConnectPathControl(), null); layout.AddSeparateRow(null, PenThicknessControl(), PenJoinControl(), PenCapControl(), null); layout.AddSeparateRow(null, Bounds(), CurrentPoint(), null); layout.BeginVertical(); layout.AddRow(new Label { Text = "Draw Line Path" }, DrawLinePath()); layout.AddRow(new Label { Text = "Fill Line Path" }, FillLinePath()); layout.EndVertical(); layout.Add(null); Content = layout; }
void Refresh() { path = null; foreach (var d in Children.OfType<Drawable> ()) { d.Invalidate(); } }
/// <summary> /// Draws the specified <paramref name="path"/> /// </summary> /// <param name="color">Draw color</param> /// <param name="path">Path to draw</param> public void DrawPath (Color color, GraphicsPath path) { handler.DrawPath (color, path); }
/// <summary> /// Fills the specified <paramref name="path"/> /// </summary> /// <param name="color">Fill color</param> /// <param name="path">Path to fill</param> public void FillPath (Color color, GraphicsPath path) { handler.FillPath (color, path); }
/// <summary> /// Draws a polygon with the specified <paramref name="points"/> /// </summary> /// <param name="color">Color to draw the polygon lines</param> /// <param name="points">Points of the polygon</param> public void DrawPolygon (Color color, IEnumerable<Point> points) { var path = new GraphicsPath (Generator); path.AddLines (points); DrawPath (color, path); }
/// <summary> /// /// </summary> /// <param name="pg"></param> /// <param name="dx"></param> /// <param name="dy"></param> /// <param name="scale"></param> /// <returns></returns> public static GraphicsPath ToGraphicsPath(this XPathGeometry pg, double dx, double dy, Func<double, float> scale) { var gp = new GraphicsPath(); gp.FillMode = pg.FillRule == Test2d.XFillRule.EvenOdd ? FillMode.Alternate : FillMode.Winding; foreach (var pf in pg.Figures) { var startPoint = pf.StartPoint; foreach (var segment in pf.Segments) { if (segment is Test2d.XArcSegment) { throw new NotSupportedException("Not supported segment type: " + segment.GetType()); //var arcSegment = segment as Test2d.XArcSegment; // TODO: Convert WPF/SVG elliptical arc segment format to GDI+ bezier curves. //startPoint = arcSegment.Point; } else if (segment is Test2d.XBezierSegment) { var bezierSegment = segment as Test2d.XBezierSegment; gp.AddBezier( new PointF( scale(startPoint.X), scale(startPoint.Y)), new PointF( scale(bezierSegment.Point1.X), scale(bezierSegment.Point1.Y)), new PointF( scale(bezierSegment.Point2.X), scale(bezierSegment.Point2.Y)), new PointF( scale(bezierSegment.Point3.X), scale(bezierSegment.Point3.Y))); startPoint = bezierSegment.Point3; } else if (segment is Test2d.XLineSegment) { var lineSegment = segment as Test2d.XLineSegment; gp.AddLine( scale(startPoint.X), scale(startPoint.Y), scale(lineSegment.Point.X), scale(lineSegment.Point.Y)); startPoint = lineSegment.Point; } else if (segment is Test2d.XPolyBezierSegment) { var polyBezierSegment = segment as Test2d.XPolyBezierSegment; if (polyBezierSegment.Points.Count >= 3) { gp.AddBezier( new PointF( scale(startPoint.X), scale(startPoint.Y)), new PointF( scale(polyBezierSegment.Points[0].X), scale(polyBezierSegment.Points[0].Y)), new PointF( scale(polyBezierSegment.Points[1].X), scale(polyBezierSegment.Points[1].Y)), new PointF( scale(polyBezierSegment.Points[2].X), scale(polyBezierSegment.Points[2].Y))); } if (polyBezierSegment.Points.Count > 3 && polyBezierSegment.Points.Count % 3 == 0) { for (int i = 3; i < polyBezierSegment.Points.Count; i += 3) { gp.AddBezier( new PointF( scale(polyBezierSegment.Points[i - 1].X), scale(polyBezierSegment.Points[i - 1].Y)), new PointF( scale(polyBezierSegment.Points[i].X), scale(polyBezierSegment.Points[i].Y)), new PointF( scale(polyBezierSegment.Points[i + 1].X), scale(polyBezierSegment.Points[i + 1].Y)), new PointF( scale(polyBezierSegment.Points[i + 2].X), scale(polyBezierSegment.Points[i + 2].Y))); } } startPoint = polyBezierSegment.Points.Last(); } else if (segment is Test2d.XPolyLineSegment) { var polyLineSegment = segment as Test2d.XPolyLineSegment; if (polyLineSegment.Points.Count >= 1) { gp.AddLine( scale(startPoint.X), scale(startPoint.Y), scale(polyLineSegment.Points[0].X), scale(polyLineSegment.Points[0].Y)); } if (polyLineSegment.Points.Count > 1) { for (int i = 1; i < polyLineSegment.Points.Count; i++) { gp.AddLine( scale(polyLineSegment.Points[i - 1].X), scale(polyLineSegment.Points[i - 1].Y), scale(polyLineSegment.Points[i].X), scale(polyLineSegment.Points[i].Y)); } } startPoint = polyLineSegment.Points.Last(); } else if (segment is Test2d.XPolyQuadraticBezierSegment) { var polyQuadraticSegment = segment as Test2d.XPolyQuadraticBezierSegment; if (polyQuadraticSegment.Points.Count >= 2) { var p1 = startPoint; var p2 = polyQuadraticSegment.Points[0]; var p3 = polyQuadraticSegment.Points[1]; double x1 = p1.X; double y1 = p1.Y; double x2 = p1.X + (2.0 * (p2.X - p1.X)) / 3.0; double y2 = p1.Y + (2.0 * (p2.Y - p1.Y)) / 3.0; double x3 = x2 + (p3.X - p1.X) / 3.0; double y3 = y2 + (p3.Y - p1.Y) / 3.0; double x4 = p3.X; double y4 = p3.Y; gp.AddBezier( new PointF( scale(x1 + dx), scale(y1 + dy)), new PointF( scale(x2 + dx), scale(y2 + dy)), new PointF( scale(x3 + dx), scale(y3 + dy)), new PointF( scale(x4 + dx), scale(y4 + dy))); } if (polyQuadraticSegment.Points.Count > 2 && polyQuadraticSegment.Points.Count % 2 == 0) { for (int i = 3; i < polyQuadraticSegment.Points.Count; i += 3) { var p1 = polyQuadraticSegment.Points[i - 1]; var p2 = polyQuadraticSegment.Points[i]; var p3 = polyQuadraticSegment.Points[i + 1]; double x1 = p1.X; double y1 = p1.Y; double x2 = p1.X + (2.0 * (p2.X - p1.X)) / 3.0; double y2 = p1.Y + (2.0 * (p2.Y - p1.Y)) / 3.0; double x3 = x2 + (p3.X - p1.X) / 3.0; double y3 = y2 + (p3.Y - p1.Y) / 3.0; double x4 = p3.X; double y4 = p3.Y; gp.AddBezier( new PointF( scale(x1 + dx), scale(y1 + dy)), new PointF( scale(x2 + dx), scale(y2 + dy)), new PointF( scale(x3 + dx), scale(y3 + dy)), new PointF( scale(x4 + dx), scale(y4 + dy))); } } startPoint = polyQuadraticSegment.Points.Last(); } else if (segment is Test2d.XQuadraticBezierSegment) { var qbezierSegment = segment as Test2d.XQuadraticBezierSegment; var p1 = startPoint; var p2 = qbezierSegment.Point1; var p3 = qbezierSegment.Point2; double x1 = p1.X; double y1 = p1.Y; double x2 = p1.X + (2.0 * (p2.X - p1.X)) / 3.0; double y2 = p1.Y + (2.0 * (p2.Y - p1.Y)) / 3.0; double x3 = x2 + (p3.X - p1.X) / 3.0; double y3 = y2 + (p3.Y - p1.Y) / 3.0; double x4 = p3.X; double y4 = p3.Y; gp.AddBezier( new PointF( scale(x1 + dx), scale(y1 + dy)), new PointF( scale(x2 + dx), scale(y2 + dy)), new PointF( scale(x3 + dx), scale(y3 + dy)), new PointF( scale(x4 + dx), scale(y4 + dy))); startPoint = qbezierSegment.Point2; } else { throw new NotSupportedException("Not supported segment type: " + segment.GetType()); } } if (pf.IsClosed) { gp.CloseFigure(); } else { gp.StartFigure(); } } return gp; }
void Draw(Graphics g, Action<Pen> action) { var path = new GraphicsPath(); path.AddLines(new PointF(0, 0), new PointF(100, 40), new PointF(0, 30), new PointF(50, 70)); for (int i = 0; i < 4; i++) { float thickness = 1f + i * PenThickness; var pen = new Pen(Colors.Black, thickness); pen.LineCap = this.LineCap; pen.LineJoin = this.LineJoin; pen.DashStyle = this.DashStyle; if (action != null) action(pen); var y = i * 20; g.DrawLine(pen, 10, y, 110, y); y = 80 + i * 50; g.DrawRectangle(pen, 10, y, 100, 30); y = i * 70; g.DrawArc(pen, 140, y, 100, 80, 160, 160); y = i * 70; g.DrawEllipse(pen, 260, y, 100, 50); g.SaveTransform(); y = i * 70; g.TranslateTransform(400, y); g.DrawPath(pen, path); g.RestoreTransform(); } }
static void ScissorsTest(Graphics graphics) { var t = new { CenterX = 0f, CenterY = 0f, OffsetX = 200f, OffsetY = 50f, RotateAngle = 0f, SkewAngleY = 10f, SkewAngleX = 10f, ScaleX = 16f, ScaleY = 16f }; var path = new GraphicsPath(); path.FillMode = FillMode.Winding; // draw some scissors path.AddBezier(new PointF(9.64f, 7.64f), new PointF(9.87f, 7.14f), new PointF(10f, 6.59f), new PointF(10f, 6f)); path.AddBezier(new PointF(10f, 6f), new PointF(10f, 3.79f), new PointF(8.21f, 2f), new PointF(6f, 2f)); path.AddBezier(new PointF(6f, 2f), new PointF(3.79f, 2f), new PointF(2f, 3.79f), new PointF(2f, 6f)); path.AddBezier(new PointF(2f, 6f), new PointF(2f, 8.21f), new PointF(3.79f, 10f), new PointF(6f, 10f)); path.AddBezier(new PointF(6f, 10f), new PointF(6.59f, 10f), new PointF(7.14f, 9.87f), new PointF(7.64f, 9.64f)); path.AddLine(7.64f, 9.64f, 10f, 12f); path.AddLine(10f, 12f, 7.64f, 14.36f); path.AddBezier(new PointF(7.64f, 14.36f), new PointF(7.14f, 14.13f), new PointF(6.59f, 14f), new PointF(6f, 14f)); path.AddBezier(new PointF(6f, 14f), new PointF(3.79f, 14f), new PointF(2f, 15.79f), new PointF(2f, 18f)); path.AddBezier(new PointF(2f, 18f), new PointF(2f, 20.21f), new PointF(3.79f, 22f), new PointF(6f, 22f)); path.AddBezier(new PointF(6f, 22f), new PointF(8.21f, 22f), new PointF(10f, 20.21f), new PointF(10f, 18f)); path.AddBezier(new PointF(10f, 18f), new PointF(10f, 17.41f), new PointF(9.87f, 16.86f), new PointF(9.64f, 16.36f)); path.AddLine(9.64f, 16.36f, 12f, 14f); path.AddLine(12f, 14f, 19f, 21f); path.AddLine(19f, 21f, 22f, 21f); path.AddLine(22f, 21f, 22f, 20f); path.AddLine(22f, 20f, 9.64f, 7.64f); path.CloseFigure(); path.AddBezier(new PointF(6f, 8f), new PointF(4.9f, 8f), new PointF(4f, 7.11f), new PointF(4f, 6f)); path.AddBezier(new PointF(4f, 6f), new PointF(4f, 4.89f), new PointF(4.9f, 4f), new PointF(6f, 4f)); path.AddBezier(new PointF(6f, 4f), new PointF(7.1f, 4f), new PointF(8f, 4.89f), new PointF(8f, 6f)); path.AddBezier(new PointF(8f, 6f), new PointF(8f, 7.11f), new PointF(7.1f, 8f), new PointF(6f, 8f)); path.CloseFigure(); path.AddBezier(new PointF(6f, 20f), new PointF(4.9f, 20f), new PointF(4f, 19.11f), new PointF(4f, 18f)); path.AddBezier(new PointF(4f, 18f), new PointF(4f, 16.89f), new PointF(4.9f, 16f), new PointF(6f, 16f)); path.AddBezier(new PointF(6f, 16f), new PointF(7.1f, 16f), new PointF(8f, 16.89f), new PointF(8f, 18f)); path.AddBezier(new PointF(8f, 18f), new PointF(8f, 19.11f), new PointF(7.1f, 20f), new PointF(6f, 20f)); path.CloseFigure(); path.AddBezier(new PointF(12f, 12.5f), new PointF(11.72f, 12.5f), new PointF(11.5f, 12.28f), new PointF(11.5f, 12f)); path.AddBezier(new PointF(11.5f, 12f), new PointF(11.5f, 11.72f), new PointF(11.72f, 11.5f), new PointF(12f, 11.5f)); path.AddBezier(new PointF(12f, 11.5f), new PointF(12.28f, 11.5f), new PointF(12.5f, 11.72f), new PointF(12.5f, 12f)); path.AddBezier(new PointF(12.5f, 12f), new PointF(12.5f, 12.28f), new PointF(12.28f, 12.5f), new PointF(12f, 12.5f)); path.CloseFigure(); path.AddLine(19f, 3f, 13f, 9f); path.AddLine(13f, 9f, 15f, 11f); path.AddLine(15f, 11f, 22f, 4f); path.AddLine(22f, 4f, 22f, 3f); path.CloseFigure(); path.AddBezier(new PointF(9.64f, 7.64f), new PointF(9.87f, 7.14f), new PointF(10f, 6.59f), new PointF(10f, 6f)); path.AddBezier(new PointF(10f, 6f), new PointF(10f, 3.79f), new PointF(8.21f, 2f), new PointF(6f, 2f)); path.AddBezier(new PointF(6f, 2f), new PointF(3.79f, 2f), new PointF(2f, 3.79f), new PointF(2f, 6f)); path.AddBezier(new PointF(2f, 6f), new PointF(2f, 8.21f), new PointF(3.79f, 10f), new PointF(6f, 10f)); path.AddBezier(new PointF(6f, 10f), new PointF(6.59f, 10f), new PointF(7.14f, 9.87f), new PointF(7.64f, 9.64f)); path.AddLine(7.64f, 9.64f, 10f, 12f); path.AddLine(10f, 12f, 7.64f, 14.36f); path.AddBezier(new PointF(7.64f, 14.36f), new PointF(7.14f, 14.13f), new PointF(6.59f, 14f), new PointF(6f, 14f)); path.AddBezier(new PointF(6f, 14f), new PointF(3.79f, 14f), new PointF(2f, 15.79f), new PointF(2f, 18f)); path.AddBezier(new PointF(2f, 18f), new PointF(2f, 20.21f), new PointF(3.79f, 22f), new PointF(6f, 22f)); path.AddBezier(new PointF(6f, 22f), new PointF(8.21f, 22f), new PointF(10f, 20.21f), new PointF(10f, 18f)); path.AddBezier(new PointF(10f, 18f), new PointF(10f, 17.41f), new PointF(9.87f, 16.86f), new PointF(9.64f, 16.36f)); path.AddLine(9.64f, 16.36f, 12f, 14f); path.AddLine(12f, 14f, 19f, 21f); path.AddLine(19f, 21f, 22f, 21f); path.AddLine(22f, 21f, 22f, 20f); path.AddLine(22f, 20f, 9.64f, 7.64f); path.CloseFigure(); path.AddBezier(new PointF(6f, 8f), new PointF(4.9f, 8f), new PointF(4f, 7.11f), new PointF(4f, 6f)); path.AddBezier(new PointF(4f, 6f), new PointF(4f, 4.89f), new PointF(4.9f, 4f), new PointF(6f, 4f)); path.AddBezier(new PointF(6f, 4f), new PointF(7.1f, 4f), new PointF(8f, 4.89f), new PointF(8f, 6f)); path.AddBezier(new PointF(8f, 6f), new PointF(8f, 7.11f), new PointF(7.1f, 8f), new PointF(6f, 8f)); path.CloseFigure(); path.AddBezier(new PointF(6f, 20f), new PointF(4.9f, 20f), new PointF(4f, 19.11f), new PointF(4f, 18f)); path.AddBezier(new PointF(4f, 18f), new PointF(4f, 16.89f), new PointF(4.9f, 16f), new PointF(6f, 16f)); path.AddBezier(new PointF(6f, 16f), new PointF(7.1f, 16f), new PointF(8f, 16.89f), new PointF(8f, 18f)); path.AddBezier(new PointF(8f, 18f), new PointF(8f, 19.11f), new PointF(7.1f, 20f), new PointF(6f, 20f)); path.CloseFigure(); path.AddBezier(new PointF(12f, 12.5f), new PointF(11.72f, 12.5f), new PointF(11.5f, 12.28f), new PointF(11.5f, 12f)); path.AddBezier(new PointF(11.5f, 12f), new PointF(11.5f, 11.72f), new PointF(11.72f, 11.5f), new PointF(12f, 11.5f)); path.AddBezier(new PointF(12f, 11.5f), new PointF(12.28f, 11.5f), new PointF(12.5f, 11.72f), new PointF(12.5f, 12f)); path.AddBezier(new PointF(12.5f, 12f), new PointF(12.5f, 12.28f), new PointF(12.28f, 12.5f), new PointF(12f, 12.5f)); path.CloseFigure(); path.AddLine(19f, 3f, 13f, 9f); path.AddLine(13f, 9f, 15f, 11f); path.AddLine(15f, 11f, 22f, 4f); path.AddLine(22f, 4f, 22f, 3f); path.CloseFigure(); var m = Matrix.Create(); var c = new PointF((float)t.CenterX, (float)t.CenterY); // translate m.Translate((float)t.OffsetX, (float)t.OffsetY); // rotate m.RotateAt((float)t.RotateAngle, c); // skew m.Translate(-c.X, -c.Y); m.Prepend(Matrix.Create(1, (float)Math.Tan(Math.PI * t.SkewAngleY / 180.0), (float)Math.Tan(Math.PI * t.SkewAngleX / 180.0), 1, 0, 0)); m.Translate(c.X, c.Y); // scale m.ScaleAt((float)t.ScaleX, (float)t.ScaleY, (float)t.CenterX, (float)t.CenterY); graphics.SaveTransform(); graphics.MultiplyTransform(m); var brush = new SolidBrush(Colors.Black); var pen = new Pen(Colors.Red, 0.5f); graphics.FillPath(brush, path); graphics.DrawPath(pen, path); brush.Dispose(); pen.Dispose(); graphics.RestoreTransform(); }
/// <summary> /// Draws a 1 pixel wide outline of a polygon with the specified <paramref name="points"/> /// </summary> /// <param name="color">Color to draw the polygon lines</param> /// <param name="points">Points of the polygon</param> public void DrawPolygon (Color color, params PointF[] points) { var path = new GraphicsPath (Generator); path.AddLines (points); using (var pen = new Pen (color, 1f, Generator)) DrawPath (pen, path); }
/// <summary> /// Draws an outline of a polygon with the specified <paramref name="points"/> /// </summary> /// <param name="pen">Color to draw the polygon lines</param> /// <param name="points">Points of the polygon</param> public void DrawPolygon (Pen pen, params PointF[] points) { var path = new GraphicsPath (Generator); path.AddLines (points); DrawPath (pen, path); }
/// <summary> /// Fills a polygon defined by <paramref name="points"/> with the specified <paramref name="brush"/> /// </summary> /// <param name="brush">Brush to fill the polygon</param> /// <param name="points">Points of the polygon</param> public void FillPolygon (Brush brush, params PointF[] points) { var path = new GraphicsPath (Generator); path.AddLines (points); FillPath (brush, path); }
/// <summary> /// Fills a polygon defined by <paramref name="points"/> with the specified <paramref name="color"/> /// </summary> /// <param name="color">Fill color</param> /// <param name="points">Points of the polygon</param> public void FillPolygon (Color color, params PointF[] points) { var path = new GraphicsPath (Generator); path.AddLines (points); using (var brush = new SolidBrush (color, Generator)) FillPath (brush, path); }
static void EllipseAndCurveTest(Graphics graphics) { var path = new GraphicsPath(); path.FillMode = FillMode.Winding; path.AddBezier(new PointF(10f, 6f), new PointF(10f, 4f), new PointF(8f, 2f), new PointF(6f, 2f)); path.CloseFigure(); var m = Matrix.Create(); m.Scale(60f, 60f); graphics.SaveTransform(); graphics.MultiplyTransform(m); var brush = new SolidBrush(Colors.Black); var pen = new Pen(Colors.Red, 0.1f); graphics.FillPath(brush, path); graphics.DrawPath(pen, path); brush.Dispose(); pen.Dispose(); var brushY = new SolidBrush(Color.FromArgb(0xFF, 0xFF, 0x00, 0x9F)); var penB = new Pen(Color.FromArgb(0x00, 0x00, 0xFF, 0x9F), 0.1f); graphics.DrawEllipse(penB, 10f, 6f, 0.5f, 0.5f); graphics.FillEllipse(brushY, 10f, 6f, 0.5f, 0.5f); graphics.DrawEllipse(penB, 6f, 2f, 0.5f, 0.5f); graphics.FillEllipse(brushY, 6f, 2f, 0.5f, 0.5f); graphics.RestoreTransform(); }
GraphicsPath CreatePath() { var newPath = new GraphicsPath(); var start = StartFigures; var close = CloseFigures; // connected segments newPath.MoveTo(10, 10); newPath.LineTo(20, 90); newPath.LineTo(10, 60); newPath.LineTo(90, 80); newPath.LineTo(60, 30); if (close && start) newPath.CloseFigure(); if (start) newPath.StartFigure(); newPath.AddArc(100, 0, 100, 50, 200, -160); if (close && start) newPath.CloseFigure(); if (start) newPath.StartFigure(); newPath.AddBezier(new PointF(200, 10), new PointF(285, 20), new PointF(210, 85), new PointF(300, 90)); if (close && start) newPath.CloseFigure(); if (start) newPath.StartFigure(); newPath.AddCurve(new PointF(310, 90), new PointF(390, 90), new PointF(390, 10), new PointF(310, 10)); if (close && start) newPath.CloseFigure(); if (start) newPath.StartFigure(); newPath.AddLine(410, 10, 410, 90); if (close && start) newPath.CloseFigure(); if (start) newPath.StartFigure(); newPath.AddLines(new PointF(420, 10), new PointF(420, 90)); if (close && start) newPath.CloseFigure(); if (start) newPath.StartFigure(); newPath.AddLines(new PointF(430, 10), new PointF(430, 90)); if (close) newPath.CloseFigure(); // separate segments if (start) newPath.StartFigure(); newPath.AddEllipse(100, 100, 100, 45); if (close) newPath.CloseFigure(); if (start) newPath.StartFigure(); newPath.AddRectangle(10, 110, 80, 80); if (close) newPath.CloseFigure(); // at the end, draw a line so we can potentially connect to parent path if (start) newPath.StartFigure(); newPath.AddLines(new PointF(440, 10), new PointF(440, 90)); if (close) newPath.CloseFigure(); return newPath; }
/// <summary> /// /// </summary> /// <param name="gfx"></param> /// <param name="bezier"></param> /// <param name="dx"></param> /// <param name="dy"></param> /// <param name="db"></param> /// <param name="r"></param> public void Draw(object gfx, XBezier bezier, double dx, double dy, ImmutableArray<ShapeProperty> db, Record r) { var _gfx = gfx as Graphics; Brush brush = ToSolidBrush(bezier.Style.Fill); Pen pen = ToPen(bezier.Style, _scaleToPage); var path = new GraphicsPath(); path.AddBezier( new PointF( _scaleToPage(bezier.Point1.X), _scaleToPage(bezier.Point1.Y)), new PointF( _scaleToPage(bezier.Point2.X), _scaleToPage(bezier.Point2.Y)), new PointF( _scaleToPage(bezier.Point3.X), _scaleToPage(bezier.Point3.Y)), new PointF( _scaleToPage(bezier.Point4.X), _scaleToPage(bezier.Point4.Y))); if (bezier.IsFilled) { _gfx.FillPath(brush, path); } if (bezier.IsStroked) { _gfx.DrawPath(pen, path); } path.Dispose(); brush.Dispose(); pen.Dispose(); }
/// <summary> /// Draws a 1 pixel outline of the specified <paramref name="path"/> /// </summary> /// <param name="color">Draw color</param> /// <param name="path">Path to draw</param> public void DrawPath (Color color, GraphicsPath path) { using (var pen = new Pen (color, 1f, Generator)) Handler.DrawPath (pen, path); }
/// <summary> /// Draws an outline of a polygon with the specified <paramref name="points"/> /// </summary> /// <param name="pen">Color to draw the polygon lines</param> /// <param name="points">Points of the polygon</param> public void DrawPolygon(Pen pen, params PointF[] points) { var path = new GraphicsPath(); path.AddLines(points); path.LineTo(points[0]); DrawPath(pen, path); }
/// <summary> /// /// </summary> /// <param name="gfx"></param> /// <param name="arc"></param> /// <param name="dx"></param> /// <param name="dy"></param> /// <param name="db"></param> /// <param name="r"></param> public void Draw(object gfx, XArc arc, double dx, double dy, ImmutableArray<ShapeProperty> db, Record r) { var a = GdiArc.FromXArc(arc, dx, dy); if (a.Width <= 0.0 || a.Height <= 0.0) return; var _gfx = gfx as Graphics; Brush brush = ToSolidBrush(arc.Style.Fill); Pen pen = ToPen(arc.Style, _scaleToPage); if (arc.IsFilled) { var path = new GraphicsPath(); path.AddArc( _scaleToPage(a.X), _scaleToPage(a.Y), _scaleToPage(a.Width), _scaleToPage(a.Height), (float)a.StartAngle, (float)a.SweepAngle); _gfx.FillPath(brush, path); if (arc.IsStroked) { _gfx.DrawPath(pen, path); } path.Dispose(); } else { if (arc.IsStroked) { _gfx.DrawArc( pen, _scaleToPage(a.X), _scaleToPage(a.Y), _scaleToPage(a.Width), _scaleToPage(a.Height), (float)a.StartAngle, (float)a.SweepAngle); } } brush.Dispose(); pen.Dispose(); }
/// <summary> /// Draws the specified <paramref name="path"/> /// </summary> /// <param name="pen">Pen to outline the path</param> /// <param name="path">Path to draw</param> public void DrawPath (Pen pen, GraphicsPath path) { Handler.DrawPath (pen, path); }
/// <summary> /// /// </summary> /// <param name="gfx"></param> /// <param name="qbezier"></param> /// <param name="dx"></param> /// <param name="dy"></param> /// <param name="db"></param> /// <param name="r"></param> public void Draw(object gfx, XQBezier qbezier, double dx, double dy, ImmutableArray<ShapeProperty> db, Record r) { var _gfx = gfx as Graphics; Brush brush = ToSolidBrush(qbezier.Style.Fill); Pen pen = ToPen(qbezier.Style, _scaleToPage); double x1 = qbezier.Point1.X; double y1 = qbezier.Point1.Y; double x2 = qbezier.Point1.X + (2.0 * (qbezier.Point2.X - qbezier.Point1.X)) / 3.0; double y2 = qbezier.Point1.Y + (2.0 * (qbezier.Point2.Y - qbezier.Point1.Y)) / 3.0; double x3 = x2 + (qbezier.Point3.X - qbezier.Point1.X) / 3.0; double y3 = y2 + (qbezier.Point3.Y - qbezier.Point1.Y) / 3.0; double x4 = qbezier.Point3.X; double y4 = qbezier.Point3.Y; var path = new GraphicsPath(); path.AddBezier( new PointF( _scaleToPage(x1 + dx), _scaleToPage(y1 + dy)), new PointF( _scaleToPage(x2 + dx), _scaleToPage(y2 + dy)), new PointF( _scaleToPage(x3 + dx), _scaleToPage(y3 + dy)), new PointF( _scaleToPage(x4 + dx), _scaleToPage(y4 + dy))); if (qbezier.IsFilled) { _gfx.FillPath(brush, path); } if (qbezier.IsStroked) { _gfx.DrawPath(pen, path); } path.Dispose(); brush.Dispose(); pen.Dispose(); }
/// <summary> /// Fills the specified <paramref name="path"/> /// </summary> /// <param name="color">Fill color</param> /// <param name="path">Path to fill</param> public void FillPath (Color color, GraphicsPath path) { using (var brush = new SolidBrush (color, Generator)) Handler.FillPath (brush, path); }
/// <summary> /// Fills the specified <paramref name="path"/> /// </summary> /// <param name="brush">Brush to fill the path</param> /// <param name="path">Path to fill</param> public void FillPath (Brush brush, GraphicsPath path) { Handler.FillPath (brush, path); }
void Refresh(object sender, EventArgs e) { path = CreateMainPath(); foreach (var d in this.Children.OfType<Drawable> ()) { d.Invalidate(); } }