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.

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ś.


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;
    }

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.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.