मैंने अभी तक इसके लिए पूर्ण समीकरणों के माध्यम से काम नहीं किया है, लेकिन समस्या के चारों ओर हमारे सिर को लपेटने में मदद करने के लिए यहां कुछ दृश्य हैं। यह कुछ ज्यामिति को उबालता है:
( कार प्रतीक के माध्यम से केनी )
किसी भी शुरुआती बिंदु और अभिविन्यास से, हम अपने न्यूनतम मोड़ त्रिज्या के साथ दो वृत्त खींच सकते हैं - एक बाईं ओर, एक दाईं ओर। ये हमारे पथ पर सबसे कठिन संभव शुरुआत के बिंदुओं का वर्णन करते हैं।
हम किसी भी वांछित अंत स्थिति और अभिविन्यास के लिए ऐसा ही कर सकते हैं। ये मंडलियाँ हमारे पथ के सबसे कठिन अंत का वर्णन करती हैं।
अब समस्या एक रास्ता है कि अंत समुदायों में से एक शुरुआत समुदायों में से एक में शामिल है अपने स्पर्श के साथ हर एक चुंबन पाने के लिए कम कर देता है।
(यह मानकर है कि हमें बीच-बीच में बाधाओं को दूर करने की आवश्यकता नहीं है, जो कि प्रश्न में वर्णित नहीं है। स्टॉर्मविंड का जवाब मिलता है कि हम इन प्रकार की समस्याओं के लिए नेविगेशन ग्राफ की जानकारी का उपयोग कैसे कर सकते हैं। एक बार जब हमारे पास नोड्स का क्रम होता है। से गुजरने के लिए, हम योजना के प्रत्येक खंड के नीचे की विधि लागू कर सकते हैं।)
यदि, सादगी के लिए, हम सीधी रेखाओं का उपयोग करते हैं, तो हमें कुछ ऐसा मिलता है:
यह हमें सीमित मामला देता है। एक बार जब आप इस विधि से एक रास्ता मिल गया है, तो आप कृत्रिम रूप से एक या दोनों शुरुआत और अंत हलकों बढ़ बिंदु है जहां दो हलकों चुंबन तक एक कम प्रत्यक्ष लेकिन चिकनी पथ प्राप्त करने के लिए, कर सकते हैं।
इन रास्तों की गणना
चलो एक मोड़ दिशा के लिए मामलों को काम करते हैं - कहते हैं कि हम सही मोड़ से अपना रास्ता शुरू करते हैं।
हमारे दाईं ओर घूमने का केंद्र है:
startRightCenter = carStart.position + carStart.right * minRadius
चलो हमारे पथ के सीधे खंड के कोण को कहते हैं (धनात्मक x- अक्ष से मापा जाता है) pathAngle
यदि हम rightCenter
उस बिंदु से एक सदिश खींचते हैं , जहाँ हम टर्निंग सर्कल छोड़ते हैं (जिस बिंदु पर हमें pathAngle का सामना करना पड़ता है), तो सदिश है ...
startOffset = minRadius * (-cos(pathAngle), sin(pathAngle))
इसका मतलब है कि वह बिंदु जहां हम सर्कल छोड़ते हैं, होना चाहिए ...
departure = startRightCenter + startOffset
वह बिंदु जहां हम एक टर्निंग सर्कल में फिर से प्रवेश करते हैं, यह इस बात पर निर्भर करता है कि क्या हम बाएं या दाएं मोड़ के साथ समाप्त करना चाहते हैं:
// To end with a right turn:
reentry = endRightCenter + startOffset
// To end with a left turn: (crossover)
reentry = endLeftCenter - startOffset
अब, अगर हम हमारा काम सही किया है, लाइन में शामिल होने departure
के लिए reentry
करने के लिए खड़ा होना चाहिए startOffset
:
dot(reentry - departure, startOffset) = 0
और इस समीकरण को हल करने से हमें वह कोण मिलेगा, जिस पर यह सत्य है। (मैं यहां एक बहुवचन का उपयोग करता हूं क्योंकि तकनीकी रूप से दो ऐसे कोण हैं, लेकिन उनमें से एक में रिवर्स में ड्राइविंग शामिल है जो आमतौर पर हम नहीं जानते हैं)
आइए एक उदाहरण के रूप में दाएं मोड़ को दाईं ओर मोड़ें।
dot(endRightCenter + startOffset - startRightCenter - startOffset, startOffset) = 0
dot(endRightCenter - startRightCenter, startOffset) = 0
pathAngle = atan2(endRightCenter - startRightCenter)
क्रॉसओवर मामला अधिक जटिल है - यह वह है जो मैंने अभी तक सभी गणित के लिए काम नहीं किया है। जब तक मैं शेष विवरणों पर काम करता हूं, मैं आपके लिए बिना उत्तर के पोस्ट करूंगा, यह आपके लिए उपयोगी है।
संपादित करें: न्यूनतम मोड़ त्रिज्या के अंदर गंतव्य
यह पता चला है, यह विधि अक्सर आउट-ऑफ-द-बॉक्स तब भी काम करती है, जब गंतव्य हमारी न्यूनतम मोड़ की तुलना में करीब हो। री-एंट्री सर्किलों में से कम से कम कुछ हिस्सा टर्न रेडियस के बाहर समाप्त हो जाता है, जिससे हमें तब तक एक व्यवहार्य मार्ग मिल जाता है जब तक कि हमें यह बुरा न लगे कि यह थोड़ा प्रेट्ज़ेल जैसा है ...
यदि हमें वह रास्ता पसंद नहीं है जो हमें उस तरह से मिलता है (या यदि कोई संभव नहीं है - तो मैंने हर मामले को पूरी तरह से जाँच नहीं किया है - शायद असंभव हैं), हम हमेशा सीधे या पीछे ड्राइव कर सकते हैं जब तक कि हम एक उपयुक्त नहीं मिलते एक शुरुआत और अंत सर्कल के बीच संपर्क चुंबन, जैसा कि ऊपर diagrammed।