Wie kann man bestimmen, auf welche Seite einer Linie ein Polygon-Feature fällt?

9

Ich habe Paketdaten, die Liniendaten schneiden. In den Paketdaten gibt es einige Pakete, die die Linie nicht schneiden. Wie kann ich programmgesteuert herausfinden, ob sich das nicht schneidende Paket auf der rechten oder der linken Seite der Linie befindet? Vielen Dank.

Justin
quelle

Antworten:

8

Verwenden Sie die IHitTest- Schnittstelle. Ihr Abfragepunkt ist der Polygonschwerpunkt und die Eingabegeometrie ist die Linie. Eine der Ausgaben ist ein Boolescher Wert (bRightSide), der Ihnen sagt, auf welcher Seite der Linie Sie sich befinden.

SeaJunk
quelle
2

Hierfür können Sie das Punktprodukt verwenden

/// <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
quelle
1
Ich denke, es ist erwähnenswert, dass diese Technik erfordert, dass die Eingabezeile eine Linie ist, die nur aus 2 Eckpunkten besteht, da sie ein ISegment-Objekt akzeptiert.
Hornbydd
Dies funktioniert gut für eine richtige euklidische Linie (das Ganze, nicht nur ein Segment oder ein Strahl), aber ich bin mir ziemlich sicher, dass das OP "Linie" und "Liniendaten" als lose Synonyme für Polylinien verwendet hat, bei denen der Punktproduktansatz fehlschlägt .
whuber
2

Algorithmus, um das gewünschte Ergebnis zu erhalten:

  1. Nehmen Sie die Linie in den Fokus
  2. Fügen Sie einen Puffer (0,0000005) auf der rechten (oder linken) Seite der Liniengeometrie hinzu.
  3. Überprüfen Sie, ob sich die Puffergeometrie innerhalb der Polygongeometrie oder innerhalb der Polygongeometrie befindet.
Virender Jain
quelle