2012-01-17 13 views
8

Ven a ver el ejemplo aquí: http://www.brianhare.com/physics/so.htmlcartesianas a coordenadas polares

Tome un vistazo a console.log donde yo estoy usando estas dos funciones principales:

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); 
    } 

Dónde cuando el ratón está por encima y a la derecha de la partícula (círculo central) tales como: enter image description here

la consola muestra de registro:

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

donde debería ser arctan (27/26) = ángulo: 46: theta = 0.8. porque incluso si el mouse está "arriba" del centro, está leyendo y2-y1 como -27 porque el sistema de coordenadas se basa alrededor de 0,0 arriba a la izquierda.

El problema entonces es cuando tanto X como Y son negativos, lo que hace que theta sea positiva, cuando debería estar apuntando en la dirección opuesta (hacia afuera desde el punto central). Sé que podría hacer un truco de 180 grados aquí, pero quiero entender qué estoy haciendo mal.

+4

Porque cuando tanto Y y X son negativos, dividiéndolos resulta en un número positivo (que es el tagent del ángulo correspondiente, y cuando una tangente ángulos es positivo, el ángulo en sí es positivo. –

+0

hay muchos valores que puedes pasar a funciones trigonométricas (sin, cos, tan) que darán el mismo valor. Los obvios para sin son 0, Pi, 2 * pi, 3 * pi, etc. Solo dan valores únicos en un cierto rango (por ejemplo, para sin es -Pi/2 a + pi/2). Esto significa que al hacer las funciones trigonométricas inversas para volver al original sabiendo que el resultado de la función trigonométrica no sirve, a menos que también sepas en qué rango se encuentra. La forma en que determina eso es usar el signo de xey para calcular qué cuadrante es primero y, por lo tanto, si necesita sumar, restar o lo que sea para obtener el ángulo correcto. – Chris

Respuesta

13

En Javascript y en muchos idiomas existe una función atan2 para resolver este problema. Es una función que toma 2 argumentos (la x y Y coordenadas), por lo que el sistema puede añadir o restar π al resultado para producir el ángulo correcto. En lugar de llamar

Math.atan(y/x) 

que acaba de llamar en lugar

Math.atan2(y, x) 
+1

Hm, está bien. Cuando busqué en Google arctan para javascript me dijo que las funciones eran idénticas, opté por atan porque no dejó la lectura preguntándose qué es atan2 ... sin embargo, esto resolvió el problema. – ParoX

2

No sabe cómo desea dibujar la línea, pero cualquiera de ellos va a resolver su problema.

theta = Math.atan2(distance.y , distance.x); 
theta = Math.PI + Math.atan2(distance.y , distance.x); 
Cuestiones relacionadas