2017-03-03 9 views
1

次のコードに奇妙なバグがあります。下にスクロールすると、この質問を参照する画像が表示されます。下の画像にあるプログラムは、javascriptを使ってキャンバスで描かれているので、x座標とy座標はすべて正であるため、y座標はグラフに対して上下逆になっています。ベクトルを回転させるときのバグ、回転を調整して新しいベクトルを作成するとき

let rotateVectors = (vs, t) => { 
     return sortVectors(Object.keys(vs).map(v => { 

     console.log(vs[v].vector.direction); 
     let rateOfRotation = -.01 * (Math.random() * (5-1)+1); 
     let vector = vs[v].vector 
     let p = vector.magnitude; 
     let c = vector.coords; 
     let x = c.x*Math.cos(rateOfRotation) - c.y*Math.sin(rateOfRotation); 
     let y = c.x*Math.sin(rateOfRotation) + c.y*Math.cos(rateOfRotation); 
     return vector(cartesian2dCoordinate(x,y)) 
     })); 
    } 

上記方法をゆっくりいくつかのランダムな量によってベクトルを回転させるようにループで呼び出され、マップ機能は、Y座標、Xがかかり新しいベクトルを返し、または2D直交対が記述ベクトルの立ち上がりと立ち上がり。

rotateVectorsは、vsオブジェクト内のすべてのベクトル(の角度でソートされた角度)のソートされたリストを返します。

let vectorDirection = (c) => { 
    //THE ZERO VECTOR 
    if(c.x === 0 && c.y === 0) return 0; 

    //cardinal directions, vertical and horizontal 
    else if(c.x === 0) return c.y > 0 ? .5 : 1.5; 
    else if(c.y === 0) return c.x > 0 ? 0:Math.PI; 

    //q3 
    else if(c.x< 0 && c.y < 0) return (1+ (Math.atan(-1*((c.y * -1)/c.x)))); 
    //q2 
    else if(c.x < 0 && c.y > 0) return (Math.PI/180)*(180 + toDegrees(Math.atan((c.y * -1)/c.x))); 
    //q4 
    else if(c.y < 0 && c.x > 0) return (Math.PI/180)*(toDegrees(Math.atan((c.y * -1)/c.x))); 
    //q1 
    else return Math.atan(c.y*-1/c.x); 
} 

この関数は、象限に基づいてベクトルの角度のラジアンを返します。画像一

Traversal zone 1

、任意のベクターはすべての方法の周り-y垂直カラムに、赤色でマークx平面から回転します。 S→E。画像二つに

traversal zone 2, reversed direction

、ベクターは、魔法のS面とE面からテレポート、反対方向に進みます。 S-> Eとなり、ベクトルはimage1の-X plane "S"にテレポートします。

私はベクトルで物を描くのは比較的新しいです。私は学校から少しトリグを覚えていますが、私は非常に長い時間それを使用していません。誰もがここで起こっているかもしれないアイデアを持っていますか?ベクトルがテレポーティングして方向を変え、なぜベクトルが画像2のSの左側にヌルゾーンを横切り、画像1のSから下方に移動しないのですか?

+0

。ベクトルのどの部分もグラフのこのセクタを横断しません。 –

+0

あなたはvectorDirectionでatan2関数を使用して、各象限の大文字小文字を区別するのではなく、 – samgak

+0

うわー....神聖です。私は神に誓う、私は昨晩すべてatan2を試みたが、何も起こらなかった。今は期待どおりに動作します。 –

答えて

1

コメントの回答でsamgakに感謝します。私は元のvectorDirection関数をこのコードに置き換えました。それは期待どおりに動作します。ベクトルは、予想される方向に、予想される速度で回転します。 http://imgur.com/a/Skp5O ヌル・ゾーン・画像

let vectorDirection = (c) => { 
//THE ZERO VECTOR 
    if(c.x === 0 && c.y === 0) return undefined; 
    else return Math.atan2(-1*c.y,c.x) 

} 
関連する問題