다각형 피처가 떨어지는 선의 측면을 결정하는 방법은 무엇입니까?


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
이 기술을 사용하려면 ISegment 객체를 받아 들일 때 입력 라인이 2 개의 정점으로 구성된 라인이어야한다고 지적 할 가치가 있다고 생각합니다.
Hornbydd

이것은 적절한 유클리드 라인 (세그먼트 또는 레이가 아닌 전체)에 대해서는 잘 작동하지만, OP가 "라인"과 "라인 데이터"를 폴리 라인에 대한 느슨한 동의어로 사용했다고 확신 합니다. .
whuber

2

원하는 결과를 얻는 알고리즘 :

  1. 초점을 맞추십시오
  2. 선 지오메트리의 오른쪽 (또는 왼쪽)에 버퍼 (0.0000005)를 추가하십시오.
  3. 버퍼 지오메트리가 폴리곤 지오메트리의 '내부'인지 또는 폴리곤 지오메트리의 '오버랩'인지 확인하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.