如何确定GraphicsPath PathPoints和PathTypes数组中的弧的端点? [英] How to determine endpoints of Arcs in GraphicsPath PathPoints and PathTypes arrays?

查看:798
本文介绍了如何确定GraphicsPath PathPoints和PathTypes数组中的弧的端点?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下PathPoints和PathTypes数组(格式:X,Y,类型):

-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命令创建的.在调试器中逐步执行代码,我看到第一个AddArc命令添加了前4个PathData值,第二个AddArc命令添加了其余6个点.

通过检查原始路径点/路径类型数组(以前没有知道这是2个AddArc命令,因此我知道我有2个起点和终点),我想确定每个弧的起点和终点./p>

我已经尝试了几次Bezier计算来重新创建"阵列中的点,但是无法确定如何确定单独的起点和终点.似乎GDI +正在组合弧之间的起点/终点(它们是同一点并且弧已连接),而我却失去了一个弧正在结束而另一弧正在开始的事实.

有什么想法吗?

解决方案

结合使用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)

希望这会有所帮助!

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:

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?

解决方案

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!

这篇关于如何确定GraphicsPath PathPoints和PathTypes数组中的弧的端点?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