ポリゴンフィーチャがラインのどちら側にあるかを判断する方法は?


9

パーセルデータとラインデータが交差しています。パーセルデータには、ラインと交差しないパーセルがいくつかあります。交差していない区画がラインの右側にあるか左側にあるかをプログラムで把握するにはどうすればよいですか?ありがとう。

回答:


8

IHitTestインターフェイスを使用します。クエリポイントはポリゴンの重心で、入力ジオメトリはラインになります。出力の1つはブール値(bRightSide)で、線のどちら側にいるかを示します。


2

これにはドット積を使用できます

/// <summary>
/// Used to indicate the orientation of an object in space 
/// with respect to another object
/// </summary>
public enum OrientationType
{
    Left,
    Right,
    Coincident,
    Unknown
}


/// <summary>
    /// Determines if a point is oriented left, right or coincident with
    /// a directed line. 
    /// Line direction is determined by its From and To points.
    /// </summary>
    /// <param name="p">The point to test.</param>
    /// <param name="segment">The line dividing the space</param>
    /// <returns>An OrientationType indicating the orientation.</returns>
    public static OrientationType GetPointOrientation(IPoint p, ISegment segment)
    {

        OrientationType result = OrientationType.Unknown;

        double Ax = segment.FromPoint.X;
        double Ay = segment.FromPoint.Y;
        double Bx = segment.ToPoint.X;
        double By = segment.ToPoint.Y;
        double Px = p.X;
        double Py = p.Y;

        double nDotV = ((Ay - By) * (Px - Ax)) + ((Bx - Ax) * (Py - Ay));

        if (nDotV < 0)
        {
            result = OrientationType.Right;//opposite direction to normal vector
        }
        else if (nDotV > 0)
        {
            result = OrientationType.Left;
        }
        else if (nDotV == 0)
        {
            result = OrientationType.Coincident;
        }

        return result;
    }

1
このテクニックでは、ISegmentオブジェクトを受け入れるため、入力ラインが2つの頂点のみで構成されるラインである必要があることを指摘する価値があると思います。
Hornbydd

これは適切なユークリッド線(セグメントや光線だけでなく全体)に対してはうまく機能しますが、OPが「線」と「線データ」をポリラインの緩やかな同義語として使用しており、ドット積アプローチが失敗していると確信しています。 。
whuber

2

望ましい結果を得るためのアルゴリズム:

  1. ラインに焦点を合わせる
  2. Lineジオメトリの右側(または左側)にバッファ(0.0000005)を追加します。
  3. バッファジオメトリがポリゴンジオメトリの「内側」にあるか、ポリゴンジオメトリと「オーバーラップ」しているかどうかを確認します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.