Làm thế nào để xác định phía nào của một dòng tính năng đa giác rơi?


9

Tôi có dữ liệu bưu kiện giao nhau dữ liệu dòng. Trong dữ liệu bưu kiện có một số bưu kiện không giao nhau. Làm thế nào tôi có thể lập trình tìm ra nếu bưu kiện không giao nhau ở bên phải hoặc bên trái của dòng? Cảm ơn.

Câu trả lời:


8

Sử dụng giao diện IHitTest . Điểm truy vấn của bạn sẽ là tâm đa giác và hình dạng đầu vào sẽ là đường thẳng. Một trong những kết quả đầu ra sẽ là một boolean (bRightSide) sẽ cho bạn biết bạn đang ở phía nào của dòng.


2

Bạn có thể sử dụng sản phẩm chấm cho việc này

/// <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
Tôi nghĩ rằng đáng để chỉ ra rằng kỹ thuật này đòi hỏi dòng đầu vào phải là một dòng chỉ gồm 2 đỉnh vì nó đang chấp nhận một đối tượng ISegment.
Hornbydd

Điều này hoạt động tốt đối với một dòng Euclide thích hợp (toàn bộ, không chỉ là một phân đoạn hoặc tia), nhưng tôi khá chắc chắn rằng OP đã sử dụng "dòng" và "dữ liệu dòng" làm từ đồng nghĩa lỏng lẻo cho polylines, khi cách tiếp cận sản phẩm chấm không thành công .
whuber

2

Thuật toán để có kết quả mong muốn:

  1. Lấy dòng tập trung
  2. Thêm một số bộ đệm (0,0000005) ở bên phải (hoặc bên trái) của hình dạng Đường.
  3. Kiểm tra xem hình học bộ đệm là 'Bên trong' hình học Đa giác hay 'Chồng chéo' với hình học Đa giác.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.