C# SVG-获取两条路径的差异路径

C# SVG-获取两条路径的差异路径,c#,javascript,svg,C#,Javascript,Svg,有没有一种简单的方法可以获得两个SVG路径的差异路径?我有一个大的多边形,我需要从中切割一些孔,或者通过减去一条路径将其切割成碎片 最好是JavaScript语言,但C#也可以 我已经在寻找解决办法了。最接近的是,但它是关于形状,而不是路径。并给出了一个线索,如何画一条有洞的路径,但没有办法自动完成 我真的被手动添加第二条路径(包括检查方向、绝对/相对位置、变换等所有内容)所困扰吗?我不太确定您想要实现什么,但我可以看到两种可能性:A)绘制带孔的多边形或B)在两个多边形之间进行布尔差分操作 A)

有没有一种简单的方法可以获得两个SVG路径的差异路径?我有一个大的多边形,我需要从中切割一些孔,或者通过减去一条路径将其切割成碎片

最好是JavaScript语言,但C#也可以

我已经在寻找解决办法了。最接近的是,但它是关于形状,而不是路径。并给出了一个线索,如何画一条有洞的路径,但没有办法自动完成


我真的被手动添加第二条路径(包括检查方向、绝对/相对位置、变换等所有内容)所困扰吗?

我不太确定您想要实现什么,但我可以看到两种可能性:A)绘制带孔的多边形或B)在两个多边形之间进行布尔差分操作

A) 用孔画多边形 缠绕顺序是关键。如果您有外部多边形(SVG路径),它是顺时针(CW)的,如下所示:

“M155,61.67 L155212.7 L288.98212.7 L288.98,61.67 L173.0199999998,61.67 L155,61.67Z”

以及逆时针方向(CCW)的孔多边形(SVG路径),如下所示:
“M274.37190.77 L171.24190.77 L171.24,81.16 L274.37,81.16 L274.37,81.16 L274.37190.77Z”

然后将它们组合到同一路径中:

“M155,61.67 L155212.7 L288.98212.7 L288.98,61.67 L173.0199999998,61.67 L155,61.67ZM274.37190.77 L171.24190.77 L171.24,81.16 L274.37,81.16 L274.37,81.16 L274.37,81.16 L274.37190.77Z”

将获得以下带孔的多边形:

在上图中,内部多边形似乎是从外部多边形中减去的

B) 在两个多边形之间进行布尔差分运算 如果要从另一个多边形剪切一个多边形,并通过在两个或多个多边形之间执行布尔差分操作来创建新几何体,可以使用,其中有,可以使用不同的布尔运算。也可以通过单击“多边形-自定义”来输入自己的多边形。您可以使用SVG路径语法输入它们(仅允许MoveTo:s和LineTo:s)。还有一个多边形资源管理器,您可以在其中查看操作结果。也可以将输出视为SVG路径。还有,其中有代码示例

主题(“多边形”)和剪辑(“剪辑”)多边形的示例:

主题多边形和剪辑多边形之间的布尔差异:
我不太确定您想要实现什么,但我可以看到两种可能性:A)绘制带孔的多边形或B)在两个多边形之间进行布尔差分运算

A) 用孔画多边形 缠绕顺序是关键。如果您有外部多边形(SVG路径),它是顺时针(CW)的,如下所示:

“M155,61.67 L155212.7 L288.98212.7 L288.98,61.67 L173.0199999998,61.67 L155,61.67Z”

以及逆时针方向(CCW)的孔多边形(SVG路径),如下所示:
“M274.37190.77 L171.24190.77 L171.24,81.16 L274.37,81.16 L274.37,81.16 L274.37190.77Z”

然后将它们组合到同一路径中:

“M155,61.67 L155212.7 L288.98212.7 L288.98,61.67 L173.0199999998,61.67 L155,61.67ZM274.37190.77 L171.24190.77 L171.24,81.16 L274.37,81.16 L274.37,81.16 L274.37,81.16 L274.37190.77Z”

将获得以下带孔的多边形:

在上图中,内部多边形似乎是从外部多边形中减去的

B) 在两个多边形之间进行布尔差分运算 如果要从另一个多边形剪切一个多边形,并通过在两个或多个多边形之间执行布尔差分操作来创建新几何体,可以使用,其中有,可以使用不同的布尔运算。也可以通过单击“多边形-自定义”来输入自己的多边形。您可以使用SVG路径语法输入它们(仅允许MoveTo:s和LineTo:s)。还有一个多边形资源管理器,您可以在其中查看操作结果。也可以将输出视为SVG路径。还有,其中有代码示例

主题(“多边形”)和剪辑(“剪辑”)多边形的示例:

主题多边形和剪辑多边形之间的布尔差异:

我想要的是B)布尔差。clipper看起来很有希望,谢谢。下面是您可能需要的一些信息:平坦化转换()和多边形化路径()。我已经做了一个开箱即用的解决方案,它结合了所有需要的东西,但这是一个相当复杂的解决方案。几周前出现了一个新的更好的解决方案,我正在研究中。这个解决方案确实有效,尽管不是在所有情况下都有效(我不知道为什么)。如果您将属性
fill rule=“evenodd”
添加到路径中,它将开始一致地运行(也就是说,它可以正常工作)。我要寻找的是B)布尔差异。clipper看起来很有希望,谢谢。下面是您可能需要的一些信息:平坦化转换()和多边形化路径()。我已经做了一个开箱即用的解决方案,它结合了所有需要的东西,但这是一个相当复杂的解决方案。几周前出现了一个新的更好的解决方案,我正在研究中。这个解决方案确实有效,尽管不是在所有情况下都有效(我不知道为什么)。如果将属性
fill rule=“evenodd”
添加到路径中,它将开始一致地运行(也就是说,它可以工作)。