2012-12-31 21 views
58

के साथ एक सर्कल पर बिंदु खोजें यह 10 साल हो गया है क्योंकि मैंने ऐसा कोई गणित किया था ... मैं 2 डी में एक गेम प्रोग्रामिंग कर रहा हूं और एक खिलाड़ी को चारों ओर ले जा रहा हूं। जैसे-जैसे मैं खिलाड़ी को चारों ओर ले जाता हूं, मैं खिलाड़ी की स्थिति से 200 पिक्सल दूर एक सर्कल पर बिंदु की गणना करने की कोशिश कर रहा हूं, जो कि एक सकारात्मक या नकारात्मक कोण (डिग्री) -360 से 360 के बीच दिया गया है। स्क्रीन 1280x720 है जिसमें 0,0 केंद्र बिंदु है स्क्रीन का खिलाड़ी इस पूरे कार्टेशियन समन्वय प्रणाली के चारों ओर घूमता है। जिस बिंदु को मैं खोजने की कोशिश कर रहा हूं वह स्क्रीन बंद हो सकता है।दिए गए केंद्र बिंदु, त्रिज्या, और डिग्री

मैं लेख Find the point with radius and angle पर सूत्रों की कोशिश की लेकिन मैं नहीं मानता कि मैं समझ रहा हूं "कोण" है, क्योंकि मैं अजीब परिणाम हो रही है जब मैं एक कॉस (कोण) या सिन (कोण में से 360 -360 के रूप में कोण पारित)।

इसलिए उदाहरण के लिए मेरे पास है ...

  • एक कार्तीय तल
  • सेंटर प्वाइंट (खिलाड़ी की स्थिति) पर 1280x720:
    • न्यूनतम के बीच जाने एक्स = एक नंबर - 640 से अधिकतम 640
    • वाई = = न्यूनतम -360 से अधिकतम 360
  • के बीच एक संख्या
  • प्लेयर के चारों ओर सर्किल का त्रिज्या: हमेशा आर = 200
  • कोण: एक = 360 से 360 के बीच दिया गया एक नंबर दें (ऋणात्मक को इंगित करने के लिए नकारात्मक या पॉइंट ऊपर की तरफ इंगित करें ताकि -10 और 350 एक ही जवाब दे सकें)

सर्कल पर एक्स वापस करने के लिए सूत्र क्या है?

सर्कल पर वाई वापस करने के लिए सूत्र क्या है?

enter image description here enter image description here

+5

यह एक अच्छा सवाल है !!! +1 – FrostyFire

+0

प्रश्न: क्या अधिकांश गेम शीर्ष पर बाईं ओर 0,0 तक नहीं हैं? और वाई धुरी नीचे चला जाता है, नहीं? – Persijn

उत्तर

44

सर्कल के केंद्र के सापेक्ष सर्कल पर बिंदु के एक्स और वाई निर्देशांक देने के लिए आपके द्वारा लिंक किए गए सरल समीकरण।

X = r * cosine(angle) 
Y = r * sine(angle) 

यह आपको बताता है कि बिंदु सर्कल के केंद्र से कितनी दूर ऑफसेट है। चूंकि आपके पास केंद्र (सीएक्स, सीई) के निर्देशांक हैं, इसलिए गणना की गई ऑफसेट जोड़ें।

सर्कल पर बिंदु के निर्देशांक हैं:

X = Cx + (r * cosine(angle)) 
Y = Cy + (r * sine(angle)) 
+0

मेरा भ्रम एंगल और डीग्री के बीच अंतर में पहला था। मैंने सोचा कि वे एक ही बात थे। तब मैंने सोचा कि मुझे विमान पर बिंदु (एक्स, वाई) मिल रहा था, लेकिन मुझे वास्तव में एक्स और वाई के किनारे की लंबाई मिल रही थी। मैंने कागज पर इसे बाहर निकाला और फिर सूत्रों की जांच के लिए डिग्री की सीमा को कवर करने के लिए इसे एक्सेल में फेंक दिया। यह अब मेरे कोड में काम करता है। –

+1

'एक्स = xcircle + (आर * साइन (कोण) नहीं होना चाहिए' 'एक्स = xcircle + (आर * कोसाइन (कोण))' (और 'वाई' के विपरीत)? – txtechhelp

+0

@txtechhelp हां। किसी भी तरह से मैंने इसे याद किया और किसी ने भी 3 वर्षों में ध्यान नहीं दिया है। इसके अलावा, प्रश्न में अक्षों की संख्या और कोण के दक्षिणावर्त माप को देखते हुए, वाई ऑफ़सेट को जोड़ा जाने के बजाय केंद्र समन्वय से घटाया जाना चाहिए। ** संपादित करें **: प्रश्न को फिर से पढ़ने के बाद (मुझे) मुझे लगता है कि मेरा दूसरा सुधार गलत है। – yoozer8

6

आप कोड का उपयोग कर रहे पोस्ट करना चाहिए। इससे समस्या की पहचान करने में मदद मिलेगी।

