Objective c 查找点靠近直线并位于直线端点之间

Objective c 查找点靠近直线并位于直线端点之间,objective-c,xcode,algorithm,line,point,Objective C,Xcode,Algorithm,Line,Point,要确定该点是否位于包含两个点的指定线上,请执行以下检查: -(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.

要确定该点是否位于包含两个点的指定线上,请执行以下检查:

-(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;  
    }
}
-(布尔)等值线:(行*)线点:(CGPoint)点{
//如果在两点之间:
如果(((line.first.x=line.last.x))&((line.first.y=line.last.y)){
//计算距离:
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(@“距离到线:%f”,工厂(距离));

return fabs(dist)我没有仔细阅读您的代码,因此我不能完全确定您在做什么,但仅供参考,执行此操作最简单的方法是找到直线一端到点的距离,找到直线另一端到点的距离,然后将这些距离相加,并与直线长度进行比较

比如:

Boolean isOnLine(line, point) {
  var dist1 = dist(line.first, point)
  var dist2 = dist(line.last, point)
  return abs(line.length - (dist1 + dist2)) < .5
}
布尔等值线(线、点){
var dist1=距离(第一行,点)
var dist2=距离(最后一行,点)
返回abs(线长度-(距离1+距离2))<.5
}

对于dist()函数,我猜CoreGraphics提供了这一点,但如果没有,它只是基本的三角函数。

为什么它不起作用的解释是,您正在比较两个三角形的角度的切线-尽管有注释和变量名,您根本没有计算距离

现在,当角度接近90度时,切线的大小迅速增加,直到它在90度处达到无穷大。在90度处,x坐标的差值为零,最终会出现被零除的误差,在这里不需要加上
0.00001
常数来避免它。而en靠近90的两条切线可能很小,即使角度非常近,绝对差值也可能很大,因此
<0.5
测试失败

所以你需要另一种方法。一种是计算从点到两个端点的距离,以及直线本身的长度,然后比较——如果从点到点的两个距离之和大于直线的长度,三个点形成一个三角形,如果不是,它们是共线的。(如果总和较小,则进入另一个维度…)


您可以使用毕达哥拉斯:sqrt((x1-x2)^2+(y1-y2)^2)计算线的长度。

以下是我对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;
返回abs([行长度]-
(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));
}
-(BOOL)isPoint:(CGPoint)原点靠近直线段点a:(CGPoint)点a点b:(CGPoint)点b带marginOfError:(CGFloat)marginOfError{
CGFloat distanceAP=[点之间的自距离:原点B:pointA];
CGFloat distanceBP=[INTA:原点B:点B之间的自距离];
CGFloat distanceAB=[点A点B点B点B之间的自距离];
if(fabsf(距离AB-距离AP-距离BP)
简单想想,您是否想过扭转问题,即如果ydiff>xdiff交换x和y?