2012-01-17 201 views
8

看看这里的例子:http://www.brianhare.com/physics/so.html笛卡尔坐标到极坐标

在那里我使用的这两个主要功能看看的console.log:

function distanceBetween2pts(x1, y1, x2, y2) { 
     console.log("Particle: ("+x1+","+y1+") Mouse: ("+x2+","+y2+")"); 
     // Pythagoras Theorem 
     // PQ = sqrt((x2-x1)^2 + (y2-y1)^2) 
     var x = (x2-x1); 
     var y = (y2-y1); 

     this.radius = Math.sqrt(x*x + y*y); 
     this.x = x; 
     this.y = y; 
    } 

    function polar2cartesian(R, theta) { 
     this.x = R * Math.cos(theta); 
     this.y= R * Math.sin(theta); 
    } 

当鼠标上面和在哪里到颗粒(中心圆)的右边,如: enter image description here

控制台日志显示:

Particle: (300,250) Mouse: (326,223) 
artan(-27/26) = angle: -46.08092418666069 - theta -0.8042638494191191 

它应该是arctan(27/26)=角度:46:θ= 0.8。因为即使鼠标位于中心的“上方”,它也会读取y2-y1为-27,因为坐标系统基于大约0,0左上角。

问题是,当X和Y都是负值时,θ应该指向相反的方向(从中心点向外)。我知道我可以在这里做一个180度的技巧,但我想明白我做错了什么。

+4

原因当两个y和x是否定的,将它们导致的正数(这是对应的角度的tagent,并且当角正切是肯定的,则角度本身是正的。 – 2012-01-17 17:13:17

+0

有许多你可以传递给三角函数的值(sin,cos,tan),它们会给出相同的值,对于sin的明显的是0,Pi,2 * pi,3 * pi等。它们只给出一定范围内的唯一值例如,对于sin其-Pi/2到+ pi/2)这意味着当做反向trig函数以回到原始函数时,除非你也大致知道trig函数的结果,否则trig函数的结果是无用的。你确定的方式是使用x和y的符号来确定它的第一个象限,从而确定你是否需要增加,减少或者其他来获得正确的角度。 – Chris 2012-01-17 17:31:56

回答

13

在Javascript和许多语言中有一个atan2函数来解决这个问题。这是一个函数,它接受2个参数(该Xÿ坐标),因此该系统可以增加或减少π到结果以产生正确的角度。与其说

Math.atan(y/x) 

的你只需要调用,而不是

Math.atan2(y, x) 
+1

嗯,好的。当我搜索javascript的arctan时,它告诉我函数是相同的,我选择了atan,因为它没有离开阅读器,想知道atan2是什么......这解决了问题。 – ParoX 2012-01-17 17:33:18

2

不知道你怎么想划清界线,但任何一项都将解决您的问题。

theta = Math.atan2(distance.y , distance.x); 
theta = Math.PI + Math.atan2(distance.y , distance.x); 
相关问题