忍者ブログ

ひつ(じのひよこが)プログラミングします。
お仕事や趣味で困ったこととか、何度も「あれ?どうだったかしら」と調べたりしたこととか、作ったものとか、こどものこととかを書きます
★前は週末定期更新でしたが今は不定期更新です

2024/05    04« 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  »06

角度の計算

ある2点を通る線が y = 0 と交差した時に成す角度を計算したい。そのために以下のように書いた。

const calcAngle = (a, b) => {
    const pointLength = {
        x: a.x - b.x,
        y: a.y - b.y
    };
    const length = Math.sqrt(Math.pow(pointLength.x, 2) + Math.pow(pointLength.y, 2));
    const angles  = {
        asin: Math.asin((pointLength.y) / length),
        acos: Math.acos((pointLength.x) / length)
    };
    if(       pointLength.y >= 0 && pointLength.x <= 0 ) {
        return angles.acos;
    }else if( pointLength.y <= 0 && pointLength.x <= 0) {
        return (angles.asin - Math.PI) * -1;
    }else if( pointLength.y <= 0 && pointLength.x >= 0) {
        return angles.acos * -1;
    } else {
        return angles.asin;
    }
};

計算には三角関数(sin / cos)は角度から長さを出す関数である。逆関数である逆三角関数(arcsin / arccos)を用いる。これで容易に計算できる……と思いきやそうはいかない。角度によって長さは一意に定まるが、長さによっては角度は一意には定まらないからだ。

角度別 sin / cos がとる値
rad°sincos
0~π/20°~90° +(正) +(正)
π/2~π90°~180° +(正) -(負)
π~3π/2180°~270° -(負) -(負)
3π/2~2π270°~360° -(負) +(正)

すなわち、sinθの値が 1/2 の場合、θは 30° かもしれないし、150° かもしれないのである。なお、arcsin(1/2) は 30° になる。

そのため、上述のように x と y の値から値を実際の θ の値を計算する必要がある。

PR

コメント

ただいまコメントを受けつけておりません。

ブログ内検索

P R