2010-10-01 23 views
7

मैं कैसे जांच सकता हूं कि कोई बिंदु रेखा से नीचे है या नहीं?मैं कैसे जांच सकता हूं कि कोई बिंदु रेखा से नीचे है या नहीं?

मैं निम्न डेटा है:

Line [ {x1,y1}, {x2,y2} ] 
Points {xA,yA}, {xB,yB} ... 

मैं अजगर में एक छोटा सा एल्गोरिथ्म एक तरफ और लाइन के दूसरी तरफ अंक का पता लगाने के बारे में की जरूरत है।

धन्यवाद

+1

कृपया अपना होमवर्क [होमवर्क] टैग के साथ चिह्नित करें। –

उत्तर

6

आप एक क्रॉस उत्पाद का उपयोग की कोशिश कर सकते - http://en.wikipedia.org/wiki/Cross_product

v1 = {x2-x1, y2-y1} # Vector 1 
v2 = {x2-xA, y2-yA} # Vector 1 
xp = v1.x*v2.y - v1.y*v2.x # Cross product 
if xp > 0: 
    print 'on one side' 
elif xp < 0: 
    print 'on the other' 
else: 
    print 'on the same line!' 

आपको प्रत्येक पक्ष क्या है, उसे कैलिब्रेट करने की आवश्यकता होगी। यदि आप इसे "नीचे" या "ऊपर" होना चाहते हैं तो आपको यह सुनिश्चित करने की आवश्यकता है कि रेखा के बिंदु क्षैतिज रूप से क्रमबद्ध किए जाएं।

मैंने इसका परीक्षण नहीं किया है।

संपादित करें मैंने प्रारंभ में डॉट उत्पाद सूत्र में डाल दिया था। : ओ

सौभाग्य से मुझे Calculating a 2D Vector's Cross Product मिला।

+1

क्या होगा यदि xp 0.00000000000000000000000000001 है (संभवतः फ़्लोटिंग पॉइंट प्रस्तुति के कारण)? क्या यह संभव नहीं है कि यह बिंदु वास्तव में लाइन पर है? (शायद 0.0 के बजाय कुछ ईपीएसलॉन की तुलना करना चाहते हैं) – PaulMcG

+0

अच्छा बिंदु! हालांकि मुझे नहीं पता कि आपको सबसे उपयुक्त ईपीएसलॉन मूल्य कैसे मिलेगा। – Edmund

+0

कोस (π/2) को 0 का मूल्यांकन करना चाहिए, लेकिन मेरे सिस्टम पर 'math.cos (math.pi/2) '' 6.1230317691118863e-017' देता है, इसलिए मुझे लगता है कि' 1e-15' या '' में एक ईपीएसलॉन होगा। 1e-16' रेंज सही के बारे में होगा। (इसे अपने स्वयं के निरंतर 'ईपीएस' में रखें ताकि आप इसे आसानी से एक स्थान पर समायोजित करके आसानी से ट्यून कर सकें, हर जगह आप फ़्लोटिंग पॉइंट तुलना करते हैं।) – PaulMcG

0

मान लें कि आपने 2 अंक ए, बी दिया है और आप जानना चाहते हैं कि halfplane एक तीसरा बिंदु सी है। मानदंड के रूप में "नीचे" और "उपरोक्त" शब्द बहुत अस्पष्ट हैं, इसलिए आपको संदर्भ बिंदु की आवश्यकता है, उदाहरण के लिए मूल। बस सुनिश्चित करें कि यह संदर्भ बिंदु ए और बी

के साथ कॉललाइनर नहीं है जो अब आपके पास त्रिकोण (ए, बी, सी) है। निर्धारक का उपयोग करके आप हस्ताक्षरित क्षेत्र (see here, या here) की गणना कर सकते हैं। यहां एकमात्र दिलचस्प बात है जो संकेत को याद रखना है।

अगला चरण: किसी दिए गए बिंदु डी के लिए त्रिभुज (ए, बी, डी) के हस्ताक्षरित क्षेत्र की गणना करें। यदि परिणाम आपके संदर्भ त्रिभुज के क्षेत्र के समान संकेत है -> सी और डी (ए, बी) के समान पक्ष पर हैं। यदि चिह्न अलग है -> सी और डी लाइन के विपरीत किनारे पर झूठ बोलते हैं। यदि (ए, बी, डी) का क्षेत्र 0 है तो ए, बी और डी कॉललाइनर हैं। नोट: त्रिकोण क्षेत्रों की तुलना करने के लिए पाइथन बिल्टिन cmp का उपयोग करें।

1

आप एक क्रॉस उत्पाद का उपयोग करने का प्रयास कर सकते हैं, लेकिन यह चाल है कि वेक्टर बनाने के लिए बिंदु का चयन कैसे करें, यहां मैं अंक से निकटतम बिंदु चुनता हूं, मान लीजिए मुझे पॉइंट ए मिला है (आप दूरी से गणना करने के लिए काफी लूप पॉइंट कर सकते हैं लूप प्वाइंट टू लाइन):

v1 = {x2-x1, y2-y1} # Vector 1 
v2 = {xA-x1, yA-y1} # Vector 2 
cross_product = v1.x*v2.y - v1.y*v2.x 
if cross_product > 0: 
    print 'pointA is on the counter-clockwise side of line' 
elif xp < 0: 
    print 'pointA is on the clockwise side of line' 
else: 
    print 'pointA is exactly on the line' 
संबंधित मुद्दे

 संबंधित मुद्दे