( गुफा: मैं यहां दो सन्निकटन का उपयोग कर रहा हूं: पहला d एक चाप की लंबाई के रूप में लेता है, और दूसरा इसे एक ऑर्थोगोनल लंबाई के रूप में लेता है। ये दोनों सन्दर्भ d के अपेक्षाकृत छोटे मानों के लिए अच्छे होने चाहिए, लेकिन वे पूर्ण नहीं होते हैं टिप्पणियों में स्पष्ट किया गया सटीक प्रश्न।)
इस पर गणित, सौभाग्य से, अपेक्षाकृत सरल है। सबसे पहले, हम अपने केंद्र की स्थिति से हमारे वर्तमान स्थिति के सापेक्ष वेक्टर पा सकते हैं:
deltaX = oX-cX;
deltaY = oY-cY;
और एक बार जब हमारे पास यह सापेक्ष वेक्टर होता है, तो हम उस सर्कल की त्रिज्या जान सकते हैं जिस पर हम काम कर रहे हैं:
radius = sqrt(deltaX*deltaX+deltaY*deltaY);
क्या अधिक है, हमारे सापेक्ष वेक्टर से हम सटीक कोण प्राप्त कर सकते हैं जो cX से oX तक की रेखा पर है:
curTheta = atan2(deltaX, deltaY);
अब चीजें थोड़ी पेचीदा हो जाती हैं। सबसे पहले, यह समझें कि एक वृत्त की परिधि - अर्थात्, 2π के कोणीय माप के साथ एक चाप की 'चाप लंबाई' - 2πr है। सामान्य तौर पर, त्रिज्या r के एक वृत्त के साथ, के कोणीय माप के साथ एक चाप की चाप लंबाई सिर्फ θr है। यदि हम आपके आरेख में d का उपयोग आर्क लंबाई के रूप में कर रहे थे, और चूंकि हम त्रिज्या को जानते हैं, तो हम केवल विभाजन करके हमें नई स्थिति में लाने के लिए थीटा में परिवर्तन पा सकते हैं:
deltaTheta = d/radius; // treats d as a distance along the arc
उस मामले के लिए जहां घ को एक रैखिक दूरी की आवश्यकता होती है, चीजें थोड़ी अधिक जटिल होती हैं, लेकिन सौभाग्य से ज्यादा नहीं। वहाँ, d एक आइसोसेलेज़ त्रिकोण का एक पक्ष है, जिसके अन्य दो किनारे सर्कल की त्रिज्या (क्रमशः cX / cY से oX / oY और aX / aY तक) हैं, और इस आइसोसेल त्रिकोण को द्विभाजित करने से हमें दो सही त्रिकोण मिलते हैं, जिनमें से प्रत्येक एक पक्ष के रूप में d / 2 है और कर्ण के रूप में त्रिज्या है; इसका मतलब यह है कि हमारे आधे कोण की साइन (d / 2) / त्रिज्या है, और इसलिए पूर्ण कोण सिर्फ दो बार है:
deltaTheta = 2*asin(d/(2*radius)); // treats d as a linear distance
ध्यान दें कि यदि आपने इस सूत्र से असिन को बाहर निकाल लिया और 2s को रद्द कर दिया, तो यह अंतिम सूत्र के समान होगा; यह वही है जो यह कह रहा है कि पाप (x) 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;
अब, इस सब के साथ, कुछ बड़े चेतावनी के बारे में पता होना चाहिए। एक के लिए, आप देखेंगे कि यह गणित ज्यादातर फ्लोटिंग-पॉइंट है, और वास्तव में यह लगभग होना ही है; लूप में अद्यतन करने के लिए इस पद्धति का उपयोग करने की कोशिश करना और हर चरण में पूर्णांक मानों को वापस करना, आपके सर्कल को बंद नहीं करने से सब कुछ कर सकता है (या तो लूप के चारों ओर जाने पर हर बार आवक या जावक को सर्पिल करना) इसे पहले से शुरू नहीं करना। जगह! (यदि आपका d बहुत छोटा है, तो आपको पता चल सकता है कि aX / aY या bX / bY के गोल संस्करण ठीक उसी जगह हैं, जहां आपका प्रारंभ स्थान oX / oY था।) दूसरे के लिए, यह बहुत महंगा है, विशेष रूप से इसके लिए कोशिश कर रहा है। करना; सामान्य तौर पर, यदि आप जानते हैं कि आपका चरित्र एक गोलाकार चाप में जा रहा है, तो आपको पूरे चाप को पहले से योजनाबद्ध करना चाहिए और नहींइसे फ्रेम से फ्रेम की तरह इस तरह से टिक कर दें, क्योंकि यहां सबसे महंगी गणना लागतों में कटौती करने के लिए फ्रंट लोड की जा सकती है। लागतों को वापस ट्रिम करने का एक और अच्छा तरीका है, अगर आप वास्तव में इस तरह से वृद्धि करना चाहते हैं, तो पहली जगह में ट्रिगर का उपयोग नहीं करना है; यदि d छोटा है और आपको इसके ठीक-ठीक होने की जरूरत नहीं है , लेकिन बहुत करीब है, तो आप 'd' को dx से oX / oY तक लम्बाई के वेक्टर में जोड़कर 'ट्रिक' कर सकते हैं, अपने केंद्र की ओर वेक्टर को orthogonal (ध्यान दें कि a) वेक्टर ऑर्थोगोनल टू (dX, dY) (-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
एक रेखीय दूरी या यह एक चाप है?