हालांकि, चूंकि आपने -360 से 360 के संदर्भ में अपने कोण को मापने का उल्लेख किया है, इसलिए आप शायद अपने गणित पुस्तकालय के लिए गलत इकाइयों का उपयोग कर रहे हैं। त्रिकोणमिति कार्यों के अधिकांश कार्यान्वयन उनके इनपुट के लिए रेडियंस का उपयोग करते हैं। और यदि आप इसके बजाय डिग्री का उपयोग करते हैं ... आपके उत्तर अजीब रूप से गलत होंगे।

x_oncircle = x_origin + 200 * cos (degrees * pi/180) 
y_oncircle = y_origin + 200 * sin (degrees * pi/180) 

ध्यान दें कि आप परिस्थिति में भी भाग ले सकते हैं जहां चतुर्भुज आप अपेक्षा नहीं करते हैं। यह सावधानी से चयन कर सकता है कि कोण शून्य कहां है, या मैन्युअल रूप से क्वाड्रंट की जांच करके आप परिणाम मानों पर अपने संकेतों को लागू कर सकते हैं।

+1

यह वास्तव में एक उत्तर के बजाय एक टिप्पणी होना चाहिए। हालांकि, रेडियंस बनाम डिग्री पर अच्छा पकड़। – yoozer8

+0

आप सही हैं, मुझे वास्तव में लड़के के प्रश्न का उत्तर देना चाहिए। –

+0

ज़ोंबी पोस्ट प्रश्न: माता-पिता में, यह है कि '(डिग्री * (पीआई/180)) 'या अन्य तरीका' ((डिग्री * पीआई)/180) '?रेड बनाम डिग्री के बीच अंतर निर्दिष्ट करने के लिए भी धन्यवाद। – monsto

4

मैं अजीब परिणाम हो रही है जब मैं एक कॉस (कोण) या पाप (कोण) में से 360 -360 के रूप में कोण गुजरती हैं।

मुझे लगता है कि आपका प्रयास काम नहीं करने का कारण यह है कि आप डिग्री में कोण गुजर रहे थे। sin और cos त्रिकोणमितीय कार्य रेडियंस में व्यक्त कोणों की अपेक्षा करते हैं, इसलिए संख्या 0 से 2*M_PI से होनी चाहिए। d डिग्री के लिए आप M_PI*d/180.0 पास करते हैं। M_PImath.h शीर्षलेख में निरंतर परिभाषित किया गया है।

+0

मुझे लगा कि कोण और डिग्री शायद एक ही चीज़ नहीं थी, इसलिए क्या मैं कोण = एम_PI * डी/180.0 कहने में सही हूं जहां डी -360 से 360 तक की संख्या हो सकती है या क्या मुझे एक और कदम चाहिए? –

+1

@ केली 'डी'' 0' से '360' या' -180' से '180' (एक पूर्ण सर्कल) से है, न कि' -360' से '360' (दो पूर्ण मंडल) तक। – dasblinkenlight

+0

धन्यवाद मैंने इसे एक्सेल में मैप किया। मैं अब बहुत करीब हूँ। –

6

मैं अत्यधिक इस प्रकार के मैनिप्लेशंस के लिए मैट्रिस का उपयोग करने का सुझाव देता हूं। यह सबसे सामान्य तरीका है, नीचे दिए गए उदाहरण देखें:

// The center point of rotation 
var centerPoint = new Point(0, 0); 
// Factory method creating the matrix           
var matrix = new RotateTransform(angleInDegrees, centerPoint.X, centerPoint.Y).Value; 
// The point to rotate 
var point = new Point(100, 0); 
// Applying the transform that results in a rotated point          
Point rotated = Point.Multiply(point, matrix); 
  • साइड नोट, सम्मेलन (सकारात्मक) X- अक्ष
2

मैं भी इस की जरूरत कोण काउंटर दक्षिणावर्त शुरू कर प्रपत्र को मापने के लिए है कोड में घड़ी के हाथों के आंदोलन का निर्माण करने के लिए। मैं कई सूत्रों की कोशिश की लेकिन वे काम नहीं किया है, तो यह है कि मैं क्या के साथ आया है:

  • गति - दक्षिणावर्त
  • अंक - हर 6 डिग्री (क्योंकि 360 डिग्री 60 minuites से विभाजित 6 डिग्री)
  • हाथ की लंबाई - 65 पिक्सल
  • केंद्र - एक्स = 75, y = 75

तो सूत्र होगा

x=Cx+(r*cos(d/(180/PI)) 
y=Cy+(r*sin(d/(180/PI)) 

जहां एक्स और वाई सर्कल की परिधि पर बिंदु हैं, सीएक्स और सी केंद्र के x, y निर्देशांक हैं, आर त्रिज्या है, और डी डिग्री की मात्रा है।

0

उत्तर बिल्कुल विपरीत होना चाहिए।

एक्स = Xc + rsin (कोण)

वाई = Yc + rCos (कोण)

जहां Xc और Yc वृत्त के केंद्र निर्देशांक और आर त्रिज्या है कर रहे हैं।

0

सिफारिश:

public static Vector3 RotatePointAroundPivot(Vector3 point, Vector3 
 
pivot, Vector3 angles) 
 
    { 
 
\t  return Quaternion.Euler(angles) * (point - pivot) + pivot; 
 
    }

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