【问题标题】:Line clipping to arbitary 2D polygon线剪裁到任意二维多边形
【发布时间】:2011-04-25 20:05:47
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: algorithm graphics geometry numeric


    【解决方案1】:

    您的问题确实没有简单的解决方案,尤其是曲线(贝塞尔曲线和样条曲线)。除了多边形剪裁的复杂性之外,重构剪裁曲线也面临着相当大的挑战(假设您希望剪裁结果保持为贝塞尔曲线和样条曲线,而不仅仅是“扁平”线近似)。

    我最近发布了我的多边形裁剪库“Clipper”的 beta 更新*,它确实可以进行线-多边形和线-线裁剪(其中线也可以是曲线)。然而,虽然主库是用 Delphi、C++ 和 C# 编写的,但新的 beta 代码到目前为止只在 Delphi 中,这可能对您没有帮助。不过,如果您查看代码,您就会明白为什么我说没有“简单”的解决方案。

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

    【讨论】:

    • 谢谢。您使用哪种方法进行曲线裁剪?
    • 我最初采用的方法是使曲线变平(并标记每个变平的段),因为剪裁算法仅适用于线条。一旦找到交叉点,标记的线段将用于识别曲线子线段(de Casteljau 算法)。然后将 de Casteljau 算法重新应用于原始曲线,但仅限于包含交叉点的曲线部分。这有意义吗?
    • 我很想看到这个功能(特别是线多边形裁剪)添加到裁剪器库(包括 C# 翻译)中。
    • 您好,这个算法包含在您最新版本的 Clipper 中吗?
    • 是的,并且带有 C# 演示。但是,它目前正在进行重大修订,因此希望在下一次 Clipper 更新中有所改变。
    【解决方案2】:
    • 第一步:找到所有交点 点,以任何顺序。对于多边形, 你需要找到红色的交点 每段的线和线。只需求解两个线性方程组。如果解决方案受限于多边形段限制,您 有一个路口。
    • 第二步:对找到的点进行排序 红线上的位置。你知道第一个和最后一个点是外部的。 “外部性”随着每个点翻转 - 外-内-外等等。在两个相邻的外部点之间,您有内部线段(绿色)。编辑:不正确...从点 #0 开始,段 #0 - #1 是内部,下一个是外部,下一个是内部,依此类推。

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

    【讨论】:

    • 也许我需要给出一个复杂的多边形。
    • 如何对它们进行排序。很难找到我认为的进/出关系。交点列表取决于多边形边缘。
    • 如何排序?找到坐标最低的点,并按到该点的距离对所有其他点进行排序。
    • 谢谢。是否有与此问题相关的参考资料?
    • 你需要小心这种方法,就好像直线与多边形的一个顶点相交一样,你会看到两个你真正期望的点。由于浮点不精确,它们的值也可能不完全相同。
    猜你喜欢
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 2011-09-08
    • 2013-10-06
    • 2015-10-01
    • 1970-01-01
    相关资源
    最近更新 更多