Geometry 如何确定非零填充多边形的边是否为外侧边?

Geometry 如何确定非零填充多边形的边是否为外侧边?,geometry,Geometry,假设我有一个多边形,我已经计算了它的所有自交点。如何根据非零填充规则确定特定边是在内侧还是在外侧?“外边缘”是指位于填充区域和非填充区域之间的边缘 例如: 左侧是一个多边形示例,根据非零填充规则填充。右侧是同一个多边形,其外部边缘以红色高亮显示。我正在寻找一种算法,给定多边形的边及其相互的交点,可以将每条边标记为外部或内部 优选地,该解决方案应推广到由例如贝塞尔曲线组成的路径 [编辑]还要考虑两个示例: 我注意到,封闭在形状中的“外边缘”必须穿过偶数个交点才能到达外部。封闭的“非外侧边”必须穿

假设我有一个多边形,我已经计算了它的所有自交点。如何根据非零填充规则确定特定边是在内侧还是在外侧?“外边缘”是指位于填充区域和非填充区域之间的边缘

例如:

左侧是一个多边形示例,根据非零填充规则填充。右侧是同一个多边形,其外部边缘以红色高亮显示。我正在寻找一种算法,给定多边形的边及其相互的交点,可以将每条边标记为外部或内部

优选地,该解决方案应推广到由例如贝塞尔曲线组成的路径

[编辑]还要考虑两个示例:

我注意到,封闭在形状中的“外边缘”必须穿过偶数个交点才能到达外部。封闭的“非外侧边”必须穿过奇数个交点

你可以试试这样的算法

isOutside = true
edge = find first outside edge*
edge.IsOutside = isOutside
while (not got back to start) {
  edge = next
  if (gone over intersection)
    isOutside = !isOutside
  edge.IsOutside = isOutside
}
例如:


*我认为,通过依次尝试每条线,你总能找到一条外部边缘:尝试无限延伸它——如果它没有穿过另一条线,那么它应该在外部。直觉上这似乎是正确的,但我想知道是否有一些病理情况下,你无法找到一个起点使用这一规则。使用这种查找第一条直线的方法不适用于曲线

我想,你的问题可以分两步解决

  • 使用支持自交多边形的算法对源多边形进行三角剖分。好的开始是。链接PDF文档的第5.2节描述了自相交多边形

  • 使用支持孔的算法将三角形合并为单个多边形,即。这个算法可以用于剪辑和合并,所以你需要它的“合并”情况。也许你可以简化算法,因为第一步的三角形是不相交的


  • 我意识到这可以用一种相当简单的方法来确定,只需对计算绕组数的标准例程稍加修改。这在概念上类似于评估目标边左侧和右侧的绕组。以下是任意曲线的算法,而不仅仅是直线段:

  • 在目标线段上拾取一个点。确保该点的Y导数不为零
  • 在目标线段导数的Y根处细分目标线段。在下一点中,忽略包含在步骤1中拾取的点的线段部分
  • 确定在1中拾取的点处的绕组编号。这可以通过在+X方向投射一条光线,并查看它的交点和方向来实现。导数Y分量为正的点处的交点计为+1。执行此操作时,忽略包含在步骤1中拾取的点的Y单调部分
  • 如果绕组编号为0,我们就完成了-这肯定是一个外边缘。如果它不是零并且不同于-1,0或1,我们就完成了-这绝对是一个内边
  • 在步骤1中拾取的点检查衍生工具。如果射线与该点的交点将计为-1,且在步骤3中获得的缠绕数为+1,则这是一条外边缘;与+1/-1情况类似。否则,这是一个内部边缘

  • 本质上,我们是在检查光线与目标线段的交点是否会改变零和非零之间的缠绕数。

    我建议,我认为您的解决方案的一个更简单的实现对我来说是可行的:

    1。选择目标线段上的任意点。(我任意选择中点。)

    2。从垂直于线段的点构造一条光线。(我对CW多边形使用左法线光线,对CCW多边形使用右法线光线。)

    3。计算光线与多边形的交点,忽略目标线段本身。此处可以选择非零缠绕规则[多边形线段向左交叉(CCW)时递减,向右交叉(CW)时递增;其中内侧边产生零计数]或偶数奇数规则[计算内侧边产生奇数的所有交叉点]。对于线段,交叉方向通过对其起点和终点进行简单的左或右测试来确定。对于圆弧和曲线,可以使用交叉点处的切线来确定,这是读者的练习

    我进行此分析的目的是将一个自相交多边形划分为一组等效的非自相交多边形。为此,在相反方向上分析光线并判断原始多边形是否填充在其中非常有用。这将导致segme两侧的内/外确定nt,产生四种可能的状态。我怀疑外部-外部状态可能仅对非闭合多边形有效,但对于此分析,可能需要暂时关闭它。具有相同状态的线段可以通过跟踪它们的共享交点收集到非相交多边形中。在某些情况下,例如使用纯填充时,您可以ht甚至决定将内部多边形消除为冗余多边形,因为它们填充了已填充的空间


    感谢您的原始解决方案!!

    如果某些形状有两个不相交的部分(例如)?应该只识别与形状相邻的边吗?在图片所示的情况下,所有边都是外部的,中间区域应该填充。观察到内部/外部状态在交点处的变化仅对该多边形有效。请参见我添加到问题中的示例。但是,这可能接近正确的如果考虑到相交线的方向,则ct解决方案(即,当参见