1

次の PathPoints および PathTypes 配列があります (形式: 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

この GraphicsPath の物理的な外観は次のとおりです。2 つのアークは非常に区別できます。 代替テキスト

この GraphicsPath.PathData 配列が 2 つの AddArc コマンドによって作成されたことはわかっています。デバッガーでコードをステップ実行すると、最初の 4 つの PathData 値が最初の AddArc コマンドによって追加され、残りの 6 つのポイントが 2 番目の AddArc コマンドによって追加されたことがわかりました。

生のパスポイント/パスタイプ配列を調べることで (2 つの AddArc コマンドであることを事前に知らなかったので、開始点と終了点が 2 つあることがわかります)、各アークの開始点と終了点を特定したいと思います。

配列内のポイントを「再作成」するためにいくつかのベジエ計算を試みましたが、個別の開始点と終了点を決定する方法を決定するのに途方に暮れています。GDI+ がアーク間の始点/終点を結合しているように見え (それらは同じ点であり、アークは接続されています)、1 つのアークが終了し、別のアークが開始しているという事実が失われています。

何か案は?

4

3 に答える 3

1

GraphicsPathIterator クラスを GraphicsPath.SetMarkers メソッドと組み合わせて使用​​します。

例えば:

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)

お役に立てれば!

于 2011-01-25T06:55:06.330 に答える