2013-08-01 8 views
7

मुझे 3 अंक के बीच कोण की गणना करने की आवश्यकता है। इस के लिए, मैं निम्न कार्य करें:गलत कोण, गलत पक्ष की गणना

  1. ले लो 3 अंक (पिछले वर्तमान और अगले, यह एक पाश के भीतर है)
  2. पाइथागोरस
  3. साथ अंक के बीच दूरी की गणना की गणना कोण Math.acos
  4. का उपयोग कर

ऐसा लगता है कि 180 डिग्री से अधिक के स्वर्गदूतों के बिना आकार के लिए ठीक काम करता है, हालांकि यदि किसी आकार में ऐसा कोने होता है तो यह छोटी तरफ की गणना करता है। यहाँ दिखाने के लिए मैं क्या मतलब है उदाहरण दिया गया है (लाल मूल्यों गलत हैं):

A scatch illustrating what goes wrong with the calculations

इस कोड है कि गणना करता है:,

// Pythagoras for calculating distance between two points (2D) 
pointDistance = function (p1x, p1y, p2x, p2y) { 
    return Math.sqrt((p1x - p2x)*(p1x - p2x) + (p1y - p2y)*(p1y - p2y)); 
}; 

// Get the distance between the previous, current and next points 
// vprev, vcur and vnext are objects that look like this: 
//  { x:float, y:float, z:float } 
lcn = pointDistance(vcur.x, vcur.z, vnext.x, vnext.z); 
lnp = pointDistance(vnext.x, vnext.z, vprev.x, vprev.z); 
lpc = pointDistance(vprev.x, vprev.z, vcur.x, vcur.z); 

// Calculate and print the angle 
Math.acos((lcn*lcn + lpc*lpc - lnp*lnp)/(2*lcn*lpc))*180/Math.PI 

वहाँ कुछ कोड में गलत है किया मैं कुछ करना भूल जाता हूं, या इसे पूरी तरह अलग तरीके से किया जाना चाहिए?

+2

आप इस्तेमाल कर सकते हैं [ 'Math.atan2()'] (https://developer.mozilla.org/en-US/docs/Web/ जावास्क्रिप्ट/संदर्भ/Global_Objects/Math/atan2) निर्देशांक से कोणों की गणना करने के लिए, यह गणना को सरल बना देगा। आप एक कामकाजी उदाहरण [इस पहेली में] देख सकते हैं (http://jsfiddle.net/92jWG/6/)। – Teemu

+0

त्रिकोण का कोण 180 डिग्री से अधिक कोण कैसे हो सकता है?कोणों का योग 180 डिग्री ..... – Jiminion

+1

समस्या यह है कि 'cos (90) 'और' cos (270) '0 दोनों हैं इसलिए एकोस (0) करते समय इसे चुनना होगा कि आपको क्या और स्पष्ट रूप से देना है वरीयता के रूप में 90 चुनता है। इसे ठीक करने का एक तरीका शायद atan2 का उपयोग करने के लिए Teemu सुझाव देता है और प्रत्येक पंक्ति खंड के कोणों को काम करता है और उन्हें घटाता है। मुझे लगता है कि यदि आप इसे सही क्रम में करते हैं तो आपको पूर्ण जानकारी देनी चाहिए (हालांकि इसे सामान्यीकृत करने की आवश्यकता हो सकती है क्योंकि यह -360 और 360 के बीच हो सकती है)। – Chris

उत्तर

4

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

Determine which side of a line a point lies

isLeft = function(ax,ay,bx,by,cx,cy){ 
return ((bx - ax)*(cy - ay) - (by - ay)*(cx - ax)) > 0; 
} 

कहाँ कुल्हाड़ी और ay मेकअप से पाया का उपयोग कर छोड़ दिया है या पहले दो अंक के द्वारा बनाई गई वेक्टर के अधिकार के लिए निहित है अपने पहले बिंदु और अपने तीसरे सीएक्स साइ द्वारा अपने पहले बिंदु बीएक्स ऊपर।

अगर यह बाईं ओर है सिर्फ अपने कोण करने के लिए 180 जोड़ने

+1

मुझे लगता है कि आपका मतलब है 'कोण =! IfLeft (....)? 360 - कोण: कोण; 'कोण + 180' के बजाय। – Broxzier

+0

मुझे लगता है कि इसलिए मैंने पूरी तरह से सवाल नहीं उठाया लेकिन यह पता लगाया कि क्या यह लाइन के बाएं या दाएं कुंजी है। मुझे आशा है कि कोड के बिट ने शुभकामनाएं दी! – ZJS

0

आपको सीमा की स्थिति की जांच करने की आवश्यकता है (जाहिर है, यदि अंक कॉलिनर हैं) और कोण को खोजने के लिए उचित गणना लागू करें। इसके अलावा, एक त्रिभुज में 180 डिग्री से अधिक कोई भी (आंतरिक) कोण नहीं हो सकता है। त्रिकोण के कोण का योग 180 डिग्री है।

+0

एक अच्छी शुरुआत यह पता लगाने के लिए हो सकती है कि कौन सी दूरी सबसे लंबी है। – Jiminion

+0

यदि आप पिछले से वर्तमान तक चलते हैं तो सीमा हमेशा बाईं ओर होती है, लेकिन मैं इसका उपयोग कैसे करूं, मुझे क्या गणना करने की आवश्यकता है? – Broxzier

+1

@ जिम: मुझे यकीन नहीं है कि यह सबसे लंबा प्रासंगिक है? – Chris

1

मैं एक काम मिल गया है, लेकिन नहीं है कि यह कैसे काम कर सकते हैं जरूरी संक्षिप्त उदाहरण:

var point1x = 0, point1y = 0, 
    point2x = 10, point2y = 10, 
    point3x = 20, point3y = 10, 
    point4x = 10, point4y = 20; 

var slope1 = Math.atan2(point2y-point1y,point2x-point1x)*180/Math.PI; 
var slope2 = Math.atan2(point3y-point2y,point3x-point2x)*180/Math.PI; 
var slope3 = Math.atan2(point4y-point3y,point4x-point3x)*180/Math.PI; 
alert(slope1); 
alert(slope2); 
alert(slope3); 
var Angle1 = slope1-slope2; 
var Angle2 = slope2-slope3; 
alert(180-Angle1); 
alert(180-Angle2); 

(http://jsfiddle.net/ZUESt/1/ देखें)

कई चरणों की व्याख्या करने के slopeN चर व्यक्ति की ढलानों हैं रेखा खंड। कोण जंक्शन प्रत्येक जंक्शन (यानी बिंदु एन + 1) पर चालू राशि है। एक सकारात्मक कोण एक सही मोड़ है और एक नकारात्मक कोण बाएं मोड़ है।

फिर आप वास्तविक कोण को प्राप्त करने के लिए 180 से इस कोण को घटा सकते हैं।

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

+0

और अब मैं सोच रहा हूं कि डॉट उत्पाद का उपयोग करना वैसे भी ऐसा करने का बेहतर तरीका हो सकता है ... – Chris

+1

नहीं। डॉट उत्पाद में प्रभावी रूप से आपको कोण की कोसाइन देने की एक ही समस्या है जो तब पहले की तरह ही समस्या का सामना करती है। – Chris

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