我有一个应用程序,我工作的一个问题。 说我有两个CGPaths是相当复杂的,我他们俩添加到CGMutablePath(从而将它们结合起来)。 那么,这里的两条路径相交会有彼此的内点。 我想消除这些内部点,基本上绘制路径外或轮廓。 我有困难搞清楚我怎么会去这一点。
编辑:这就是我所说的例子。 蓝色和红色的方框表示沿着CGPaths点。 红色框是都道内的点。 我想以某种方式消除红点,并重新绘制路径的只是轮廓。
我有一个应用程序,我工作的一个问题。 说我有两个CGPaths是相当复杂的,我他们俩添加到CGMutablePath(从而将它们结合起来)。 那么,这里的两条路径相交会有彼此的内点。 我想消除这些内部点,基本上绘制路径外或轮廓。 我有困难搞清楚我怎么会去这一点。
编辑:这就是我所说的例子。 蓝色和红色的方框表示沿着CGPaths点。 红色框是都道内的点。 我想以某种方式消除红点,并重新绘制路径的只是轮廓。
你所描述的是路径内部的工会。
如果你的路径包含的曲线,这是一个很难的问题。
然而,你的例子只显示直线段,所以我会认为你只在乎那仅仅包含直线段的路径。
在这种情况下,你想有一个多边形工会功能。 这个排序算法的是被称为“计算几何”领域非常基本的。 我不知道多边形联盟任何的Objective-C-具体实施。 你也许可以找到一个纯粹的C库,但它更容易找到一个C ++库。 您可以使用C ++,如果你从改变你的文件扩展名.m
到.mm
。 下面是可以计算多边形的联合一些C ++库:
Polygon::Union
union_
请注意,在任何情况下,你需要使用CGPathApply
解压路径中的顶点,如果你不已经有他们在另一种格式。
多边形问题经典点。 删除在每个返回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]
如果你不认为你将与裁剪多边形,你可以简单地直接生成解决方案多出点测试的终端玩。
您可能需要使用光线追踪在聚测试点,尝试寻找在这个页面
使用CGPathAddPath 。 超级好用。
这是不够的,只是工会两组点。 为了确定组合的多边形,你需要做到以下几点。 对不起,我只有伪代码,我才刚刚开始看这个问题。
我们将考虑两个多边形是A和B.不要紧,哪个是哪个。
请注意,此解决方案仅适用于直边的多边形可以接受的。 其中一个贝塞尔路径而言,它变得更大量难以计算交叉点,更不用说光滑拐角带尖角,或曲线与直线段相结合的复杂性。