Como determinar em qual lado de uma linha um recurso de polígono cai?

9

Tenho dados de parcelas que cruzam os dados da linha. Nos dados do pacote, existem alguns que não cruzam a linha. Como eu poderia descobrir programaticamente se a parcela que não se cruza está no lado direito ou no lado esquerdo da linha? Obrigado.

Justin
fonte

Respostas:

8

Use a interface IHitTest . Seu ponto de consulta será o centróide do polígono e a geometria de entrada será a linha. Uma das saídas será um booleano (bRightSide), que informará em que lado da linha você está.

SeaJunk
fonte
2

Você pode usar o produto escalar para este

/// <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
fonte
11
Eu acho que vale ressaltar que essa técnica exige que a linha de entrada seja uma linha composta por apenas 2 vértices, pois está aceitando um objeto ISegment.
Hornbydd
Isso funciona bem para uma linha euclidiana adequada (a coisa toda, não apenas um segmento ou raio), mas tenho certeza de que o OP usou "line" e "line data" como sinônimos frouxos para polilinhas, onde a abordagem do produto com ponto falha .
whuber
2

Algoritmo para obter o resultado desejado:

  1. Pegue a linha em foco
  2. Adicione um pouco de buffer (0,0000005) no lado direito (ou esquerdo) da geometria da linha.
  3. Verifique se a geometria do buffer está 'Dentro' da geometria do polígono ou 'Sobrepor' com a geometria do polígono.
Virender Jain
fonte