结合iOS上相交CGPaths(Combining Intersecting CGPaths on

2019-07-29 12:22发布

我有一个应用程序,我工作的一个问题。 说我有两个CGPaths是相当复杂的,我他们俩添加到CGMutablePath(从而将它们结合起来)。 那么,这里的两条路径相交会有彼此的内点。 我想消除这些内部点,基本上绘制路径外或轮廓。 我有困难搞清楚我怎么会去这一点。

编辑:这就是我所说的例子。 蓝色和红色的方框表示沿着CGPaths点。 红色框是都道内的点。 我想以某种方式消除红点,并重新绘制路径的只是轮廓。

Answer 1:

你所描述的是路径内部的工会。

如果你的路径包含的曲线,这是一个很难的问题。

然而,你的例子只显示直线段,所以我会认为你只在乎那仅仅包含直线段的路径。

在这种情况下,你想有一个多边形工会功能。 这个排序算法的是被称为“计算几何”领域非常基本的。 我不知道多边形联盟任何的Objective-C-具体实施。 你也许可以找到一个纯粹的C库,但它更容易找到一个C ++库。 您可以使用C ++,如果你从改变你的文件扩展名.m.mm 。 下面是可以计算多边形的联合一些C ++库:

  • 限幅器
  • GEOS -看到Polygon::Union
  • CGAL -看2D正则布尔集合的操作
  • 提高几何-见union_

请注意,在任何情况下,你需要使用CGPathApply解压路径中的顶点,如果你不已经有他们在另一种格式。



Answer 2:

多边形问题经典点。 删除在每个返回1引用其他多边形多边形所有点:

int pnpoly(int npol, float *xp, float *yp, float x, float y)
{
  int i, j, c = 0;
  for (i = 0, j = npol-1; i < npol; j = i++) {
    if ((((yp[i] <= y) && (y < yp[j])) ||
         ((yp[j] <= y) && (y < yp[i]))) &&
        (x < (xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i]) + xp[i]))
      c = !c;
  }
  return c;
}

使用已删除的点结合的两条路径。

整个过程伪代码:

define starPoly with 10 points
define simplePoly with 7 points

for each point in starPoly
    if ( pnpoly( 7, simplePoly.Xs[], simplePoly.Ys[], point.x, point.y ) == 0 )
        clipedStarPoly += point;

for each point in simplePoly
    if ( pnpoly( 10, starPoly.Xs[], starPoly.Ys[], point.x, point.y ) == 0 )
        clipedSimplePoly += point;

for each point in clipedStarPoly
    solutionPoly += point;

for each point in clipedSimplePoly
    solutionPoly += point;

solutionPoly += solutionPoly.point[0]

如果你不认为你将与裁剪多边形,你可以简单地直接生成解决方案多出点测试的终端玩。

您可能需要使用光线追踪在聚测试点,尝试寻找在这个页面



Answer 3:

使用CGPathAddPath 。 超级好用。



Answer 4:

这是不够的,只是工会两组点。 为了确定组合的多边形,你需要做到以下几点。 对不起,我只有伪代码,我才刚刚开始看这个问题。

我们将考虑两个多边形是A和B.不要紧,哪个是哪个。

  • 左右移动多边形A寻找那不是多边形B.内部的任何点
  • 这一点添加到多边形。
  • 继续围绕多边形,测试和添加依次在每个点。
  • 当你发现多边形B里面是一个点,看看它和前一个点之间的连线。
  • 找出哪些行多边形B与这条线相交。
  • 确定这两条线之间的交叉点,并把它添加到多边形。
  • 确定哪个定义属于多边形B的交线的两个点的是NOT内部多边形A和添加到新的多边形。
  • 确定需要以使下一个点不会对交线的另一端的一个,并将其添加到哪个方向走周围的多边形B。
  • 从3重复,除了使用多边形B代替多边形A的
  • 继续走,直到你开始,多边形之间交换必要的点。

请注意,此解决方案仅适用于直边的多边形可以接受的。 其中一个贝塞尔路径而言,它变得更大量难以计算交叉点,更不用说光滑拐角带尖角,或曲线与直线段相结合的复杂性。



文章来源: Combining Intersecting CGPaths on iOS