( ক্যাভেট: আমি এখানে দুটি আনুমানিকতা ব্যবহার করছি: প্রথমটি একটি চাপ দৈর্ঘ্যের হিসাবে গ্রহণ করে, এবং দ্বিতীয়টিটি একটি অর্থোগোনাল দৈর্ঘ্য হিসাবে গ্রহণ করে Both উভয় অনুমানের তুলনামূলকভাবে ছোট মানের জন্য ভাল হওয়া উচিত, তবে তারা পরিপূর্ণ হয় না) মতামত স্পষ্ট হিসাবে সুনির্দিষ্ট প্রশ্ন।)
ভাগ্যক্রমে, এর গাণিতিকটি তুলনামূলকভাবে সহজ। প্রথমত, আমরা আমাদের কেন্দ্রের অবস্থান থেকে আমাদের বর্তমান অবস্থানে আপেক্ষিক ভেক্টরটি খুঁজে পেতে পারি:
deltaX = oX-cX;
deltaY = oY-cY;
এবং একবার যখন আমাদের এই আপেক্ষিক ভেক্টরটি পাওয়া যায়, তারপরে আমরা এর বৃত্তের ব্যাসার্ধটি জানতে পেরে আমরা এর বৃত্তটির দৈর্ঘ্যটি খুঁজে বের করতে পারি:
radius = sqrt(deltaX*deltaX+deltaY*deltaY);
আরও কী, আমাদের আপেক্ষিক ভেক্টর থেকে আমরা সুনির্দিষ্ট কোণটি খুঁজে পেতে পারি যে সিএক্স থেকে অক্স পর্যন্ত রেখাটি রয়েছে:
curTheta = atan2(deltaX, deltaY);
এখন জিনিসগুলি কিছুটা জটিল হয়ে উঠছে। প্রথমত, বুঝতে হবে যে একটি বৃত্তের পরিধি - যা 2π এর কৌণিক পরিমাপযুক্ত একটি চাপের 'চাপ দৈর্ঘ্য' - 2πr। সাধারণভাবে, ব্যাসার্ধের বৃত্ত বরাবর একটি কৌণিক পরিমাপের সাথে একটি চাপের চাপের দৈর্ঘ্য মাত্র θr হয়। যদি আমরা আপনার চিত্রের ডিটি আর্ক দৈর্ঘ্য হিসাবে ব্যবহার করতে পারি এবং যেহেতু আমরা ব্যাসার্ধটি জানি, আমরা কেবল আলাদা করে আলাদা করে নতুন অবস্থানে নিয়ে যাওয়ার জন্য থিয়েটার পরিবর্তনটি খুঁজে পেতে পারি:
deltaTheta = d/radius; // treats d as a distance along the arc
যে ক্ষেত্রে ডিটির লিনিয়ার দূরত্ব হওয়া দরকার সেখানে জিনিসগুলি কিছুটা জটিল হয় তবে ভাগ্যক্রমে খুব বেশি কিছু হয় না। সেখানে ডি একটি আইসোসিল ত্রিভুজের একটি দিক রয়েছে যার অন্য দুটি দিকটি বৃত্তের ব্যাসার্ধ (যথাক্রমে সিএক্স / সিওয়াই থেকে ওএক্স / ওওয়াই এবং এক্স / এওয়াই) এবং এই সমদ্বীপীয় ত্রিভুজকে দ্বিখণ্ডিত করার ফলে দুটি করে সঠিক ত্রিভুজ পাওয়া যায় যার প্রত্যেকটিই এক পাশ হিসাবে d / 2 এবং অনুমিতি হিসাবে ব্যাসার্ধ রয়েছে; এর অর্থ এই যে আমাদের অর্ধেক কোণের সাইন (d / 2) / ব্যাসার্ধ এবং সুতরাং সম্পূর্ণ কোণটি এর দ্বিগুণ:
deltaTheta = 2*asin(d/(2*radius)); // treats d as a linear distance
লক্ষ্য করুন কীভাবে আপনি যদি এই সূত্রটি থেকে অসিনটি নিয়ে যান এবং 2 টি বাতিল করেন, তবে এটি শেষ সূত্রের মতো হবে; এটি একই বলেছে যে পাপের (x) এক্স এর ছোট মানগুলির জন্য প্রায় x, যা একটি দরকারী অনুমান হিসাবে জানতে।
এখন আমরা কেবল যুক্ত বা বিয়োগ করে নতুন কোণটি খুঁজে পেতে পারি:
newTheta = curTheta+deltaTheta; // This will take you to aX, aY. For bX/bY, use curTheta-deltaTheta
আমাদের কাছে নতুন কোণটি আসার পরে আমরা আমাদের আপডেট হওয়া আপেক্ষিক ভেক্টরটি খুঁজতে কিছু বেসিক ট্রিগ ব্যবহার করতে পারি:
newDeltaX = radius*cos(newTheta);
newDeltaY = radius*sin(newTheta);
এবং আমাদের কেন্দ্রের অবস্থান এবং আমাদের আপেক্ষিক ভেক্টর থেকে আমরা (অবশেষে) লক্ষ্য বিন্দুটি খুঁজে পেতে পারি:
aX = cX+newDeltaX;
aY = cY+newDeltaY;
এখন, এই সমস্তগুলির সাথে, সচেতন হওয়ার জন্য কয়েকটি বড় সাবধানবাণী রয়েছে। একটির জন্য, আপনি লক্ষ্য করবেন যে এই গণিতটি বেশিরভাগ ভাসমান-পয়েন্ট এবং বাস্তবে এটি প্রায় হতে হবে; একটি লুপে আপডেট করার জন্য এই পদ্ধতিটি ব্যবহার করার চেষ্টা করা এবং প্রতিটি ধাপে পূর্ণসংখ্যার মানগুলিতে ফিরে আসার জন্য এটি প্রথমে শুরু না হওয়ার জন্য আপনার বৃত্তটি বন্ধ না করা (প্রতিটি বার লুপের চারদিকে যাওয়ার সময় অভ্যন্তরীণ বা বাহ্যিকভাবে ছড়িয়ে পড়ে) করা সবকিছু থেকে পারে it জায়গা! (যদি আপনার ডি খুব ছোট হয়, তবে আপনি আবিষ্কার করতে পারেন যে এক্স / এওয়াই বা বিএক্স / বিওয়াইয়ের বৃত্তাকার সংস্করণগুলি ঠিক যেখানে আপনার প্রারম্ভিক অবস্থান oX / oY ছিল are) অন্যটির জন্য, এটি খুব ব্যয়বহুল, বিশেষত এটি যা চেষ্টা করছে তার জন্য কাজ কর; সাধারণভাবে, যদি আপনি জানেন যে আপনার চরিত্রটি একটি বিজ্ঞপ্তি চাপরে চলেছে, আপনার পুরো আর্কটি আগে থেকেই পরিকল্পনা করা উচিত এবং নাফ্রেম থেকে ফ্রেমে এটি এটিকে টিক দিন, যেহেতু এখানে বেশিরভাগ ব্যয়বহুল গণনাগুলি ব্যয় হ্রাস করার জন্য সম্মুখ-লোড হতে পারে। ব্যয়গুলি ছাঁটাই করার আরও একটি ভাল উপায়, আপনি যদি সত্যিই এভাবে বর্ধিতভাবে আপডেট করতে চান তবে প্রথম স্থানে ট্রিগ ব্যবহার না করা; যদি ডিটি ছোট হয় এবং আপনার এটি সঠিক হওয়ার দরকার নেই তবে কেবল খুব কাছাকাছি থাকে, তবে আপনি আপনার কেন্দ্রের দিকে ভেক্টরের সাথে দৈর্ঘ্যের ডি / ওএক্স / ওওয়াইয়ের সাথে ভের্টোর যুক্ত করে একটি 'ট্রিক' করতে পারেন (নোট করুন যে একটি ভেক্টর অরথোগোনাল থেকে (ডিএক্স, ডিওয়াই) প্রদত্ত (-dY, dX)) এবং তারপরে এটি ডান দৈর্ঘ্যে সঙ্কুচিত করুন। আমি এই কোডটি এতদূর ধাপে ধাপে ব্যাখ্যা করব না, তবে আশা করি আপনি এ পর্যন্ত যা দেখেছেন তা প্রদত্ত বোধগম্য হবে। নোট করুন যে আমরা নতুন ব-দ্বীপ ভেক্টরকে শেষ ধাপে অন্তর্নিহিতভাবে 'সঙ্কুচিত' করেছি,
deltaX = oX-cX; deltaY = oY-cY;
radius = sqrt(deltaX*deltaX+deltaY*deltaY);
orthoX = -deltaY*d/radius;
orthoY = deltaX*d/radius;
newDeltaX = deltaX+orthoX; newDeltaY = deltaY+orthoY;
newLength = sqrt(newDeltaX*newDeltaX+newDeltaY*newDeltaY);
aX = cX+newDeltaX*radius/newLength; aY = cY+newDeltaY*radius/newLength;
d
একটি রৈখিক দূরত্ব বা এটি একটি চাপ রয়েছে?