2011-02-01 25 views
8

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

मैं पी और रेखा AB बीच सबसे कम दूरी की गणना करना चाहते हैं।

एक बिंदु की दूरी को अनंत रेखा तक की गणना करना आसान था क्योंकि Wolfram Mathworld पर उनका समाधान था, और मैंने इसे कार्यान्वित किया है, लेकिन मुझे इसे सीमित लंबाई की रेखा के लिए करने की आवश्यकता है।

मैं एक विश्वसनीय चारों ओर देख के एक बहुत बाद 3 डी में इस के लिए समाधान खोजने के लिए प्रबंधित नहीं किया है।

मैं एक struct कि तैरता एक्स, वाई और जेड शामिल साथ डॉट उत्पाद, पार उत्पाद, परिमाण और C++ इतने पर गणना करने के लिए एल्गोरिदम लागू किया है।

छद्म कोड, लिंक, या इस के लिए काफी किसी भी भाषा में कोड बहुत अच्छा होगा।

+0

यहाँ आप एक है 3 डी (या 2 डी) के लिए गणित में समाधान http://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-line-segment/4165840#4165840 –

+0

मुझे आपका स्वागत करने की अनुमति दें StackOverflow और तीन चीजों को याद दिलाना जो हम आमतौर पर यहां करते हैं: 1) जब आप सहायता प्राप्त करते हैं, तो इसे विशेषज्ञता देने के अपने ** ** प्रश्नों का उत्तर देने का प्रयास करें ** ['एफएक्यू पढ़ें'] (http://tinyurl.com/2vycnvr) 3) जब आप अच्छे क्यू एंड ए देखते हैं, तो उन्हें 'ग्रे त्रिकोणों का उपयोग करके] [http://i.imgur.com/kygEP.png) वोट दें, क्योंकि सिस्टम की विश्वसनीयता प्रतिष्ठा पर आधारित है उपयोगकर्ता अपने ज्ञान को साझा करके लाभ प्राप्त करते हैं। यह भी याद रखना याद रखें कि आपकी समस्या, अगर कोई है, ['चेकमार्क साइन दबाकर] बेहतर तरीके से हल करता है (http://i.imgur.com/uqJeW.png) –

उत्तर

5

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

4

जावा समारोह

/** 
* Calculates the euclidean distance from a point to a line segment. 
* 
* @param v  the point 
* @param a  start of line segment 
* @param b  end of line segment 
* @return  distance from v to line segment [a,b] 
* 
* @author  Afonso Santos 
*/ 
public static 
double 
distanceToSegment(final R3 v, final R3 a, final R3 b) 
{ 
    final R3 ab = b.sub(a) ; 
    final R3 av = v.sub(a) ; 

    if (av.dot(ab) <= 0.0)   // Point is lagging behind start of the segment, so perpendicular distance is not viable. 
    return av.modulus() ;   // Use distance to start of segment instead. 

    final R3 bv = v.sub(b) ; 

    if (bv.dot(ab) >= 0.0)   // Point is advanced past the end of the segment, so perpendicular distance is not viable. 
    return bv.modulus() ;   // Use distance to end of the segment instead. 

    return (ab.cross(av)).modulus()/ab.modulus() ;  // Perpendicular distance of point to segment. 
} 

पूरे का सार (आत्म निहित) R3 3 डी बीजगणित पैकेज: https://gist.github.com/reciprocum/4e3599a9563ec83ba2a63f5a6cdd39eb

खुला स्रोत पुस्तकालय https://sourceforge.net/projects/geokarambola/

1

मुझे पता है का हिस्सा है, यह सवाल थोड़ा है पुराना है, लेकिन दूसरों की मदद करने के लिए:

यहां आपके पास छद्म कोड से लिंक है (एक रे या सेगमेंट) के तहत एक प्वाइंट के दूरी देखो: एक से अधिक भाषा कार्यान्वयन के लिए

Pseudo code and C++ implementation

लिंक (योगदान कार्यान्वयन) के तहत देखो:

C, VBA, Java and other implementations

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