“包含贝塞尔曲线的相邻折线”的联合

时间:2012-03-14 17:44:08

标签: algorithm core-graphics computational-geometry

具体示例:拍摄欧洲国家地图,以及“代表欧盟国家的路径”的指针列表,并输出单个“代表欧盟的路径”。

e.g。如果我有三个输入路径:红色,绿色和蓝色。

  1. 红色仅由直线段组成
  2. 绿色由线段和beziers组成
  3. 蓝色仅由贝塞尔人制作
  4. ...然后我需要创建一个输出折线 - 带有beziers,它是三个对象的并集。

    另外,我需要处理输入数据中的一些误差范围 - c.f.下面的图像在输入形状之间存在一些非常小的“间隙”。在图像中,底部图形(红色)是所需的输出。

    enter image description here

    这可能很容易出错,并且需要数周的时间才能使其无法正常工作。我试图找到一个可能“足够好”的相对简单的方法,但我目前仍坚持:

    1. 你怎么开始加入Beziers?
    2. 处理“差距”/错误边际的聪明方法是什么 - 我确信简单地舍入我的浮动坐标会有一些狡猾的事情 - 但我看不到它:(
    3. 最后......目标平台是iPhone - 所以我可以访问所有Apple的Quartz / QuartzCore / CoreAnimation /等。它提供了一些实用程序方法 - 但请注意:即使是Apple的官方基础知识的实现,例如“路径A是否与路径B相交?”在很多情况下都非常严重/不正确 - 所以它不太可靠:(。

2 个答案:

答案 0 :(得分:0)

IDEA如何实现这一目标(也许) - 但我不知道该怎么做:

也许......改为计算“内部线条”,然后移除它们,给我留下几乎正确的东西,作为“描述联合的路径”。

我的示例Blue对象可能是非常严重的错误,交叉点可能会产生一个非常错误的曲线 - 但它可能已经足够好了。

要做到这一点,我想,也许是:

  1. 取每个形状的凸包
  2. 船体中与其他船体重叠的任何线段 ......均为“内部”
  3. ...读回原始形状中创​​建每个船体线段的点(或者被该段无效)......这些点是“联盟的内部”

答案 1 :(得分:0)

首先,您需要知道如何组合多边形形状。我假设你知道,如果不是,你必须先学习它。

现在你可以测试你的曲线,找到多边形的联合,并将原始曲线的部分装回到联合中。您需要稍微调整交点,从直线交点到曲线交点,但调整量很小,您可以使用简单的迭代近似算法找到它们。

要处理错误,请在联合之前将多边形偏移一个有效数量,并在拟合曲线之前将结果偏移一个负值。

抱歉,此手机无法输入更多内容:-(