4

ポイントが2つのポイントを含む指定されたライン上にあるかどうかを確認するには、次のチェックを行います。

-(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 句はある意味では無効です。

4

4 に答える 4

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;
于 2012-10-23T22:32:04.177 に答える
2

@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));
}
于 2015-01-20T17:55:21.277 に答える
2

私はあなたのコードを注意深く読んでいないので、あなたが何をしているのか完全にはわかりませんが、この操作を行う最も簡単な方法は、線の一方の端から点までの距離を見つけ、もう一方の端の距離を見つけることです線の終点から点までの距離を足し、線の長さと比較します。

何かのようなもの:

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 がそれを提供していると推測していますが、そうでない場合は基本的な三角法です。

于 2012-10-16T20:28:49.983 に答える
1

機能しない理由の説明は、2 つの三角形の角度のタンジェントを比較しているためです。コメントと変数名にもかかわらず、距離をまったく計算していません。

角度が 90 度に近づくと、接線の大きさが急速に増加し、90 度で無限大に達します。0.0000190 度では、x 座標の差はゼロになり、それを回避するために定数を追加しない場合、ゼロ除算エラーが発生します。90 に近い 2 つの接線の相対的な差は小さいかもしれませんが、角度が非常に近い場合でも絶対的な< 0.5差が大きくなる可能性があるため、テストは失敗します。

したがって、別のアプローチが必要です。1 つは、点から 2 つの終点までの距離と線自体の長さを計算して比較することです。点からの 2 つの距離の合計が線の長さよりも大きい場合、3 つの点は三角形を形成します。 、そうでない場合、それらは共線的です。(合計が少ない場合は、別の次元に滑り込んでいます...)。

ピタゴラスを使用して線の長さを計算できます: sqrt((x1 - x2)^2 + (y1 - y2)^2)。

于 2012-10-16T20:50:36.650 に答える