2009-05-26 21 views
6

मैंने पहले पूछा "How can I tell if a point belongs to a certain line?" और मुझे एक उपयुक्त उत्तर मिला तो बहुत बहुत धन्यवाद।मैं कैसे बता सकता हूं कि कोई बिंदु एक निश्चित रेखा के पास है या नहीं?

अब, मैं जानना चाहता हूं कि एक निश्चित बिंदु मेरी लाइन पर बंद है या नहीं।

उत्तर

25

आपको लाइन में calculate the right angle distance की आवश्यकता है। फिर आपको परिभाषित करना होगा कि "बंद" क्या है और यह उस दूरी के भीतर परीक्षण करता है।

समीकरण आप चाहते है: Point-Line Distance (2-Dimensional):

d=|v^^·r|=(|(x_2-x_1)(y_1-y_0)-(x_1-x_0)(y_2-y_1)|)/(sqrt((x_2-x_1)^2+(y_2-y_1)^2)).

+9

नोट: यदि आप रेखा खंडों के साथ काम कर रहे हैं, तो (यानी असीमित लंबी लाइनें नहीं), इससे गलत परिणाम मिल सकते हैं: बिंदु सेगमेंट के अंत बिंदु से बहुत दूर हो सकता है और फिर भी एक छोटी सामान्य दूरी हो सकती है ... – MartinStettner

+0

यह भी ध्यान दें कि यदि आप घूमने जा रहे हैं और तुलना करें डी के लिए, यह तुलना करने के लिए और अधिक कुशल होगा। (x2 - x1) x (x1 - x0) |^2 से डी^2 | x2 - x1 |^2, दो वर्ग जड़ों को सहेजना और गुणा की लागत पर एक विभाजन । – Dave

+0

धन्यवाद श्री अलन लेकिन लिंक काम नहीं करता है! मैंने आपके समीकरण समीकरण की कोशिश की लेकिन यह मुझे नए बिंदु और रेखा के पहले बिंदु के बीच की दूरी प्रदान करता है जो छेद रेखा नहीं है। कृपया मेरी बुरी भाषा के लिए क्षमा करें। ईमानदारी से, वहीद –

0

गूगल अपने दोस्त है। आप बस नीचे समीकरण का उपयोग कर सकते हैं और वहां आप जा सकते हैं।

0

असल में, आप जो करना चाहते हैं उसे सामान्य रेखा मिलती है - यानी, आपकी रेखा के लिए लंबवत रेखा - जो आपके बिंदु और रेखा को छेड़छाड़ करती है, और उसके बाद उस रेखा के साथ दूरी की गणना करती है।

+0

हाँ सर लेकिन मैं गणित में बहुत कमजोर हूं इसलिए कृपया मेरी मदद करें और मुझे इसके लिए समीकरण दें। –

+1

शीर्ष देखें। यह सब वहाँ है। –

0

कितना करीब है?

कुछ ज्यामिति आपको आवश्यक उत्तर देंगे, आपको केवल निम्नलिखित चरणों से अवगत होना चाहिए।

आपकी तरह मानते हुए फॉर्म y = mx + b है, तो आपके बिंदु की सबसे छोटी दूरी आपके शुरुआती रेखा (एम 1 = -1/मीटर) के लंबवत रेखा होगी, जो आपके बिंदु को प्रश्न में छेड़छाड़ कर रही है।

वहां से आप छेड़छाड़ बिंदु और प्रश्न में बिंदु के बीच की दूरी की गणना करते हैं।

+0

मामूली महत्वपूर्ण सुधार इयान, लाइन 2 की ढलान ढलान रेखा 1 (एम 1 = -1/एम) का नकारात्मक पारस्परिक है - –

+0

मेरी गलती ... मेरे काम की जांच करने में कभी भी अच्छा नहीं :-) –

2

@Alan Jackson का जवाब लगभग सही है - लेकिन उनकी पहली (और सबसे अधिक वोट वाली) टिप्पणी से पता चलता है कि एंडपॉइंट सही ढंग से प्रबंधित नहीं होते हैं। यह सुनिश्चित करने के लिए कि बिंदु सेगमेंट पर है, बस एक बॉक्स बनाएं जहां सेगमेंट एक विकर्ण है, फिर जांच करें कि बिंदु अंदर है या नहीं। यहाँ छद्म कोड है:

