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 个点是由第二个 AddArc 命令添加的。

通过检查原始路径点/路径类型数组(以前不知道它是 2 个 AddArc 命令,所以我知道我有 2 个起点和终点),我想确定每个弧的起点和终点。

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

有任何想法吗?

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 回答
0

看看 PathPointType 枚举 (System.Drawing.Drawing2D)。值 含义 0 开始(路径) 1 行 3 Bezier/Bezier3 7 PathType 掩码 16 Dash 模式 32 路径标记 128 关闭子路径

于 2009-12-03T16:59:42.520 回答
0

这个也困扰了我很多!我在没有标记的情况下创建了超出我控制范围的路径,并且无法确定曲线端点。

在这种情况下,您会期望曲线开始于,[i + 1]但事实并非如此!事实证明,GDI 组合路径点可能是为了使点数组更短。在这种情况下,曲线点是:[0], [1], [2], [3]

似乎如果PathPointType.StartorPathPointType.Line后跟PathPointType.Bezier,那么您必须将PathPontType.StartorPath.PointType.Line视为贝塞尔曲线的第一个点,因此在您的示例中应该是这样的:

-177.47, 11021.67, 1 // 画线到该点并将其用作贝塞尔曲线起点!
 -614.44, 11091.82, 3 // 第二个贝塞尔点
-1039.79, 10842.28, 3 // 第三个贝塞尔点
-1191.76, 10426.62, 3 // 第四个 Bezier 点和下一个 Bezier 的第一个点!
-1591.56, 10493.59, 3 // 第二个贝塞尔点
-1969.96, 10223.77, 3 // 第三个贝塞尔点
-2036.92, 9823.96, 3 // 第四个贝塞尔点和下一个贝塞尔的第一个点!
-2055.82, 9711.18, 3 // 第二个贝塞尔点
-2048.09, 9595.54, 3 // 第三个贝塞尔点
-2014.38, 9486.27, 3 // 第四个贝塞尔点

因此,在PathPoints逐点分析数组时,您还必须检查当前后续索引。PatPointType上的文档可能会派上用场。在大多数情况下,您可能会忽略存储在前三个以外的位上的其他数据(这三个定义和Start)。唯一的例外是,但如果您考虑下一个建议,则无关紧要。LineBezierCloseSubpath

还值得注意的是,如果您有一个包含大量路径的复杂路径,那么使用GraphicsPathIteratorPathPoints将路径拆分为块可能会很方便。这简化了整个过程,可以忽略 - 它始终是块的最后一点。PathPointType.CloseSubpathGraphicsPath

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

于 2013-06-27T09:15:41.087 回答