gdi+beziergraphicspath

How to determine endpoints of Arcs in GraphicsPath PathPoints and PathTypes arrays?


I have the following PathPoints and PathTypes arrays (format: X, Y, Type):

-177.477900,  11021.670000, 1
-614.447200,  11091.820000, 3
-1039.798000, 10842.280000, 3
-1191.761000, 10426.620000, 3
-1591.569000, 10493.590000, 3
-1969.963000, 10223.770000, 3
-2036.929000, 9823.960000,  3
-2055.820000, 9711.180000,  3
-2048.098000, 9595.546000,  3
-2014.380000, 9486.278000,  3

Here is what this GraphicsPath physically looks like. The 2 Arcs are very distinguishable: alt text

I know that this GraphicsPath.PathData array was created by 2 AddArc commands. Stepping through the code in the debugger, I saw that the first 4 PathData values were added by the first AddArc command, and the remaining 6 points were added by the 2nd AddArc command.

By examining the raw pathpoints/pathtype arrays (without previously knowing that it was 2 AddArc commands so I would know that I have 2 start and end points), I would like to determine to start and end point of each arc.

I have tried several Bezier calculations to 'recreate' the points in the array, but am at a loss to determine how to determine the separate start and end points. It appears that GDI+ is combining the start/end point between the arcs (they are the same point and the arcs are connected), and I am losing the fact that one arc is ending and other one is starting.

Any ideas?


Solution

  • Use the GraphicsPathIterator class in combination with the GraphicsPath.SetMarkers method.

    For example:

    dim gp as new GraphicsPath
    gp.AddArc(-50, 0, 100, 50, 270, 90) 'Arc1
    gp.SetMarkers()
    gp.AddArc(0, 25, 100, 50, 270, 90) 'Arc2
    Dim iterator as New GraphicsPathIterator(gp)
    Dim i as Integer = 0
    Dim MyPts(3) As PointF
    Dim temp as New GraphicsPath
    Do until i > 2
       iterator.NextMarker(temp)
       MyPts(i) = temp.PathPoints(0)
       MyPts(i + 1) = temp.GetLastPoint()
      i += 2
    Loop
    
    'Free system resources...
    iterator.Dispose()
    
    temp.Dispose()
    
    Arc1 -> start: MyPts(0); end: MyPts(1)
    Arc2 -> start: MyPts(2); end: MyPts(3)
    

    Hope this helps!