วิธีการตรวจสอบคุณสมบัติของรูปหลายเหลี่ยมที่ด้านข้างของบรรทัด


9

ฉันมีข้อมูลพัสดุตัดข้อมูลเส้น ในข้อมูลพัสดุมีพัสดุบางส่วนที่ไม่ตัดกัน ฉันจะหาทางโปรแกรมได้อย่างไรว่าพัสดุที่ไม่ตัดกันนั้นอยู่ทางด้านขวาหรือด้านซ้ายของเส้น ขอบคุณ

คำตอบ:


8

ใช้อินเทอร์เฟซIHitTest จุดสอบถามของคุณจะเป็นรูปหลายเหลี่ยม centroid และเรขาคณิตอินพุตจะเป็นบรรทัด หนึ่งในผลลัพธ์จะเป็นบูลีน (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
Hornbydd

มันใช้งานได้ดีสำหรับเส้น Euclidean ที่เหมาะสม (ทั้งหมดไม่ใช่แค่เซกเมนต์หรือรังสี) แต่ฉันค่อนข้างแน่ใจว่า OP ใช้ "line" และ "data line" เป็นคำพ้องที่ว่างสำหรับpolylinesซึ่งวิธีการแบบจุดของผลิตภัณฑ์ล้มเหลว .
whuber

2

อัลกอริทึมเพื่อรับผลลัพธ์ที่ต้องการ:

  1. รับสายในโฟกัส
  2. เพิ่มบัฟเฟอร์บางส่วน (0.0000005) ที่ด้านขวา (หรือซ้าย) ของเรขาคณิตเส้น
  3. ตรวจสอบว่าบัฟเฟอร์เรขาคณิตเป็น 'ภายใน' เรขาคณิตหลายเหลี่ยมหรือ 'ทับซ้อน' ด้วยเรขาคณิตหลายเหลี่ยม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.