Как определить, на какой стороне линии находится полигональный элемент?


9

У меня есть данные посылки, пересекающие данные линии. В данных участков есть некоторые участки, которые не пересекают линию. Как я могу программно выяснить, находится ли непересекающийся участок справа или слева от линии? Спасибо.

Ответы:


8

Используйте интерфейс IHitTest . Точкой запроса будет центроид многоугольника, а входной геометрией будет линия. Одним из выходных данных будет логическое значение (bRightSide), которое сообщит вам, на какой стороне линии вы находитесь.


2

Вы можете использовать точечный продукт для этого

/// <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
Я думаю, что стоит отметить, что этот метод требует, чтобы входная строка была линией, состоящей только из 2 вершин, так как она принимает объект ISegment.
Хорнбидд

Это прекрасно работает для правильной евклидовой линии (все, а не только для сегмента или луча), но я почти уверен, что OP использовал «линию» и «данные линии» в качестве свободных синонимов для полилиний, где подход точечного продукта терпит неудачу ,
whuber

2

Алгоритм получения желаемого результата:

  1. Сфокусируйтесь на линии
  2. Добавьте некоторый буфер (0,0000005) на правой (или левой) стороне геометрии линии.
  3. Проверьте, находится ли геометрия буфера внутри геометрии многоугольника или перекрывается с геометрией многоугольника.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.