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
Post a Comment