Jak ustalić, po której stronie linii znajduje się element wielokąta?

9

Mam dane działki przecinające dane linii. W danych paczki znajduje się kilka paczek, które nie przecinają linii. Jak mogę programowo dowiedzieć się, czy nie przecinająca się paczka znajduje się po prawej lub lewej stronie linii? Dzięki.

Justin
źródło

Odpowiedzi:

8

Użyj interfejsu IHitTest . Punktem zapytania będzie centroid wielokąta, a geometrią wejściową będzie linia. Jedno z wyjść będzie logiczne (bRightSide), które powie ci, po której stronie linii jesteś.

SeaJunk
źródło
2

Możesz do tego użyć produktu kropkowego

/// <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
źródło
1
Myślę, że warto zauważyć, że ta technika wymaga, aby linia wejściowa była linią złożoną tylko z 2 wierzchołków, ponieważ akceptuje obiekt ISegment.
Hornbydd,
Działa to dobrze dla właściwej linii euklidesowej (całość, nie tylko segment lub promień), ale jestem prawie pewien, że OP użył „linii” i „danych linii” jako luźnych synonimów dla polilinii, w których podejście do kropki zawodzi .
whuber
2

Algorytm uzyskania pożądanego wyniku:

  1. Skup się na linii
  2. Dodaj bufor (0,0000005) po prawej (lub lewej) stronie geometrii linii.
  3. Sprawdź, czy geometria zderzaka jest „wewnątrz” geometrii wielokąta, czy „nakłada się” z geometrią wielokąta.
Virender Jain
źródło