Gdi+ 如何确定GraphicsPath PathPoints和PathTypes数组中圆弧的端点?

Gdi+ 如何确定GraphicsPath PathPoints和PathTypes数组中圆弧的端点?,gdi+,bezier,graphicspath,Gdi+,Bezier,Graphicspath,我有以下路径点和路径类型数组(格式:X,Y,Type): 这是这个图形的物理外观。这两个弧非常容易区分: 我知道这个GraphicsPath.PathData数组是由2个AddArc命令创建的。在调试程序中逐步查看代码,我看到前4个PathData值是由第一个AddArc命令添加的,其余6个点是由第二个AddArc命令添加的 通过检查原始pathpoints/pathtype数组(之前不知道它是2个AddArc命令,因此我知道我有2个起点和终点),我想确定每个圆弧的起点和终点 我尝试了几次贝塞

我有以下路径点和路径类型数组(格式:X,Y,Type):

这是这个图形的物理外观。这两个弧非常容易区分:

我知道这个GraphicsPath.PathData数组是由2个AddArc命令创建的。在调试程序中逐步查看代码,我看到前4个PathData值是由第一个AddArc命令添加的,其余6个点是由第二个AddArc命令添加的

通过检查原始pathpoints/pathtype数组(之前不知道它是2个AddArc命令,因此我知道我有2个起点和终点),我想确定每个圆弧的起点和终点

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


有什么想法吗?

看看PathPointType枚举(System.Drawing.Drawing2D)。 价值意义 0开始(路径) 一行 3贝塞尔/贝塞尔3 7路径类型掩码 16破折号模式 32路径标记
128关闭子路径查看PathPointType枚举(System.Drawing.Drawing2D)。 价值意义 0开始(路径) 一行 3贝塞尔/贝塞尔3 7路径类型掩码 16破折号模式 32路径标记
128关闭子路径

将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)

希望这有帮助

将GraphicsPath.SetMarkers方法与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+1]
开始,但事实并非如此!结果表明,GDI组合路径点可能是为了使点阵列更短。在这种情况下,曲线点为:
[0]、[1]、[2]、[3]

如果
PathPointType.Start
PathPointType.Line
后面跟着
PathPointType.Bezier
,则必须将
PathPontType.Start
Path.PointType.Line
视为Bezier曲线的第一个点,因此在您的示例中应该是这样的:

-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 -177.4711021.67,1//画一条线到此点,并将其用作贝塞尔起点! -614.4411091.82,3//第二贝塞尔点 -1039.7910842.28,3//第三贝塞尔点 -1191.7610426.62,3//第四个贝塞尔点和下一个贝塞尔点的第一个点! -1591.5610493.59,3//第二贝塞尔点 -1969.9610223.77,3//第三贝塞尔点 -2036.929823.96,3//第四个贝塞尔点和下一个贝塞尔点的第一个点! -2055.829711.18,3//第二贝塞尔点 -2048.099595.54,3//第三贝塞尔点 -2014.389486.27,3//第四贝塞尔点 因此,在逐点分析
PathPoints
数组时,还必须检查当前和以下索引。上面的文档可能会派上用场。在大多数情况下,您可能会忽略除前三位之外的其他位上存储的数据(这三个位定义了
Start
Line
Bezier
)。唯一的例外是<代码> CouthSubPuth,但是如果你考虑下一个建议,那就无关紧要了。 还值得注意的是,如果您有一个由大量
路径点组成的复杂路径,那么使用将路径拆分为块可能很方便。这简化了整个过程,因为
PathPointType。CloseSubpath
可以忽略-它将始终是
GraphicsPath
区块的最后一个点


如果您想更好地理解
点类型
数组,快速查看Reflector或可能会有所帮助。

这一个也让我很烦恼!我创建的路径超出了我的控制范围,没有标记,无法找出曲线端点

在这种情况下,您希望曲线从
[i+1]
开始,但事实并非如此!结果表明,GDI组合路径点可能是为了使点阵列更短。在这种情况下,曲线点为:
[0]、[1]、[2]、[3]

如果
PathPointType.Start
PathPointType.Line
后面跟着
PathPointType.Bezier
,则必须将
PathPontType.Start
Path.PointType.Line
视为Bezier曲线的第一个点,因此在您的示例中应该是这样的:

-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 -177.4711021.67,1//画一条线到此点,并将其用作贝塞尔起点! -614.4411091.82,3//第二贝塞尔点 -1039.7910842.28,3//第三贝塞尔点 -1191.7610426.62,3//第四个贝塞尔点和下一个贝塞尔点的第一个点! -1591.5610493.59,3//第二贝塞尔点 -1969.9610223.77,3//第三贝塞尔点 -2036.929823.96,3//第四个贝塞尔点和下一个贝塞尔点的第一个点! -2055.829711.18,3//第二贝塞尔点 -2048.099595.54,3//第三贝塞尔点 -2014.389486.27,3//第四贝塞尔点 因此,在逐点分析
PathPoints
数组时,还必须检查当前和以下索引。上面的文档可能会派上用场。在大多数情况下,您可能会忽略除前三位之外的其他位上存储的数据(这三个位定义了
Start
Line
Bezier
)。唯一的例外是<代码> CouthSubPuth,但是如果你考虑下一个建议,那就无关紧要了。 还值得注意的是,如果您有一个由大量
路径点组成的复杂路径,那么使用将路径拆分为块可能很方便。这简化了