我已经搜索了一段时间,我似乎没有找到一个好的答案。我只找到了一个关于路径交集的模板,但它有点太复杂而且不是我正在寻找的,因为我只需要一个返回BOOL的函数是YES或NO。
//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];
答案 0 :(得分:0)
如果你看到哪些片段相交或不相交。
您可以通过检查值是否属于间隔来解决此问题。
您的细分(线)相交,当且仅当 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)
AND
(y1B≤y1A≤y2B或y1B≤y2A≤y2B)
如果您查找由一组段构成的路径的交集,您可以简单地遍历路径A的所有段并检查是否存在与B的一个段的交集。时间复杂度将是二次的并且然后无法扩展到大路径。
但是在第一次蛮力逼近之后,您可以尝试减少问题,例如,仅对与2个路径边界框的交叉点相交的线段进行搜索(在其中至少有一个点的平均值)。查找边界框相当于搜索点的x和y的最小值和最大值。