Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Drawing an arrow end on a Quadratic Bezier Segment using xaml

Tags:

wpf

xaml

What's the easiest way to draw an arrow at the end of a QuadraticBezierSegment? The tricky part is to get the correct rotation to mach the incoming line segment.

Any ideas on how to go about this? Should I extend PathSegment?

Bezier segment with an arrow at the end

I've got this for drawing a simple bezier line.

<Path Stroke="Black" StrokeThickness="1">
  <Path.Data>
    <PathGeometry>
      <PathGeometry.Figures>
        <PathFigureCollection>
          <PathFigure StartPoint="100,430">
            <PathFigure.Segments>
              <PathSegmentCollection>
                <QuadraticBezierSegment Point1="150,250" Point2="250,300" />
              </PathSegmentCollection>
            </PathFigure.Segments>
          </PathFigure>
        </PathFigureCollection>
      </PathGeometry.Figures>
    </PathGeometry>
  </Path.Data>
</Path>
like image 343
vidstige Avatar asked Aug 31 '12 15:08

vidstige


1 Answers

You could define the geometry for the arrow head....but it would take trial and error to correctly orientate it on the end of the bezier curve.

Instead you could use this control and define the endcap you wanted using geometry and it properly places it on the end of the "line".

  • http://blogs.msdn.com/b/mrochon/archive/2011/01/10/custom-line-caps-in-wpf.aspx

    <loc:CappedLine Stroke="Red" StrokeThickness="1" Canvas.Left="40" Canvas.Top="200" RenderTransformOrigin="0.5,0.5" Height="107" Width="195">
        <loc:CappedLine.EndCap>
            <GeometryGroup>
                <LineGeometry StartPoint="0,0" EndPoint="10,10"/>
                <LineGeometry StartPoint="0,0" EndPoint="10,-10"/>
            </GeometryGroup>
        </loc:CappedLine.EndCap>
        <loc:CappedLine.LinePath>
            <PathGeometry Figures="M0,0 C1,1 10.5,75.5 48.5,66.5 86.5,57.5 5,3.5000146 105.5,16.500091 157.5,29.500166 164.5,87.500505 164.5,87.500505" />
        </loc:CappedLine.LinePath>
    </loc:CappedLine>
    
    <loc:CappedLine Stroke="Red" StrokeThickness="1" Canvas.Left="180" Canvas.Top="200" RenderTransformOrigin="0.5,0.5" Height="107" Width="195">
        <loc:CappedLine.EndCap>
            <GeometryGroup>
                <LineGeometry StartPoint="0,0" EndPoint="10,10"/>
                <LineGeometry StartPoint="0,0" EndPoint="10,-10"/>
            </GeometryGroup>
        </loc:CappedLine.EndCap>
        <loc:CappedLine.LinePath>
            <PathGeometry Figures="M0,0 C1,1 10.5,75.5 48.5,66.5 86.5,57.5 5,3.5000146 105.5,16.500091" />
        </loc:CappedLine.LinePath>
    </loc:CappedLine>
    

enter image description here

like image 63
CSmith Avatar answered Sep 20 '22 05:09

CSmith