¿Cómo determinar en qué lado de una línea cae una entidad poligonal?


9

Tengo datos de parcela que cruzan datos de línea. En los datos de la parcela hay algunas parcelas que no se cruzan con la línea. ¿Cómo podría determinar programáticamente si la parcela que no se cruza está en el lado derecho o en el lado izquierdo de la línea? Gracias.

Respuestas:


8

Use la interfaz IHitTest . Su punto de consulta será el centroide del polígono y la geometría de entrada será la línea. Una de las salidas será un booleano (bRightSide) que le dirá en qué lado de la línea se encuentra.


2

Puedes usar el producto punto para esto

/// <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
Creo que vale la pena señalar que esta técnica requiere que la línea de entrada sea una línea compuesta de solo 2 vértices, ya que acepta un objeto ISegment.
Hornbydd

Esto funciona bien para una línea euclidiana adecuada (todo, no solo un segmento o rayo), pero estoy bastante seguro de que el OP usó "línea" y "datos de línea" como sinónimos sueltos de polilíneas, donde el enfoque del producto de puntos falla .
whuber

2

Algoritmo para obtener el resultado deseado:

  1. Toma la línea en foco
  2. Agregue un poco de búfer (0.0000005) en el lado derecho (o izquierdo) de la geometría de línea.
  3. Compruebe si la geometría del búfer está 'dentro' de la geometría del polígono o 'superposición' con la geometría del polígono.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.