【问题标题】:determine if CGpath/CGcontext intersect with CGpoint?确定 CGpath/CGcontext 是否与 CGpoint 相交?
【发布时间】:2014-02-24 18:52:31
【问题描述】:

我已经用谷歌搜索了一段时间,但我似乎没有找到一个好的答案。我只找到了一个关于路径交集的模板,但它有点太复杂了,并不是我想要的,因为我只需要一个返回 YES 或 NO 的 BOOL 的函数。

//This is my code so far. Its getting called every time the touch is moved.
 UIGraphicsBeginImageContext(CGSizeMake(320, 568));
    [drawImage.image drawInRect:CGRectMake(0, 0, 320, 568)];
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 8.0);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0, 1, 0, 1);
    CGContextBeginPath(UIGraphicsGetCurrentContext());
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), greentmporary.x, greentmporary.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), greenpoint1.x, greenpoint1.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());


    [drawImage setFrame:CGRectMake(0, 0, 320, 568)];
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [self.view addSubview:drawImage];

【问题讨论】:

  • 问题是什么?
  • 如何确定两条线的 cgcontextintersection。对不起,我应该更清楚
  • 一些数学怎么样? Line-line intersection (Wikipedia)
  • 我认为在这种情况下,仅使用基本数学很难确定。我需要类似this
  • 这一切都归结为(或多或少)基础数学;)

标签: iphone objective-c xcode cgcontext cgpath


【解决方案1】:

如果您正在查看线段是否相交。

您可以通过检查值是否属于区间来解决此问题。

您的线段(线)相交当且仅当 x 区间重叠,y 区间相互重叠。

A 线 - x 从 x1A 到 x2A - y 从 y1A 到 y2A B 行 - x 从 x1B 到 x2B - y 从 y1B 到 y2B

表示点为 (x1A, y1A) (x2A, y2A) 表示点是 (x1B, y1B) (x2B, y2B)

如果

(x1B ≤ x1A ≤ x2B 或 x1B ≤ x2A ≤ x2B )

( y1B ≤ y1A ≤ y2B 或 y1B ≤ y2A ≤ y2B )

如果您寻找由一组线段组成的路径的交集,您可以简单地遍历路径 A 的所有线段,并检查是否与 B 的其中一个线段相交。时间复杂度将是二次的,并且然后无法扩展到大路径。

但是在第一种蛮力方法之后,您可以尝试减少问题,例如,仅对与 2 个路径边界框的交点相交的线段应用搜索(意味着其中至少有一个点)。找到边界框相当于搜索点的 x 和 y 的最小值和最大值。

【讨论】:

  • 正如我之前所说,它不仅仅是两行,它的多行放在一个 CGcontext 中。
  • 嗯,好的。那就有点复杂了。让一点时间。
  • 这可能会导致内存泄漏,因为这条线可能是由数百万个 cgpoint 组成的。
  • 哦,我明白了。内存在这里不是问题,但计算时间将是一个问题。但这也取决于边界框重叠的程度。它们重叠的越少,您需要考虑的点就越少。
  • 找到了一些有用的东西 if (CGPathContainsPoint(, , , )) { }
猜你喜欢
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多