线裁剪到任意2D多边形

时间:2010-10-15 08:39:14

标签: algorithm graphics geometry numeric

如果我得到的线段长度足以穿过给定的多边形,可能是凹多边形或凸多边形。我如何找到多边形中包含的所有相交的光段?

alt text

如果目标区域不是多边形,而是隐式曲线函数或样条曲线,该怎么做?

谢谢!

2 个答案:

答案 0 :(得分:5)

对于您的问题,确实没有一个简单的解决方案,尤其是曲线(贝塞尔曲线和样条曲线)。除了多边形裁剪的复杂性之外,重建裁剪曲线还有相当大的挑战(假设您希望裁剪结果保留为贝塞尔曲线和样条曲线而不仅仅是'扁平'线近似值。)

我最近向我的多边形裁剪库'Clipper'发布了beta更新*,它做了线多边形和线条裁剪(线条也可以是曲线)。然而,虽然主库是用Delphi编写的,但C ++& C#,新的测试版代码到目前为止只在Delphi中可能对您没有帮助。然而,如果你看一下代码,你就会明白为什么我说没有“简单”的解决方案。

  • 编辑2011年7月15日: 这个“更新”从未超出此beta版本,现在只是“概念验证”。它现在基于我的Clipper库的旧版本,需要进行重大改写才能维护和扩展。 (在某个阶段我可能会重新审视它,但我目前正打算进一步改进核心库。)尽管如此,这个“概念验证”Delphi代码可以下载here

Clipper demo image

答案 1 :(得分:3)

  • 第一步:找到所有路口 点数,任何顺序。对于多边形, 你需要找到红色的交叉点 每个部分的线和线。只需求解两个线性方程组。如果解决方案受限于多边形线段限制,则为您 有一个十字路口。
  • 第二步:对找到的点进行排序 在红线上的位置。你知道第一点和最后一点都是外面的。 “Outerness”随着每个点翻转 - 外 - 内 - 外等等。在两个相邻的外部点之间,您有内部线段(绿色)。编辑:不正确...从点#0开始,段#0 - #1是内部,下一个是外部,下一个是内部,依此类推。

如果region不是多边形,而是由一些隐式函数给出,则需要找到该函数等于红线的位置(当然,方法取决于函数)。

相关问题