9

ここの例を見てください:http ://www.brianhare.com/physics/so.html

これらの2つの主要な関数を使用している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);
    }

マウスがパーティクル(中央の円)の右上にある場合: ここに画像の説明を入力してください

コンソールログには次のものが表示されます。

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

ここで、arctan(27/26)=角度:46:シータ=0.8である必要があります。マウスが中央の「上」にあるため、座標系は左上の約0,0に基づいているため、y2-y1は-27として読み取られます。

問題は、XとYの両方が負で、シータが正になる場合、反対方向(中心点から外側)を指す必要がある場合です。ここで180度のトリックを実行できることはわかっていますが、何が間違っているのかを理解したいと思います。

4

2 に答える 2

13

Javascriptや多くの言語には、この問題に取り組むためのatan2関数があります。これは2つの引数( x座標とy座標)を取る関数であるため、システムは結果にπを加算または減算して正しい角度を生成できます。電話する代わりに

Math.atan(y/x)

代わりに電話するだけです

Math.atan2(y, x)
于 2012-01-17T17:24:21.857 に答える
2

どのように線を引きたいかわかりませんが、どちらでも問題は解決します。

 theta = Math.atan2(distance.y , distance.x);
 theta = Math.PI + Math.atan2(distance.y , distance.x);
于 2012-01-17T17:33:27.643 に答える