From: jpbruyere Date: Tue, 16 Aug 2016 02:27:25 +0000 (+0200) Subject: arrows X-Git-Tag: v0.9.5-beta~259^2~37 X-Git-Url: https://git.osiis.dedyn.io/?a=commitdiff_plain;h=12c134e150cb580ab6353638c1d45fec5444a8c2;p=jp%2Fcrow.git arrows --- diff --git a/src/ExtensionsMethods.cs b/src/ExtensionsMethods.cs index d1b951b9..2bfc36ea 100644 --- a/src/ExtensionsMethods.cs +++ b/src/ExtensionsMethods.cs @@ -26,6 +26,7 @@ namespace Crow public static class ExtensionsMethods { #region Cairo extensions + public static void Rectangle(this Cairo.Context ctx, Rectangle r, double stroke = 0.0) { if (stroke > 0.0) { @@ -36,6 +37,59 @@ namespace Crow }else ctx.Rectangle (r.X, r.Y, r.Width, r.Height); } + public static double GetLength(this Cairo.PointD p){ + return Math.Sqrt (Math.Pow (p.X, 2) + Math.Pow (p.Y, 2)); + } + public static Cairo.PointD GetPerp(this Cairo.PointD p){ + return new Cairo.PointD(-p.Y, p.X); + } + public static Cairo.PointD GetNormalized(this Cairo.PointD p){ + double length = p.GetLength(); + p.X /= length; + p.Y /= length; + return p; + } + public static Cairo.PointD Substract(this Cairo.PointD p1, Cairo.PointD p2){ + return new Cairo.PointD(p1.X - p2.X, p1.Y - p2.Y); + } + public static Cairo.PointD Add(this Cairo.PointD p1, Cairo.PointD p2){ + return new Cairo.PointD(p1.X + p2.X, p1.Y + p2.Y); + } + public static Cairo.PointD Multiply(this Cairo.PointD p1, double v){ + return new Cairo.PointD(p1.X * v, p1.Y * v); + } + public static void DrawCote(this Cairo.Context ctx, Cairo.PointD p1, Cairo.PointD p2, double stroke = 1.0) + { + const double arrowWidth = 4.0; + const double arrowLength = 10.0; + + Cairo.PointD vDir = p2.Substract(p1); + vDir = vDir.GetNormalized (); + Cairo.PointD vPerp = vDir.GetPerp (); + + Cairo.PointD pA0 = p1.Add(vDir.Multiply(arrowLength)); + Cairo.PointD pA1 = p2.Substract(vDir.Multiply(arrowLength)); + + Cairo.PointD vA = vPerp.Multiply (arrowWidth); + + ctx.MoveTo (p1); + ctx.LineTo (pA0.Add (vA)); + ctx.LineTo (pA0.Substract (vA)); + ctx.LineTo (p1); + + ctx.MoveTo (p2); + ctx.LineTo (pA1.Add (vA)); + ctx.LineTo (pA1.Substract (vA)); + ctx.LineTo (p2); + + ctx.Fill (); + + ctx.MoveTo (p1); + ctx.LineTo (p2); + ctx.LineWidth = stroke; + ctx.Stroke (); + + } public static void SetSourceColor(this Cairo.Context ctx, Color c) { ctx.SetSourceRGBA(c.R,c.G,c.B,c.A); @@ -45,6 +99,7 @@ namespace Crow grad.AddColorStop (offset, new Cairo.Color (c.R, c.G, c.B, c.A)); } #endregion + public static void Raise(this EventHandler handler, object sender, EventArgs e) { if(handler != null) diff --git a/src/Point.cs b/src/Point.cs index ba0103e3..2e196133 100644 --- a/src/Point.cs +++ b/src/Point.cs @@ -29,6 +29,9 @@ namespace Crow public int Length { get { return (int)Math.Sqrt (Math.Pow (_x, 2) + Math.Pow (_y, 2)); } } + public double LengthD { + get { return Math.Sqrt (Math.Pow (_x, 2) + Math.Pow (_y, 2)); } + } public static implicit operator Cairo.Point(Point p) { return new Cairo.Point(p.X, p.Y);