Comment déterminer de quel côté d'une ligne se situe une entité surfacique?

9

J'ai des données de parcelle qui coupent des données de ligne. Dans les données de parcelle, certaines parcelles ne coupent pas la ligne. Comment pourrais-je déterminer par programme si la parcelle sans intersection se trouve sur le côté droit ou le côté gauche de la ligne? Merci.

Justin
la source

Réponses:

8

Utilisez l' interface IHitTest . Votre point de requête sera le centre de gravité du polygone et la géométrie en entrée sera la ligne. L'une des sorties sera un booléen (bRightSide) qui vous indiquera de quel côté de la ligne vous êtes.

SeaJunk
la source
2

Vous pouvez utiliser le produit scalaire pour cela

/// <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
la source
1
Je pense qu'il vaut la peine de souligner que cette technique nécessite que la ligne d'entrée soit une ligne composée de seulement 2 sommets car elle accepte un objet ISegment.
Hornbydd
Cela fonctionne bien pour une ligne euclidienne appropriée (le tout, pas seulement un segment ou un rayon), mais je suis presque sûr que l'OP a utilisé "ligne" et "données de ligne" comme synonymes lâches pour les polylignes, où l'approche du produit scalaire échoue .
whuber
2

Algorithme pour obtenir le résultat souhaité:

  1. Prenez la ligne au point
  2. Ajoutez un tampon (0.0000005) sur le côté droit (ou gauche) de la géométrie de la ligne.
  3. Vérifiez si la géométrie du tampon est «à l'intérieur» de la géométrie du polygone ou «superposée» avec la géométrie du polygone.
Virender Jain
la source