2009-11-24 15 views
1

J'ai les tableaux PathPoints et PathTypes suivants (format: X, Y, Type):Comment déterminer les points d'extrémité d'Arcs dans les tableaux PathPoints et PathTypes de GraphicsPath?

-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 

Voici ce que cela GraphicsPath ressemble physiquement. Les 2 arcs sont très différents: alt text http://i45.tinypic.com/2agj1gl.jpg

Je sais que ce tableau GraphicsPath.PathData a été créé par 2 commandes AddArc. En parcourant le code dans le débogueur, j'ai vu que les 4 premières valeurs PathData ont été ajoutées par la première commande AddArc, et les 6 points restants ont été ajoutés par la 2ème commande AddArc. En examinant les tableaux pathpath/pathtype (sans savoir auparavant que c'était 2 commandes AddArc, donc je saurais que j'ai 2 points de début et de fin), je voudrais déterminer le point de début et de fin de chaque arc.

J'ai essayé plusieurs calculs de Bézier pour "recréer" les points dans le tableau, mais je suis incapable de déterminer comment déterminer les points de départ et d'arrivée séparés. Il semble que GDI + combine le point de départ/fin entre les arcs (ils sont le même point et les arcs sont connectés), et je perds le fait qu'un arc se termine et que l'autre commence.

Des idées?

Répondre

1

Utilisez la classe GraphicsPathIterator en combinaison avec la méthode GraphicsPath.SetMarkers.

Par exemple:

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!

+0

Cela peut aider aussi longtemps que vous pouvez réellement ajouter des marqueurs lorsque vous créez un chemin. Mais ce n'est pas toujours possible. Regardez [cette réponse] (http://stackoverflow.com/questions/1790862/how-to-determine-endpoints-of-arcs-in-graphicspath-pathpoints-and-pathtypes-arra/17339215#17339215) pour mieux comprendre comment 'GraphicsPath' est construit en interne. – SiliconMind

0

Jetez un coup d'œil à PathPointType Enum (System.Drawing.Drawing2D). Valeur Signification 0 Démarrer (chemin) 1 ligne 3 Bézier/Bezier3 7 pathtype Masque 16 Mode Dash 32 Chemin Marker 128 Fermer Subpath

+0

C'est ce que le 3ème numéro de ma liste ci-dessus (le PathPointType). Le problème que j'ai est que les courbes 2 Bezier/Bezier3 (PathPointType = 3) dans le tableau ci-dessus. J'ai besoin de comprendre comment déterminer où diviser le tableau. Je connais mon ajout de l'arc par programmation que la valeur '-1191.761000, 10426.620000, 3' est l'extrémité du premier arc et le point de départ du deuxième arc. Cependant, j'ai besoin de comprendre comment déterminer cela par programmation. –

0

Celui-ci m'embêtait beaucoup aussi! J'ai créé un chemin au-delà de mon contrôle sans marqueurs et je n'arrivais pas à comprendre les extrémités de la courbe.

Dans ce cas, vous vous attendez à ce que la courbe commence à [i + 1] mais ce n'est pas le cas! Il s'avère que GDI combine probablement des points de chemin pour rendre le tableau de points plus court. Dans ce cas, les points de la courbe sont: [0], [1], [2], [3].

Il semble que si PathPointType.Start ou PathPointType.Line est suivi par PathPointType.Bezier, alors vous devez traiter le PathPontType.Start ou Path.PointType.Line comme premier point de votre courbe de Bézier, donc dans votre exemple, il devrait ressembler à ceci:

 
-177.47, 11021.67, 1 // Draw line to this point AND use it as a Bezier start! 
-614.44, 11091.82, 3 // Second Bezier point 
-1039.79, 10842.28, 3 // Third Bezier point 
-1191.76, 10426.62, 3 // Fourth Bezier point AND first point of the next Bezier! 
-1591.56, 10493.59, 3 // Second Bezier point 
-1969.96, 10223.77, 3 // Third Bezier point 
-2036.92, 9823.96, 3 // Fourth Bezier point AND first point of the next Bezier! 
-2055.82, 9711.18, 3 // Second Bezier point 
-2048.09, 9595.54, 3 // Third Bezier point 
-2014.38, 9486.27, 3 // Fourth Bezier point

Ainsi, lors de l'analyse point par point PathPoints tableau, vous devez également vérifier et suivant les indices. Les documents sur PatPointType pourraient être utiles. Dans la plupart des cas, vous pouvez probablement ignorer des données supplémentaires stockées sur des bits autres que les trois premiers (ces trois définissent Start, Line et Bezier). La seule exception est CloseSubpath mais ce n'est pas pertinent si vous considérez le prochain conseil.

Il est également intéressant de noter que si vous avez un chemin complexe constitué d'un grand nombre de PathPoints, il peut être pratique de diviser le chemin en blocs en utilisant GraphicsPathIterator. Cela simplifie toute la procédure car PathPointType.CloseSubpath peut être ignoré - ce sera toujours le dernier point de votre bloc GraphicsPath. Un examen rapide dans Reflector ou here peut être utile si vous voulez mieux comprendre la baie PointTypes.