আমি এখনও এর জন্য সম্পূর্ণ সমীকরণের মধ্য দিয়ে কাজ করি নি, তবে সমস্যাটি সম্পর্কে আমাদের মাথা গুটিয়ে রাখতে সহায়তা করার জন্য এখানে কিছু ভিজ্যুয়াল রয়েছে। এটি কিছু জ্যামিতিতে ফোটে:
( কেনে দিয়ে গাড়ী আইকন )
যে কোনও প্রারম্ভিক বিন্দু এবং দিকনির্দেশ থেকে, আমরা আমাদের সর্বনিম্ন বাঁক ব্যাসার্ধের সাথে দুটি বৃত্ত আঁকতে পারি - একটি বাম দিকে, একটি ডানদিকে। এগুলি আমাদের পথের সবচেয়ে সম্ভবতম সূচনার পয়েন্টগুলি বর্ণনা করে।
আমরা যে কোনও পছন্দসই শেষ অবস্থান এবং দিকনির্দেশের জন্য একই কাজ করতে পারি। এই চেনাশোনাগুলি আমাদের পথে সবচেয়ে সম্ভবতম শেষ বর্ণনা করে।
এখন সমস্যাটি এমন একটি পথ সন্ধান করতে হ্রাস করে যা প্রারম্ভের চেনাশোনাগুলির মধ্যে একটির সাথে শেষ চেনাশোনাগুলির একটিতে যোগ দেয়, প্রতিটিটিকে তার স্পর্শক বরাবর চুম্বন করে।
(এটি ধরে নেওয়া হচ্ছে যে আমাদের মাঝে মধ্যে বাধাগুলি খুঁজে পাওয়ার দরকার নেই, যা প্রশ্নের মধ্যে উল্লেখ করা হয়নি St স্টর্মউইন্ডের উত্তরটি এই ধরণের সমস্যার জন্য আমরা কীভাবে নেভিগেশন গ্রাফের তথ্য ব্যবহার করতে পারি তা জানতে পারে Once একবার আমাদের নোডগুলির ক্রম হয় পাস করার জন্য, আমরা পরিকল্পনার প্রতিটি বিভাগে নীচের পদ্ধতিটি প্রয়োগ করতে পারি))
যদি, সরলতার জন্য, আমরা সরল রেখা ব্যবহার করি, আমরা এরকম কিছু পাই:
এটি আমাদের সীমাবদ্ধ কেস দেয়। আপনি একবার এই পদ্ধতির দ্বারা কোনও পাথ সন্ধান করলে, দুটি বৃত্তের চুম্বন বিন্দু না হওয়া অবধি আপনি সরাসরি বা স্বাচ্ছন্দ্যময় পথটি পেতে একটি বা উভয়কেই শুরু বা শেষ বৃত্তগুলিতে কৃত্রিমভাবে স্ফীত করতে পারেন।
এই পাথগুলি গণনা করা হচ্ছে
আসুন এক মোড় ঘুরিয়ে দেওয়ার জন্য কেসগুলি কার্যকর করা - বলুন আমরা ডান দিকে ঘুরিয়ে আমাদের পথ শুরু করি।
আমাদের ডানদিকে ঘুরিয়ে দেওয়ার কেন্দ্রটি হ'ল:
startRightCenter = carStart.position + carStart.right * minRadius
আসুন আমাদের পথের সরল বিভাগের কোণটি কল করুন (ধনাত্মক এক্স-অক্ষ থেকে মাপা) pathAngle
যদি আমরা কোনও ভেক্টরকে rightCenter
সেই বিন্দু থেকে আঁকি যেখানে আমরা টার্নিং বৃত্তটি ছেড়ে চলেছি (কোন বিন্দুতে আমাদের অবশ্যই পথআঙ্গলের মুখোমুখি হতে হবে), তবে সেই ভেক্টরটি ...
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)
ক্রসওভার কেস আরও জটিল - এটি এখনও আমি সমস্ত গণিতের জন্য কাজ করি নি। আমি এখনই ছাড়াই উত্তর পোস্ট করব, যদি বাকী বিবরণগুলি নিয়ে কাজ করি তবে এটি আপনার পক্ষে কার্যকর useful
সম্পাদনা করুন: সর্বনিম্ন বাঁক ব্যাসার্ধের ভিতরে গন্তব্য
দেখা যাচ্ছে যে গন্তব্যটি আমাদের ন্যূনতম টার্নিংয়ের দূরত্বের কাছাকাছি থাকলেও এই পদ্ধতিটি প্রায়শই বাক্সের বাইরে কাজ করে। কমপক্ষে পুনরায় প্রবেশের চেনাশোনাগুলির একটির কিছু অংশ টার্নের ব্যাসার্ধের বাইরে শেষ হয়, যতক্ষণ না আমরা কিছুটা প্রিটজেলের মতো পাওয়ার আপত্তি জানাই না ততক্ষণ আমাদের একটি কার্যকর পথ খুঁজে দিন ...
আমরা যদি সেই পথটি আমাদের পছন্দ না করি (বা যদি এটি সম্ভব হয় না - আমি প্রতিটি ক্ষেত্রে নিখুঁতভাবে পরীক্ষা করে দেখিনি - সম্ভবত সেখানে অসম্ভব কিছু আছে), আমাদের উপযুক্ত না পাওয়া পর্যন্ত আমরা সর্বদা সরাসরি এগিয়ে বা পিছনে গাড়ি চালাতে পারি উপরের চিত্র হিসাবে, একটি শুরু এবং শেষ বৃত্তের মধ্যে চুম্বন যোগাযোগ।