Bagaimana menentukan di sisi mana garis fitur poligon jatuh?

9

Saya memiliki data paket yang memotong data garis. Dalam data paket ada beberapa paket yang tidak memotong garis. Bagaimana saya bisa mengetahui secara terprogram apakah parsel yang tidak berpotongan berada di sisi kanan atau kiri garis? Terima kasih.

Justin
sumber

Jawaban:

8

Gunakan antarmuka IHitTest . Titik kueri Anda akan menjadi poligon sentroid dan geometri input akan menjadi garis. Salah satu output akan menjadi boolean (bRightSide) yang akan memberi tahu Anda di sisi mana Anda berada.

SeaJunk
sumber
2

Anda dapat menggunakan produk titik untuk ini

/// <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;
    }
nef001
sumber
1
Saya pikir itu layak menunjukkan bahwa teknik ini membutuhkan jalur input menjadi garis yang terdiri dari hanya 2 simpul karena menerima objek ISegment.
Hornbydd
Ini berfungsi dengan baik untuk garis Euclidean yang tepat (semuanya, bukan hanya segmen atau ray), tapi saya cukup yakin OP menggunakan "garis" dan "data garis" sebagai sinonim longgar untuk polyline, di mana pendekatan titik produk gagal .
whuber
2

Algoritma untuk mendapatkan hasil yang diinginkan:

  1. Ambil Garis dalam fokus
  2. Tambahkan beberapa buffer (0,0000005) di sisi Kanan (atau Kiri) geometri Garis.
  3. Periksa apakah penyangga geometri adalah 'Di dalam' geometri Polygon atau 'Overlap' dengan geometri Polygon.
Virender Jain
sumber