c# - How to draw arc with radius and start and stop angle -


if have following 4 properties in datacontext of canvas element

point  center double radius double startangle double endangle 

can draw arc without code behind?

providing custom component turned out best solution. use in code

<controls:arc center="{binding path=previousmousepositionpixels}"           stroke="white"           strokedasharray="4 4"          snapstodevicepixels="true"          startangle="0"           endangle="{binding path=deltaangle}"           smallangle="true"          radius="40"/> 

smallangle when true render small angle between points irrespective of order of startangle , endangle. when smallangle false arc rendered counter clockwise.

the implementation is.

using system; using system.collections.generic; using system.windows; using system.windows.documents; using system.windows.media; using system.windows.shapes;  public sealed class arc : shape {     public point center     {         { return (point)getvalue(centerproperty); }         set { setvalue(centerproperty, value); }     }      // using dependencyproperty backing store center.  enables animation, styling, binding, etc...     public static readonly dependencyproperty centerproperty =         dependencyproperty.register("center", typeof(point), typeof(arc)         , new frameworkpropertymetadata(new point(0, 0), frameworkpropertymetadataoptions.affectsrender));       public double startangle     {         { return (double)getvalue(startangleproperty); }         set { setvalue(startangleproperty, value); }     }      // using dependencyproperty backing store startangle.  enables animation, styling, binding, etc...     public static readonly dependencyproperty startangleproperty =         dependencyproperty.register("startangle", typeof(double), typeof(arc)         , new frameworkpropertymetadata(0.0, frameworkpropertymetadataoptions.affectsrender));      public double endangle     {         { return (double)getvalue(endangleproperty); }         set { setvalue(endangleproperty, value); }     }      // using dependencyproperty backing store endangle.  enables animation, styling, binding, etc...     public static readonly dependencyproperty endangleproperty =         dependencyproperty.register("endangle", typeof(double), typeof(arc)         , new frameworkpropertymetadata(math.pi/2.0, frameworkpropertymetadataoptions.affectsrender));      public double radius     {         { return (double)getvalue(radiusproperty); }         set { setvalue(radiusproperty, value); }     }      // using dependencyproperty backing store radius.  enables animation, styling, binding, etc...     public static readonly dependencyproperty radiusproperty =         dependencyproperty.register("radius", typeof(double), typeof(arc)         , new frameworkpropertymetadata(10.0, frameworkpropertymetadataoptions.affectsrender));        public bool smallangle     {         { return (bool)getvalue(smallangleproperty); }         set { setvalue(smallangleproperty, value); }     }      // using dependencyproperty backing store smallangle.  enables animation, styling, binding, etc...     public static readonly dependencyproperty smallangleproperty =         dependencyproperty.register("smallangle", typeof(bool), typeof(arc)         , new frameworkpropertymetadata(false, frameworkpropertymetadataoptions.affectsrender));       static arc()     {         defaultstylekeyproperty.overridemetadata(typeof(arc), new frameworkpropertymetadata(typeof(arc)));     }      protected override geometry defininggeometry     {                 {              var a0 = startangle < 0 ? startangle + 2 * math.pi : startangle;             var a1 = endangle < 0 ? endangle + 2 * math.pi : endangle;              if (a1<a0)             {                 a1 += math.pi * 2;             }              sweepdirection d = sweepdirection.counterclockwise;             bool large;              if (smallangle)             {                 large = false;                 double t = a1;                 if ((a1-a0)>math.pi)                 {                     d = sweepdirection.counterclockwise;                 }                 else                 {                     d = sweepdirection.clockwise;                 }               }else{                 large = (math.abs(a1 - a0) < math.pi);             }              point p0 = center + new vector(math.cos(a0), math.sin(a0)) * radius;             point p1 = center + new vector(math.cos(a1), math.sin(a1)) * radius;               list<pathsegment> segments = new list<pathsegment>(1);             segments.add(new arcsegment(p1, new size(radius, radius), 0.0, large, d, true));              list<pathfigure> figures = new list<pathfigure>(1);             pathfigure pf = new pathfigure(p0, segments, true);             pf.isclosed = false;             figures.add(pf);              geometry g = new pathgeometry(figures, fillrule.evenodd, null);             return g;         }     } } 

Comments

Popular posts from this blog

blackberry 10 - how to add multiple markers on the google map just by url? -

php - guestbook returning database data to flash -

delphi - Dynamic file type icon -