teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

テキスト追加

2015/06/02 09:20

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -8,4 +8,64 @@
8
8
 
9
9
  参考:[三角関数](http://ja.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0)
10
10
 
11
- 以上ご参考になれば幸いです。
11
+ 以上ご参考になれば幸いです。
12
+
13
+ ---
14
+ 追記
15
+
16
+
17
+ Wikipediaの[三角関数の説明](http://ja.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0)を使って説明します。
18
+
19
+ この説明の「定義」のすぐ下の右に
20
+
21
+ ∠Cを直角とする直角三角形ABC
22
+
23
+ の図があると思います。
24
+
25
+ この図で、点Aの座標を(x,y)とし、∠Aの角度をdeg(度)としますと、
26
+ 求めたいのは点Bの座標ですが、図にある三角形の辺の長さ、a と bを
27
+ 使うと、
28
+
29
+ B(x+b, y+a)
30
+
31
+ となりますので、あとは、aとbをlength(図では h )とdegを使って
32
+ 置き換えればよいことになります。
33
+
34
+ 図だと、∠Aの大きさをθとして
35
+
36
+ a = h × sin θ
37
+
38
+ b = h × cos θ
39
+
40
+ となっていますが、これをjavaのプログラムに直すときに、ちょっと気をつけ
41
+ なければならないのが、javaのサイン、コサインを求めるメソッド
42
+
43
+  Math.sin(angle)
44
+
45
+  Math.cos(angle)
46
+
47
+ は、角度の引数angleをラジアンで与えなければなりません。
48
+ 度(deg)をラジアン(rad)に変換するには、
49
+
50
+ rad = deg * Math.PI / 180;
51
+
52
+ ですが、Mathクラスには
53
+
54
+ Math.toRadians
55
+
56
+ という便利なメソッドがあるのでこれを使いますと、
57
+
58
+
59
+ b = length * Math.cos(Math.toRadians(deg));
60
+
61
+ a = length * Math.sin(Math.toRadians(deg));
62
+
63
+
64
+ となり、これらに、それぞれ移動前の座標(x,y)を
65
+ 加えると、求めたい
66
+
67
+ B(x+b, y+a)
68
+
69
+ の座標が得られます。
70
+
71
+ 以上です。