找到,如果该点位于包含两点我做以下检查指定行:
-(Boolean)isOnLine:(Line*) line point:(CGPoint) point{
//If between two dots:
if (((line.first.x <= point.x && point.x <= line.last.x)||(line.first.x >= point.x && point.x >= line.last.x))&&((line.first.y<=point.y && point.y<= line.last.y)||(line.first.y>=point.y && point.y>=line.last.y)) ) {
//Calculate distance:
double dist = (((double)point.y - line.first.y)) / (0.00001+((double)(point.x - line.first.x)))- ((double)(line.last.y - line.first.y)) / (0.00001+((double)(line.last.x - line.first.x)));
NSLog(@"Dist to line: %f", fabs(dist));
return fabs(dist) <0.5;
}else
return NO;
}
}
不知何故,但是,功能不与垂直线工作。 我的猜测是if从句在某种意义上是无效的。
我没有看到你的代码仔细,所以我不完全知道你在做什么,但FYI做此操作的最简单方法是找到行的点的一端的距离,发现对方的距离行至点的结束,然后添加这些距离,并比较该线的长度。
就像是:
Boolean isOnLine(line, point) {
var dist1 = dist(line.first, point)
var dist2 = dist(line.last, point)
return abs(line.length - (dist1 + dist2)) < .5
}
对于DIST()函数,我猜CoreGraphics中规定,但如果没有它只是基本的三角。
下面是我实现jhockings的解决方案
return abs([line length] -
(sqrt((line.first.x - point.x)*(line.first.x - point.x)
+ (line.first.y - point.y)*(line.first.y - point.y))
+ sqrt((line.last.x - point.x)*(line.last.x - point.x)
+ (line.last.y - point.y)*(line.last.y - point.y)))) < .5;
另一个(我)实现@jhocking解决方案:
- (BOOL)isPoint:(CGPoint)origin nearToLineSegmentPointA:(CGPoint)pointA pointB:(CGPoint)pointB withMarginOfError:(CGFloat)marginOfError {
CGFloat distanceAP = [self distanceBetweenPointA:origin pointB:pointA];
CGFloat distanceBP = [self distanceBetweenPointA:origin pointB:pointB];
CGFloat distanceAB = [self distanceBetweenPointA:pointA pointB:pointB];
if (fabsf(distanceAB - distanceAP - distanceBP) < marginOfError) {
return YES;
} else {
return NO;
}
}
- (CGFloat)distanceBetweenPointA:(CGPoint)pointA pointB:(CGPoint)pointB {
return sqrtf(powf((pointA.x - pointB.x), 2.f) + powf((pointA.y - pointB.y), 2.f));
}
为什么它不工作的解释是,你比较两个三角形的角的正切值 -你是不是计算距离可言,尽管意见和变量名。
现在,作为该角度接近90度,直到它以90度本身达到无穷大的切线的大小急剧增大。 在90度的X坐标差是零,你最终会得到一个除以零错误的地方不是在增加0.00001
不变,以避免它。 虽然近90两条切线之间的相对差异可能是小的绝对差甚至可以为非常接近的角度庞大的,所以你的< 0.5
测试失败。
所以,你需要另一种方法。 一个是计算从该点到两个端点的距离,和线路本身的长度,并比较 - 如果两个距离的从点之和大于所述线的长度较大的三个点形成三角形,如果不是,他们是共线的。 (如果总和少你已经滑落到备用尺寸...)。
就可以计算出使用Pythagorus的线的长度:SQRT((X1 - X2)^ 2 +(Y1 - Y2)^ 2)。