次のコードに奇妙なバグがあります。下にスクロールすると、この質問を参照する画像が表示されます。下の画像にあるプログラムは、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);
}
この関数は、象限に基づいてベクトルの角度のラジアンを返します。画像一
、任意のベクターはすべての方法の周り-y垂直カラムに、赤色でマークx平面から回転します。 S→E。画像二つに
traversal zone 2, reversed direction
、ベクターは、魔法のS面とE面からテレポート、反対方向に進みます。 S-> Eとなり、ベクトルはimage1の-X plane "S"にテレポートします。
私はベクトルで物を描くのは比較的新しいです。私は学校から少しトリグを覚えていますが、私は非常に長い時間それを使用していません。誰もがここで起こっているかもしれないアイデアを持っていますか?ベクトルがテレポーティングして方向を変え、なぜベクトルが画像2のSの左側にヌルゾーンを横切り、画像1のSから下方に移動しないのですか?
。ベクトルのどの部分もグラフのこのセクタを横断しません。 –
あなたはvectorDirectionでatan2関数を使用して、各象限の大文字小文字を区別するのではなく、 – samgak
うわー....神聖です。私は神に誓う、私は昨晩すべてatan2を試みたが、何も起こらなかった。今は期待どおりに動作します。 –