Bir poligon özelliğinin bir çizginin hangi tarafına düştüğü nasıl belirlenir?


9

Satır verileriyle kesişen parsel verilerim var. Parsel verilerinde, çizgiyle kesişmeyen bazı parseller vardır. Kesişmeyen parselin çizginin Sağ tarafında mı yoksa Sol tarafında mı olduğunu programatik olarak nasıl anlayabilirim? Teşekkürler.

Yanıtlar:


8

IHitTest arayüzünü kullanın . Sorgu noktanız çokgen sentroidi ve giriş geometrisi çizgi olacaktır. Çıkışlardan biri, hattın hangi tarafında olduğunuzu söyleyen bir boolean (bRightSide) olacaktır.


2

Bunun için nokta ürünü kullanabilirsiniz

/// <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
Bu tekniğin bir ISegment nesnesini kabul ettiği için giriş hattının sadece 2 köşeden oluşan bir çizgi olmasını gerektirdiğini belirtmek gerekir.
Hornbydd

Bu uygun bir Öklid hattı için iyi çalışır (sadece bir segment veya ışın değil, her şey), ancak OP'nin nokta ürün yaklaşımının başarısız olduğu polienler için gevşek eşanlamlılar olarak "satır" ve "satır verileri" kullandığından eminim .
whuber

2

İstenilen sonucu almak için algoritma:

  1. Çizgiyi odaklayın
  2. Çizgi geometrisinin Sağ (veya Sol) tarafına bir miktar tampon (0.0000005) ekleyin.
  3. Arabellek geometrisinin Çokgen geometrisinin 'İçinde' veya Çokgen geometrisinde 'Çakışma' olup olmadığını kontrol edin.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.