यह कैसे निर्धारित किया जाए कि एक बहुभुज विशेषता रेखा के किस तरफ गिरती है?


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 शीर्ष रेखाओं से बना होना चाहिए क्योंकि यह एक आईएसईएक्ट ऑब्जेक्ट को स्वीकार कर रहा है।
२३:०२ पर हॉर्नबड

यह एक उचित यूक्लिडियन लाइन के लिए ठीक काम करता है (पूरी बात, न केवल एक खंड या किरण), लेकिन मुझे पूरा यकीन है कि ओपी ने "लाइन" और "लाइन डेटा" का उपयोग पॉलीइलाइन के लिए ढीले समानार्थी शब्द के रूप में किया है , जहां डॉट उत्पाद दृष्टिकोण विफल होता है। ।
whuber

2

वांछित परिणाम प्राप्त करने के लिए एल्गोरिदम:

  1. ध्यान में लाइन ले लो
  2. लाइन ज्यामिति के दाईं ओर (या बाएं) कुछ बफर (0.0000005) जोड़ें।
  3. जांचें कि क्या बफर ज्यामिति बहुभुज ज्यामिति के साथ 'अंदर' या बहुभुज ज्यामिति के साथ 'ओवरलैप' है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.