Come determinare da quale lato di una linea cade una funzione poligonale?


9

Ho i dati dei pacchi che si intersecano con i dati della linea. Nei dati dei pacchi ci sono alcuni pacchi che non intersecano la linea. Come potrei capire programmaticamente se il pacco non intersecante si trova sul lato destro o sul lato sinistro della linea? Grazie.

Risposte:


8

Utilizzare l' interfaccia IHitTest . Il punto di query sarà il centroide del poligono e la geometria di input sarà la linea. Una delle uscite sarà un valore booleano (bRightSide) che ti dirà da quale parte della linea ti trovi.


2

È possibile utilizzare il prodotto punto per questo

/// <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
Penso che valga la pena sottolineare che questa tecnica richiede che la linea di input sia una linea composta da soli 2 vertici in quanto accetta un oggetto ISegment.
Hornbydd,

Questo funziona bene per una corretta linea euclidea (il tutto, non solo un segmento o raggio), ma sono abbastanza sicuro che l'OP ha usato "linea" e "dati di linea" come sinonimi allentati per le polilinee, in cui l'approccio del punto prodotto non riesce .
whuber

2

Algoritmo per ottenere il risultato desiderato:

  1. Metti a fuoco la linea
  2. Aggiungi un po 'di buffer (0,0000005) sul lato destro (o sinistro) della geometria Linea.
  3. Verifica se la geometria del buffer è "All'interno" della geometria Poligono o "Sovrapposizione" con la geometria Poligono.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.