Декартово-полярные координаты - PullRequest
9 голосов
/ 17 января 2012

Взгляните на пример здесь: 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 градусов, но я хочу понять, что я делаю неправильно.

Ответы [ 2 ]

13 голосов
/ 17 января 2012

В Javascript и многих языках есть функция atan2 для решения этой проблемы.Это функция, которая принимает 2 аргумента ( x и y координаты), поэтому система может добавлять или вычитать π к результату для получения правильного угла,Вместо того, чтобы звонить

Math.atan(y/x)

, вы просто звоните вместо

Math.atan2(y, x)
2 голосов
/ 17 января 2012

Не знаю, как вы хотите нарисовать линию, но любой из них решит вашу проблему.

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