को देखते हुए लाइन अब, अंक ए और बी, और प्वाइंट पी के शामिल, सवाल में:

int buffer = 25;//this is the distance that you would still consider the point nearby 
Point topLeft = new Point(minimum(a.x, b.x), minimum(a.y, b.y)); 
Point bottomRight = new Point(maximum(a.x, b.x), maximum(a.y, b.y)); 
Rect box = new Rect(topLeft.x - buffer, topLeft.y - buffer, bottomRight.x + buffer, bottomRight.y + buffer); 
if (box.contains(p)) 
{ 
    //now run the test provided by Alan 
    if (test) 
     return true; 
} 
return false; 
+0

आपको धन्यवाद :) –

0

कि उस समय के सबसे करीब है अपने लाइन पर बात की गणना करें ।

लाइन सेगमेंट मानना ​​ए और बी है, और बिंदु पी है।

float vAPx = p.x - a.x; 
float vAPy = p.y - a.y; 
float vABx = b.x - a.x; 
float vABy = b.y - a.y; 
float sqDistanceAB = a.distanceSq(b); 
float ABAPproduct = vABx*vAPx + vABy*vAPy; 
float amount = ABAPproduct/sqDistanceAB; 
if (amount > 1) amount = 1; 
if (amount < 0) amount = 0; 

जो तुम 'राशि' देता है, कितनी दूर रेखा खंड आप ए और बी के बीच हैं के माध्यम से (ठीक से घिरा)।

float nx = (amount * (b.x - a.x)) + a.x; 
    float ny = (amount * (b.y - a.y)) + a.y; 

आपको पॉइंट (एनएक्स, एनई) देता है।

if (p.distance(nx,ny) > threshold) reject; 

यह ठीक से, रेखा खंड की समाप्ति के बाद काम करते हैं क्योंकि यह 0 और 1.

के बीच 'राशि' रहता होगा यदि आप नहीं चाहते यदि यह एक घिरे रेखा खंड सीमा से छुटकारा पाने के राशि के लिए शेष कोड अभी भी काम करेगा, बी से परे और उससे पहले की स्थिति की गणना करेगा।

एक और सवाल था कि दावा किया गया था कि यह प्रश्न एक डुप्लिकेट था, लेकिन यह एक अलग बात मांग रहा है इसलिए मेरा समाधान बिंदु की स्थिति के लिए हल हो जाता है और फिर यूक्लिडियन दूरी (जो वास्तव में दोनों प्रश्न हल करता है) हल करता है।

a.distanceSq (बी) VABx vABx + vABy vABy के रूप में भी किया जा सकता है, क्योंकि हमने पहले से ही ऐसा किया है।

0

यहां एक पाइथन फ़ंक्शन है जो चाल करता है। इसे 2 या 3 आयामों (या अधिक) में काम करना चाहिए और विशेष मामलों के बिना लंबवत और क्षैतिज रेखाओं को संभालना चाहिए। यदि आप clipToSegment को सत्य पर सेट करते हैं तो लौटाया गया बिंदु समाप्त होता है यदि अनुमानित रेखा आपूर्ति लाइन से परे फैली हुई है।

def nearestPointOnLine(pt, r0, r1, clipToSegment = True): 
    r01 = r1 - r0   # vector from r0 to r1 
    d = np.linalg.norm(r01) # length of r01 
    r01u = r01/d   # unit vector from r0 to r1 
    r = pt - r0    # vector from r0 to pt 
    rid = np.dot(r, r01u) # projection (length) of r onto r01u 
    ri = r01u * rid   # projection vector 
    lpt = r0 + ri   # point on line 

    if clipToSegment:  # if projection is not on line segment 
     if rid > d:   # clip to endpoints if clipToSegment set 
      return r1 
     if rid < 0: 
      return r0 

    return lpt 

उपयोग: (से [2,4] बिंदु [4,5] रेखा खंड से की दूरी के [4,6])

r0 = np.array([2,4]) 
r1 = np.array([4,6]) 
rpt = np.array([4,5]) 
pt = nearestPointOnLine(rpt, r0, r1, True) 

dist = np.linalg.norm(rpt-pt) 
print('dist', dist) 
संबंधित मुद्दे

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