[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
ただいまコメントを受けつけておりません。
ある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)を用いる。これで容易に計算できる……と思いきやそうはいかない。角度によって長さは一意に定まるが、長さによっては角度は一意には定まらないからだ。
rad | ° | sin | cos |
---|---|---|---|
0~π/2 | 0°~90° | +(正) | +(正) |
π/2~π | 90°~180° | +(正) | -(負) |
π~3π/2 | 180°~270° | -(負) | -(負) |
3π/2~2π | 270°~360° | -(負) | +(正) |
すなわち、sinθ
の値が 1/2
の場合、θは 30° かもしれないし、150° かもしれないのである。なお、arcsin(1/2) は 30° になる。
そのため、上述のように x と y の値から値を実際の θ の値を計算する必要がある。
ただいまコメントを受けつけておりません。