2017年8月30日水曜日

C# 数学1 「三角関数-1、逆三角関数、三角比」(ラジアン sin cos tan asin acos atan atan2)

C# 統計・微分積分・線形代数への道
目次→http://1studying.blogspot.jp/2017/08/senkei-index.html#kuw01

「三角関数」について
プログラムで実用する部分を最初にまとめます。
細かい説明はその後に記載してあります。

ここでは、
「×」を「*」
「÷」や「分数」を「/」
で表現します。

説明にあたって以下の呼び方をする事があります
  sinA=sinθ=正弦=対辺の比率←このサイトでは「対辺率」とも呼びます
  cosA=cosθ=余弦=底辺の比率←このサイトでは「底辺率」とも呼びます
  tanA=tanθ=正接=斜辺の傾き←このサイトでは「傾き」とも呼びます




まとめ「三角関数」


先にC#での記述を記載しておきます。
式などの解説は次項目から書いていきます。
  

三角関数系、基本12パターン(要「直角三角形」)
r = x / cosθ」(「r」を「x」と「θ」から求める)
r = y / sinθ」(「r」を「y」と「θ」から求める)
r = √(x2 + y2)」(「r」を「x」と「y」から求める)
x = cosθ * r」(「x」を「θ」と「r」から求める)
x = y / tanθ」(「x」を「y」と「θ」から求める)
x = √(r2 - y2)」(「x」を「r」と「y」から求める)
y = sinθ * r」(「y」を「θ」と「r」から求める)
y = tanθ * x」(「y」を「θ」と「x」から求める)
y = √(r2 - x2)」(「y」を「r」と「x」から求める)
θ = asin(y / r)」(「θ」を「y」と「r」から求める)
θ = acos(x / r)」(「θ」を「x」と「r」から求める)
θ = atan(y / x)」(「θ」を「y」と「x」から求める)
プログラム上では「角度θ」の指定や戻り値は必ず「ラジアン表記上の値」
で行う事に注意して下さい。
「角度θ」をプログラム上で求める場合は「atan2」を使った方が良いです。
詳しくは後述する
  『凄く便利。「atan2」について』
を参照してください。
double angle = 30.0; //「30度」を指定
var angleRAdian = angle / 180  * Math.PI; //度からラジアン角度を求める
double r = 50.0;
double x = 25 * Math.Sqrt(3); //(25√3)
double y = 25.0;
// -----------------------------
double r1 = x / Math.Cos(angleRAdian); //rをxとラジアンから求める
double r2 = y / Math.Sin(angleRAdian); //rをyとラジアンから求める
double r3 = Math.Sqrt(Math.Pow(2, x) + Math.Pow(2, y)); //rをyとラジアンから求める
double x1 = Math.Cos(angleRAdian) * r; //xをラジアンとrから求める
double x2 = y / Math.Tan(angleRAdian); //xをyとラジアンから求める
double x3 = Math.Sqrt(Math.Pow(2, r) - Math.Pow(2, y)); //xをラジアンとrから求める
double y1 = Math.Sin(angleRAdian) * r; //yをラジアンとrから求める
double y2 = Math.Tan(angleRAdian) * x; //yをラジアンとxから求める
double y3 = Math.Sqrt(Math.Pow(2, r) - Math.Pow(2, x)); //yをrとxから求める
double theta1 = Math.Asin(y / r); //ラジアンをyとrから求める
double theta2 = Math.Acos(x / r); //ラジアンをxとrから求める
double theta3 = Math.Atan(y / x); //ラジアンをyとxから求める
//ラジアンを求める場合は、「atan2」を使った方が良い。
割り算を使う式を使用する場合、0で割らないように気をつける。


三角関数系、+1パターン。座標から角度を求める(要「直角三角形」)
atan2(y座標とx座標)」(「角度θ」を「y」と「x」から求める。-値含む全座標対応)
        double x =  25 * Math.Sqrt(3); //(25√3)
        double y = 25.0;
        // -----------------------------
        double theta = Math.Atan2(y, x); //ラジアンをyとxから求める(-値含む全座標対応)
「atan2」は引数が「y」「x」の順となります。気をつけて使用して下さい。



「度数法」と「ラジアン」(角度単位)


「度数法」(ディグリー)
度数法とは普段使う角度の事。「90°」とか「360°」などと表記します。
単位は「度」。


「ラジアン」(弧度法)
ラジアンは「π」をうまく使い、人や機械に度数計算を行いやすくさせる表記方法です。
単位は「rad」。「ラジアン」と読みます。
(普段ラジアンは「π[rad]」のように「π」とセットで使い
「[rad]」は省略して書きますが、あえてここでは省略していません)
  「360°」が「2π[rad]」
  「180°」が「π[rad]」
のようにラジアンを表記します。
「ラジアン」とは「π」を使用した表記方法です。
このサイトでは「○πラジアン」と呼称する事もあります。

以下のように記述します。
  

「π」を「3.14159265…」として計算すると以下の形となります。
  2π[rad] = 6.283185307[rad]  ←360°のラジアン
  π/2[rad] = 1.570796327[rad]  ←90°のラジアン


「度数法」←→「ラジアン」
「度数法」と「ラジアン」を相互に変換してみます。
  「ラジアン[rad] = (度° / 180) * π」(「度」から「○πラジアン」を求める)
  「度° = (ラジアン[rad] / π) * 180」(「○πラジアン」から「度」を求める)
となります。
・「360°→ラジアン」へ変換する(「度」を180で割ってπを掛ける)
  (360°/180) *π = 2π[rad]
・「2π[rad]→度数表記」へ変換する(「○πラジアン」からπを取り除いて180掛ける)
  (2π[rad]/π) * 180 = 360°
・各「度数」を「ラジアン」へ変換する(「度」を180で割ってπを掛ける)
  
・各「ラジアン」を「度数」へ変換する(「○πラジアン」からπを取り除いて180掛ける)
  
・相互変換は以下のイメージで覚えると楽です。それぞれ「□」内へ値を入れる。
  


ラジアンの詳細
ラジアンはそもそも以下の考え方に基づいたものです。
  
  ここでは特別に「円周距離1」の角度を計算で求めましたが、
  通常、ラジアンは「ほにゃらら*π[rad]」の形で扱う事となります。


「C#」や「計算機」で計算させる際の注意
プログラムの際は「度」よりも「ラジアン」の表記を使うのが一般的です。
「C#」の「Math」でも、
「sin、cos、tan」等の引数に「ラジアン」を受け取ります。

「sin、cos、tan」等を「関数電卓」などで計算する際、
「計算機」の「角度モード」に注意しましょう。
角度を表す単位は「ディグリー」「ラジアン」「グラード」があり、
「計算機」の表示が「DEG」「RAD」「GRA」でそれぞれ違います。
普段の「度数法」の角度を使用するのが「DEG」モードです。
「πラジアン」を使うのが「RAD」モードとなります。



「三角関数」の元だね


「三角関数」(要「直角三角形」)
斜辺が「r」、横が「x」、縦が「y」とした場合、
「s」「c」「t」の筆記体の筆順で「三角関数の公式」をイメージ出来ます。
  
  例えば左側の筆記体の「s」の書き順にならって
  「r分のy」の答えが「sinθ」となっている事が分かるでしょうか?
ここで使う「シータθ」とは「角度」の事です。
「角度」の表記数値は
「計算機」の表示モードが「度数法」か「ラジアン」かで変わるので注意しましょう。

「直角三角形」で「sinθ」の関係をイメージすると以下の形となります。
  
ここから試しに「y」を目隠して「y」を求めてみます。(角度は「ラジアン」表記)
  
  結果、「y=√3」となりました。


「sinθ、cosθ、tanθ」を「sinA、cosA、tanA」と書ける
「三角関数」の計算では頻繁に以下の文字が使われますが、
  「sinθ」「cosθ」「tanθ」
まったく同じ意味の文字として以下の様な書き方も出来ます。
  「sinA」「cosA」「tanA」
「θをA」に変えた表記は一番よく使用されます。
たぶん「Answer(答え)」の略だと思います。
別に「θ」や「A」以外の文字でも構わないので
  「sinB、cosB、cosB」や「sinα、cosα、tanα」
のように書く事も可能です。
  
「sinθやsinA」「cosθやcosA」「tanθやtanA」の事を、
  「三角関数」とか「三角比」とか「比率、傾き」などと呼びます。
「三角比」や「比率、傾き」については後述します。


「1/sinθ、1/cosθ、1/tanθ」を「cscθ、secθ、cotθ」と省略可
他にも「三角関数」の計算で、
  「1/sinθ」「1/cosθ」「1/tanθ」
が使われる事があります。これらの省略系の書き方
  「cscθ」「secθ」「cotθ」
が存在します。
  
しかし実際は「cscθ secθ cotθ」で記述する人より、
「1/sinθ 1/cosθ 1/tanθ」で記述する人の方が多いようです。


三角関数系、基本(6/12)パターン(要「直角三角形」)
「三角関数の公式」から「r、x、y」を求める形に式の変形をすると、
  「y = sinθ * r」(縦「y」を「角度θ」と斜辺「r」から求める)
  「x = cosθ * r」(横「x」を「角度θ」と斜辺「r」から求める)
  「y = tanθ * x」(縦「y」を「角度θ」と横「x」から求める)
  「r = cscθ * y」「r = y / sinθ」(斜辺「r」を「角度θ」と縦「y」から求める)
  「r = secθ * x」「r = x / cosθ」(斜辺「r」を「角度θ」と横「x」から求める)
  「x = cotθ * y」「x = y / tanθ」(斜辺「r」を「角度θ」と縦「y」から求める)
のようになります。

詳しくは後述しますが「(三平方)ピタゴラスの定理」
  「r = √( x2 + y2)」(斜辺「r」を横「x」と縦「y」から求める)
を使えば「角度θ」が分からない状態からでも「r」を求める事ができます。


計算例:(「三角関数」角度をラジアンで計算)
「θ = 30°」「r = 50」の場合の「x」と「y」を求める。
  
まず、「θ=30°」を「○πラジアン」の形に変換します。
  
変換した「θ=(1/6)π[rad]」を使い「x」と「y」を求めます。
  
  今の段階では「cos()」と「sin()」は「関数電卓」で計算しましょう
  (「ラジアン」を計算する場合「計算機」のモードは「RAD」で計算)
結果、「x=25√3」「y=25」となり、以下の形となります。

  

参考(度)→http://keisan.casio.jp/exec/system/1260261251
参考(ラジアン)→http://keisan.casio.jp/exec/system/1260280032



「逆三角関数」の元だね


「逆三角関数」角度θを求める(要「直角三角形」)

斜辺が「r」、横が「x」、縦が「y」とした場合、
「s」「c」「t」の筆記体の筆順で「逆三角関数の公式」をイメージ出来ます。
  
  それぞれ、
  「asin」アークサイン「acos」アークコサイン「atan」アークタンジェント
  を使用して「角度θ」を求めています。
  例えば左側の筆記体の「s」の書き順にならって
  「r分のy」と「asin()」の括弧内がなっている事が分かるでしょうか?
「角度θ」の表記数値は
「計算機」の表示モードが「度数法」か「ラジアン」かで変わるので注意しましょう。

「直角三角形」で「asin(y/r) =θ」の関係をイメージすると以下の形となります。
  
ここから試しに「θ」を目隠して「θ」を求めてみます。(角度は「○πラジアン」表記)
  
  結果、「θ=(1/3)π[rad]」となりました。


「asin、acos、atan」を「sin-1、cos-1、tan-1」と書ける
「逆三角関数」の計算では頻繁に
  「asin」「acos」「atan」
  (「アークサイン」「アークコサイン」「アークタンジェント」と読み、
  「arcsin」「arccos」「arctan」と書く事もあります)
が使われますが、以下の様な書き方
  「sin-1」「cos-1」「tan-1
もよく使用されます。
  
  「sin-1、cos-1、tan-1」と書いた時は「-1」を「インバース」と読みます。
「計算機」や「関数電卓」ではこの「インバース」を使った表記が多いです。

他にも「逆三角関数」には、
  「acsc」アークコセカンド
  「asec」アークセカンド
  「acot」アークコタンジェント
が存在しますがこれらはあまり使用しません。ここでは覚えなくて大丈夫です。
(各々「acscは→asin」「asecは→acos」「acotは→atan」で代用されます。
答え「θ」を求めるために必要な「r、x、y」の素材が同じなので代用可能です。
下記「三角関係、基本(3/12)パターン」では斜線を引いておきました。)

「逆三角関数」の代表である、
  「asin」「acos」「atan」
は「直角三角形」の「角度θ」を求める為に使用されるものです。
  「三角関数sin、cos、tan」←→「逆三角関数asin、acos、atan」
の関係性があり、
「三角関数sin、cos、tan」と「逆三角関数asin、acos、atan」は「対」となる物です。
例えば「三角関数sinθ」と「逆三角関数asin」の式を考えた時、
  「sinθ = y / r」の「三角関数の公式」
  「θ = asin(y / r)」の「逆三角関数の公式」
のように式の中に「θ」と「y / r」を使用した
「三角関数sin」と「逆三角関数asin」の関係性を見て取ることが出来るのですが、
これについては後々学んでいきたいと思います。


三角関数系、基本(3/12)パターン(要「直角三角形」)
「逆三角関数」を「角度θ」を求める形に変形すると、
  「θ = asin(y / r)」(「角度θ」を斜辺「r」と縦「y」から求める)
  「θ = acos(x / r)」(「角度θ」を斜辺「r」と横「x」から求める)
  「θ = atan(y / x)」(「角度θ」を横「x」と縦「y」から求める)
  θ = acsc(r / y)」(「角度θ」を斜辺「r」と縦「y」から求める)
  θ = asec(r / x)」(「角度θ」を斜辺「r」と横「x」から求める)
  θ = acot(x / y)」(「角度θ」を横「x」と縦「y」から求める)
となります。(「角度θ」の数値は表記が「度数」か「ラジアン」かで変わるので注意)


計算例:(「逆三角関数」角度をラジアンで計算)
「r=50」「y=25」の場合の「角度θ」を求める。
  
「計算機」で「θ」を求める以下の計算をします。
  
結果「θ=(1/6)π[rad]」となります。
一応「ラジアン」から「度数」への変換もしておきます。
  
結果、以下の形となります。
  

参考(度)→http://keisan.casio.jp/exec/system/1260315699
参考(ラジアン)→http://keisan.casio.jp/exec/system/1260283160



「比率(割合)と傾き」(「三角関数と逆三角関数」)


「三角関数」と「逆三角関数」の式まとめ
「比率(割合)と傾き」について説明する前に「三角関数」と「逆三角関数」の式を
一度まとめておきます。
  
「三角関数」の式で出てくる「sinA、cosA、tanA」
  「sinA」「y/r」
    
  「cosA」「x/r」
    
  「tanA」「y/x」
    
とはそれぞれ何を指しているのでしょうか?
これらの事を「三角比」とか「比率、傾き」などと呼びます。
その「比率、傾き」についてこれから説明していきます。

ちなみに「直角三角形」の
「角度θ」が「0°<θ<90°」の範囲であれば、
「逆三角関数asin、acos、atan」を使いそれぞれに、
  「asin」には「sinA」(sinA=y/r)
    asin(sinA)
  「acos」には「cosA」(cosA=x/r)
    acos(cosA)
  「atan」には「tanA」(tanA=y/x)
    atan(tanA)
を与えると「角度θ」を知る事が出来ます。


「比率(割合)と傾き」とは
それでは「直角三角形」に対する「比率(割合)」と「傾き」について説明します。
「比率(割合)」とは…
「比」とは以下ように表す事が出来ます。(「〜に対する」が常に「分母」)
  「xに対するyの比」は「y/
  「yのxに対する比」は「y/
  
  「xに対するyの比」は「y/x」
は以下のように表す事も出来ます。(「〜に対する」を「分母(:の右側)」とする)
  「xに対するyの比」は「y:
  「yのxに対する比」は「y:
  
  「xに対するyの比率」は
    「y/x」「y÷x」「y:x」「y/x:1」
これらを踏まえると「比率(割合)」を以下のように見る事ができます
  
  つまり 「y:x=3:2」の「xと比べたyの比率は1.5」と言えます。
ここからが重要です。
「tanθ = tanA = y/x」となるのは覚えていますか?
「y/x」は「xに対するyの比率」と同じ事なので、
  「tanA = xに対するyの比率」
とも言えるわけです。
つまり「sinA、cosA、tanA」はそれぞれ
  
と解釈できます。

「傾き」とは…
「sinA、cosA」は「比率」を使い以下のような式で表す事が出来ます。
  「sinA = rに対するyの比率 = y/r」
  「cosA = rに対するxの比率 = x/r」
「sinA、cosA」は「傾き」で考えた場合計算が成り立ちません。
一方、
「tanA」では「(xに対するyの)比率」と「(rの)傾き」の両方の意味を持ちます。
  「tanA = xに対するyの比率 = y/x」
  「tanA = xに対するrの傾き = y/x」
「tanA」は「傾き」と「(xに対するyの)比率」の両方で同じ計算式が成り立ちます。
  
  「sinA」は「rに対するyの比率
  「cosA」は「rに対するxの比率
  「tanA」は「xに対するyの比率」や「xに対するrの傾き」又は「傾き」
これらを省略して、
  「sinA」とは「yの比率」
  「cosA」とは「xの比率」
  「tanA」とは「(rの)傾き」
と言う事が出来ます。

では、「直角三角形」の「sinA、cosA、tanA」の数値を実際に計算してみます。
  
結果、「(xに対する)rの傾きtanA」は「4/3」となっています。
「rの傾きtanA」は「y/x」で表現されていますので、
「この直角三角形のxとy」は「xか3増えるとyが4増える」関係ですと言えます。
(「asin(4/5)」「acos(3/5)」「atan(4/3)」の解は同じθの角度の値です)



(三平方)ピタゴラスの定理


「(三平方)ピタゴラスの定理」(要「直角三角形」)
続いて「三角比」について説明したいのですが、
その前に「三角関数」の一つである「ピタゴラスの定理」を知っておく必要があります。
以下の定理は「ピタゴラスの定理」とか「三平方の定理」などと呼ばれます。
  
「ピタゴラスの定理」は以下のような(証明)考えに基づいています。
  
  この「正四角形1」「正四角形2」各々から
  「直角三角形」4つ分の「面積」を取り除くと
    「正四角形1」に残った面積が「斜*斜」
    「正四角形2」に残った面積が「横*横+縦*縦」
  「正四角形1」と「正四角形2」に残った面積は
  両方とも同じ面積のハズなので、
    『斜*斜 = 横*横+縦*縦』
  の状態に常になる事が分かるでしょうか?
よって、「ピタゴラスの定理」
  『r2=x2+y2
が成り立ちます。


三角関数系、基本(3/12)パターン(要「直角三角形」)
「ピタゴラスの定理」の式を「r、x、y」を求める形に変形すると、
  「r = √( x2 + y2)」(斜辺「r」を横「x」と縦「y」から求める)
  「x = √(r2 - y2)」(横「x」を斜辺「r」と縦「y」から求める)
  「y = √(r2 - x2)」(縦「y」を斜辺「r」横「x」から求める)
となります。
(本当は「√」に「±」が付きますが、辺の長さの大きさは必ず「+」になるので省略)


計算例:(ピタゴラスの定理)
「直角三角形」の「r=50」「y=25」であれば
  
  「ピタゴラスの定理」を使うと、
  「r2 = x2 + y2」=「x = ±√(r2 − y2)」なので、
  x = ±√(502 − 252)
    = ±√1875 = ±25√3
辺の長さは必ず「+」の為、結果「x = 25√3」となります。
ここから「xとy」を使用して「角度θ」も求めてみます。
  「θ = atan(y/x)」(逆三角関数)を使用します。
  θ = atan( 25/25√3 )
    = (1/6)π[rad] ←「30°」
結果、以下の形となります。
  


「(三平方)ピタゴラスの定理」の応用(要「直角三角形」)
「(三平方)ピタゴラスの定理」の応用を使う事で、
  「2つの辺の長さ」から「1つの辺の長さ」を簡単に求める
  「1つの三角比(sinθ、cosθ、tanθ)」から「他の2つの三角比」を求める
事が出来ます。
  



「三角比」の前準備


「三角比」では角度の記述に「度数法(ディグリー)」を使う
「sinθ、cosθ、tanθ」の事を「三角関数」とか「三角比」と言います。
「直角三角形」の「各辺の比率」は「sinθ、cosθ、tanθ」の「三角比」で表し、
「直角三角形」の「角度θ」は「0°〜90°の範囲内」を主に使用します。
そのため
  「三角比」を扱う時は普段から馴染みのある「度(度数法)」で表記
するのが良いでしょう。

「三角関数のsinθ、cosθ、tanθ」は「三角比のsinθ、cosθ、tanθ」を発展させたもので、
「0°〜90°の範囲外」の角度や「360度以上」の角度を扱う事になります。
「三角関数」では「単位円」と言われる円の上に「直角三角形」を配置したイメージで
円の回転周期や扇型の弧の長さの計算などを行う事になります。
円関係の計算では式の中に常に「π」が出てくる為、
円関係の計算がしやすい「ラジアン」で表記した方が計算がしやすくなります。

従って角度の記述は、
  「三角比」では「度数法(ディグリー)」
  「三角関数」では「弧度法(ラジアン)」
を使って基本的には計算を行うのが一般的です。

「三角比」を学ぶ為、ここから先は「度数法」の表記で計算を行います。
「電卓」の場合は「ディグリー(度数法)」モードにして計算を行って下さい。


「三角比」の為の前知識(重要)
「角度θ」「(rに対する)yの比率」「(rに対する)xの比率」「斜辺rの傾き」の
それぞれの「関係性」を考えてみると以下ように計算できます。
  
この結果を元にして「三角関数」「逆三角関数」の「関係性」を使うと、
以下ような相互関係で計算が出来ます。
  
「直角三角形」の「各辺」に対しての
  「yの比率(sinθ) xの比率(cosθ) rの傾き(tanθ)」の関係性
の事を「三角比」と呼びます。
この「三角比のsinθ、cosθ、tanθ」を使い、
「直角三角形」の「辺x、辺y、辺r、の値」や「角度θ」の元の値を計算してみます。
  
  とにかく「角度θ」さえ判明させてしまえば
  「sin(θ)、cos(θ)、tan(θ)」が計算可能となるので、
  「三角比」である「y比率sinA、x比率cosA、傾きtanA」が求まり
  結果、各値を求めやすくなる事がこの計算により分かると思います。

「角度θ」の「度数」を「sin、cos、tan」へ渡した時の答えは、
「計算機」があれば簡単に値を取得できますが、
「0°、30°、45°、60°、90°」の三角比「sinθ、cosθ、tanθ」
の値は頻繁に利用されるため、なんとか覚えておいた方が良いです。
これらの値の一覧表である「三角比表」や「三角関数表」と言われる
表の覚え方を学んで行きます。


三角比表「sinθ cosθ tanθ」値(「角度θ」を「比率や傾き」へ変換)の覚え方
「角度θ」を「比率や傾き」へ変換するのに、
「y比率=sin(30°)、x比率=cos(30°)、傾き=tan(30°)」など、
計算式に出る度に「計算機」で計算しても良いのですが、
ある程度の「角度θ」(0°、30°、45°、60°、90°)の「sinθ、cosθ、tanθ」は
覚えておいて損は無いです。
小学校で使用した「2種類の三角定規」を思い出して下さい。
「2種類の三角定規」の角度は「30°45°60°90°」の組合せで構成されていましたね。
「2種類の三角定規」の「各辺の比率」さえ覚えてしまえば以下のように
「sin、cos、tanの30°、45°、90°の値」を「比率や傾き」の値へ変換計算が出来ます。
  
「0°と90°」は以下のように考えます。(「直角三角形」は「ただの直線」となります)
  
これらの情報を元に「0°、30°、45°、60°、90°」の「sinθ、cosθ、tanθ」を
表にすると以下の形となります。
  
「角度θ」が「90°」を超えた時は以下のように考えます。
  
  √2=1.41421356(ひとよひとよにひとみごろ)
  √3=1.7320508(ひとなみにおごれや)
  でしたね。


「sinθ cosθ tanθ」表の覚え方2(分母の有理化済み)
「(分母の)有理化済み」の表の覚え方も紹介しておきます。
「母数の有理化」について…
「有理化」とは「√」が取れた数値です。
  分数の「母数を有理化」すると計算がしやすい場合があります。
  
  正直有理化するかの判断は、その都度自分の扱いやすい方を選べば良いと思います。
  (有理化しておけば「方程式や不等式」などで
  「両辺に分母と同じ数を掛け分母を消しやすい」ので便利です)
「sin(45°)」の「分母を有理化」してみるとこんな感じです。
  

「sinθ、cosθ」の「母数が有理化済み」の表は以下のように覚えます。
  
「角度θ」が「90°」を超えた時は以下のように考えます
  

この「表」を「手の指」で覚える方法は覚えやすいのでおすすめです。
(外国での三角比の覚え方を元にして私なりに拡張、アレンジさせた覚え方です)
もし「表」が覚えられなくても極論すると困る事は無いのですが、
「分母を有理化」させる為の計算は必ず理解しておいて下さい。
「関数電卓」などで「sinθ、cosθ、tanθ」の計算を行うと、
必ず「母数が有理化」された値が計算結果として表示さる為です。



「三角比」


「三角関数」と「逆三角関数」と「比率と傾き」と「ピタゴラスの定理」まとめ
「三角比」について説明するために「三角関数」と「逆三角関数」と
「比率と傾き」と「ピタゴラスの定理」の式を一度まとめておきます。
  
「対辺、底辺、斜辺」について
上図、左上の「直角三角形」には「対辺y、底辺x、斜辺r」と書いてあります。
これまで「三角関数で扱う直角三角形」の各辺は
  「y、x、r」で表現してきました。
これは本来、
  yの辺→「対辺」(対辺は「角度θ」と接しない)
  xの辺→「底辺」(底辺の左側には常に「角度θ」があります)
  rの辺→「斜辺」(斜辺は底辺と対辺を結ぶ斜めの辺)
とそれぞれを呼びます。
このように呼ぶことで「直角三角形」が回転や反転した時でも、
  「(三角比の)底辺の比率、対辺の比率、斜辺の傾き」各辺の関係性は同じなので
  「座標のxy」とは別物として個別に計算できて便利な呼び方だからです。
  
  『「三角比」の回転と反転』については後述しますのでそちらで学びます。
  今は「直角三角形」の各辺「対辺、底辺、斜辺」の位置関係が分かれば良いです。

「三角比」の「角度θ」による見え方の変化と「単位円」
「直角三角形」の「角度θ」は「0°<θ<90°」の範囲です。
  
これを「90°<θ<180°」の範囲まで広げると形は「扇型や三角形」となり、
「直角三角形」では無くなってしまいます。
  
しかしこの「扇型や三角形」から余った下図の位置に「直角三角形」を見いだせば、
「90°<θ<180°」位置上に「新たな直角三角形」を常に表現する事ができます。
  
この表現方法を使い、
  「角度θ」が「0°<θ<90°」の範囲の「直角三角形」の「三角比」と
  「角度θ」が「90°<θ<180°」の範囲の「直角三角形」の「三角比」を
  「単位円」と言われる「半径r=1」に固定された円の上に配置してよく使用します。
「単位円」は
  「単位円」と言われる円、半円(「単位円」では必ず半径r=1となる)
  「xy座標」(xy座標の中心が「単位円」の中心となる)
  「直角三角形」(「三角比」対辺yの比率、底辺xの比率、斜辺rの傾き、角度θ)
の組合せでよく使われる円です。

まずは「普通の正円」に
  「角度θ」が「0°<θ<90°」の範囲の「直角三角形」
  「角度θ」が「90°<θ<180°」の範囲の「直角三角形」
をの「2つの直角三角形」を配置してみましょう。
  
次にこの「普通の正円」を「単位円」つまり「半径r=1」に変換します。
これにより「2つの直角三角形」は「三角比」に変換されます。
(「yの値」が「対辺の比率sinA」に、「xの値」が「底辺の比率cosA」に変換される)
  
  「単位円」に変換する事で「2つの直角三角形」が「三角比」化されるので、
  「三角比(対辺yの比率sinA、底辺xの比率cosA、斜辺rの傾きtanA、角度θ)」
  つまり、原点からの「xの値とyの値の比率」が分かるようになりました。
  (この図は「角度θ」が「0°<θ<90°」の範囲と「90°<θ<180°」の範囲にある
  「2つの三角比(直角三角形)」と認識しておいて下さい。
  『「三角比」の「回転や反転」』とはまったく無関係ではないのですが、
  この時点ではあくまで別物として扱います。)


「三角比」ってなに?(要「直角三角形」)
「三角比」とは「直角三角形」の各辺の「比率と傾き」の事です。
  「直角三角形」は「角度θ」が変化する事によって
  「xに対するrの傾き」が変化しその結果、
  「r、x、y」それぞれの比率が変化します。
  その比率の変化は「sinA、cosA、tanA」を使うと知る事が出来ます。
  この事を「三角比」と言います。
「三角比」のイメージは以下の形となります。
  
  「対辺率sinA、底辺率cosA、傾きtanA」が「三角比」の基本です。
  ここで注目したいのは、なんとか「角度θ」の値を判明させてしまえば
  「sinA=sinθ、cosA=cosθ、tanA=tanθ」と「角度θ」を使い、
  「yの比率sinA」「xの比率cosA」「傾きtanA」が楽に計算できると言う事です。
  「角度θ」の値が知りたい場合、
  「角度θ」が「0°<θ<90°」の範囲の「直角三角形」であれば、
  「逆三角関数asin(sinA)、acos(cosA)、atan(tanA)」を
  「関数電卓」で計算する事で「角度θ」を求める事が可能です。
「三角比」のイメージは上で示した図だと少しごちゃっとしているので、
普段はもっとシンプルに考えます。以下の図を見て下さい。
  「左図:三角比」と「右図:実際の値」の関係
  
  この左図のように、「底辺xの比率」「対辺yの比率」「斜辺rの傾き」を
  の事を「cosA、sinA、tanA」と「直角三角形」に直接記載する表現は
  非常に良く目にします。覚えておきましょう。
  (この表記の方が『「三角比」が「回転や反転」』した時に理解しやすくなります。)

「三角比」では、
  「対辺の比率sinA * r =  対辺x値」
  「対辺の比率cosA * r =  底辺y値」
により「rの長さ」が変化した時の「x値y値」が簡単に求まります。
「三角比」を使うと他にも沢山便利な事が起きるのが後々分かってくると思います。
よく使う「三角比」を使った例題をのせておきます。
三角比の例題1(sinA)
  
三角比の例題2(cosA)
  

では、
ここまでの事を踏まえて「三角比の公式」を3つ紹介します。
3つの「三角比の公式」を駆使すれば、
「直角三角形」の「sinA、cosA、tanA」のどれか1つがわかった時点で、
他の2つの値を筆算で求める事が出来るようになります。
(本当は3つの「三角比の公式」を駆使しなくても、
「関数電卓」で「asin(sinA)、acos(cosA)、atan(tanA)」を使い、
「角度θ」を求めてしまえば「sinA、cosA、tanA」全てを簡単に求める事が出来ます。
「逆三角関数asin(sinA)、acos(cosA)、atan(tanA)」を筆算で求める方法は
今回はやりませんが、後々できたら学びたいと思います。)


「三角比」の公式1
「sinA、cosA、tanA」の内2つを使い、残りの1つを求める事が出来る公式。
  
「sinA、cosA、tanA」の定義を『「三角比」の公式1』を使い求めてみます。
  


「三角比」の公式2
「sinA、cosA」の内どちらか1つを使い、残りの1つを求める事が出来る公式。
  
「角度θ」に対して二乗されているのではなく、
「対辺比率sinA、底辺比率cosA」に対して二乗されている事に注意して下さい。
  

この『「三角比」の公式2』は「ピタゴラスの定理」そのものです。
  
「ピタゴラスの定理」は「三角比の対辺率sinAと底辺率cosA」にも当てはまるので、
  
  とすれば「三角比の公式2」と同じと言えます。

半径が「斜辺r=1」となるように見立てた「単位円」に「直角三角形」を配置し
「対辺の比率sinA」と「底辺の比率cosA」求めると以下のようになります。
  
  この「x2+y2=1」の考え方は結構重要です。
  「円の半径rが1の時」は常に「x2+y2=半径1」が成り立ちます。
「三角比の公式2」で「sinAやcosA」の個々を求めると以下の形となります。
  


「三角比」の公式3
「cosA」から「tanA」を求める事が出来る公式。

この公式は『「三角比」の公式1』の式から
『「三角比」の公式2』を使って変形させた式となります。
  


「三角比」の公式の使用
  



「三角関数」と「象限」


「三角関数」を使ってみる(象限)
「xy座標」の中心に自分がいて周りに「1つの物体」があるとします。
その時「自分」から「1つの物体」までの、
  「距離、角度、xy座標位置」
の関係を「直角三角形」を使えば「三角関数」と「単位円」により知る事ができます。

「1つの物体」までの距離が「本当に1(単位円と同じ)である」と仮定して
  「角度θ、x値(x比率)、y値(y比率)」
の各値を計算で求めてみますので「象限」という考え方について理解をして下さい。
(本当なら「単位円」で「物体まで距離r=1に対するx比率とy比率」を求めたら、
その「x比率とy比率」に対して「実際のr値」を掛けます。
それにより実際の「x値、y値」の値が取得できます)

「三角関数」では本来「角度の表記」を「ラジアン表記」で計算するのですが、
ここではイメージしやすいように「度数法の表記」で計算していきます。


「xy座標」と「象限」について
「xy座標」の「中心に自分」がいるとして、
「右上、左上、左下、右下」の座標の事をそれぞれ「象限」と呼びます。
  
上図のように4つそれぞれの領域の「象限」には
  「第1象限」…(右上領域「+x、+y」)
  「第2象限」…(左上領域「−x、+y」)
  「第3象限」…(左下領域「−x、−y」)
  「第4象限」…(右下領域「+x、−y」)
と名前が付きます。

「三角比の拡張(三角関数)」の「解き方基本」
  「三角関数」の事を「三角比の拡張」と言う事があります。
  この「三角比の拡張の3つの式」は今後頻繁に利用しますので、
  しっかりと覚えておいて下さい。
  


「第1象限」の「三角関数」
  「第1象限」の領域に「1つの物体」がある時、以下のようなイメージとなります。
  
  (説明①)「角度θ」の計算方法は「象限」により変わります。
  後述『「逆三角関数」と「象限」』を確認して下さい。

「第2象限」の「三角関数」
  「第2象限」の領域に「1つの物体」がある時、以下のようなイメージとなります。
  
  (説明①)「角度θ」の計算方法は「象限」により変わります。
  後述『「逆三角関数」と「象限」』を確認して下さい。

「三角関数」の表
「第1象限」「第2象限」の領域に対象物がある時に必要となる「三角関数表」
  

「第3象限」「第4象限」の領域に対象物がある時に必要となる「三角関数表」
  

「第3象限」の「三角関数」
  「第3象限」の領域に「1つの物体」がある時、以下のようなイメージとなります。
  
  (説明①)「角度θ」の計算方法は「象限」により変わります。
  後述『「逆三角関数」と「象限」』を確認して下さい。  

「第4象限」の「三角関数」
  「第4象限」の領域に「1つの物体」がある時、以下のようなイメージとなります。
  
  (説明①)「角度θ」の計算方法は「象限」により変わります。
  後述『「逆三角関数」と「象限」』を確認して下さい。

「象限」の範囲と性質
「中心の自分」から見た「対象物」がどの「象限の領域(角度)」にあるかで、
「y比率sinA、x比率cosA、傾きtanA」のそれぞれに
「−マイナス」が付いたり外れたりします。
  
第1象限…(「sinA、cosA、tanA」すべて+)
  「x軸上側」+側sinA、「y軸右側」+側cosA、「傾き右肩上がり」+x+y側tanA
第2象限…(「sinA」のみ+)
  「x軸上側」+側sinA、「y軸左側−側cosA、「傾き右肩下がり−x+y側tanA
第3象限…(「tanA」のみ+)
  「x軸下側−側sinA、「y軸左側−側cosA、「傾き右肩上がり」−x−y側tanA
第4象限…(「cosA」のみ+)
  「x軸下側−側sinA、「y軸右側」+側cosA、「傾き右肩下がり+x−y側tanA

0° 360° … sinA=±0、cosA=+1、tanA=±0
90° … sinA=+1、cosA=±0、tanA=×不定
180° … sinA=±0、cosA=−1、tanA=±0
270° … sinA=−1、cosA=±0、tanA=×不定


「単位円」上での「三角関数」の定義と公式
「単位円」上の「三角関数sin、cos、tan」は常に以下ように定義されます。
  y= sin(θ)*半径r= sin(θ)*半径1= sin(θ)
  x= cos(θ)*半径r=cos(θ)*半径1=cos(θ)
つまり
  「単位円」上では常に
  y=sin(θ)
  x=cos(θ)
となります。
そして「単位円」上でも『「三角比」の公式』がそのまま使用出来ます。
  
  「三角関数」では常に「第?象限」の領域にいるかを意識する事。
  「象限」の領域により「sinA、cosA、tanA」の各「+−」状態が変化します。



「逆三角関数」と「象限」


「三角関数」と「逆三角関数」の「角度θ」について
「三角関数(sinA、cosA、tanAを求める)」では
  「第1〜4象限」の各範囲を含む「0°〜360°」の範囲中の「角度θ」であれば、
  その「角度θ」を「直角三角形の斜辺」に見立てる事により、
  「sin(θ)、cos(θ)、tan(θ)」をつかって、
  「対辺率、底辺率、傾きを求める事が可能です。
「逆三角関数(角度θを求める)」では
  「第1象限」の範囲を含む「0°以上 〜 90°未満」の範囲中の「角度θ」であれば、
  その「角度θ」を「直角三角形の斜辺」に見立てる事により、
  「asin(sinA)、acos(cosA)、atan(tanA)」を使って
  「角度θ」を求める事が可能です。


「主値」と「Asin()、Acos()、Atan()」について
「逆三角関数(角度θを求める)」を使えば「0≦θ<90°」の範囲内ならば、
  
の式が成り立つ事は分かりました。
では、「90°〜360°」の範囲の「角度θ」を知りたい場合はどうするのでしょうか。
以下のようになります。
  
  「逆三角関数asin()」の「主値」(正しい角度θを返す範囲)は
    「270° ≦ 角度θ ≦ 90°」←(asin()の主値範囲、Asin())
  「逆三角関数acos()」の「主値」(正しい角度θを返す範囲)は
    「0° ≦ 角度θ ≦ 180°」←(acos()の主値範囲、Acos())
  「逆三角関数atan()」の「主値」(正しい角度θを返す範囲)は
    「270° < 角度θ < 90°」←(atan()の主値範囲、Atan())
  「逆三角関数」を使い求める「角度θ」が「主値」の範囲内であれば
  常に正しい「角度θ」を求める事ができます。
「主値」の範囲内の時は分かりやすいように、
「逆三角関数」の「頭文字(イニシャル)」を
  「Asin(sinA)、Acos(cosA)、Atan(tanA)」
  「Arcsin(sinA)、Arccos(cosA)、Arctan(tanA)」
  「Sin-1(sinA)、Cos-1(cosA)、Tan-1(tanA)」
のように「大文字」で記述する事が一応のルールとなっています。


「逆三角関数」を使ってみる(主値)
「1つの物体」までの距離が「本当に1(単位円と同じ)である」と仮定して
  「x比率sinA(x値)、y比率cosA(y値)、傾きtanA」から「角度θ」
の値を「逆三角関数」で求めたとき、
「主値」の範囲内であれば正しい「角度θ」を取得できます。
ここでは「象限」に対する「主値」という考え方について理解をして下さい。

以下で各「象限」の時の「逆三角関数Asin()、Acos()、Atan()」について
説明していきますが、
「象限」によっては「asin()、acos()、atan()」で記述した式が書かれます。
このように「アルファベットの頭文字が小文字」で記述された式では
「主値」の範囲外となる「逆三角関数」を使い無理矢理答えを求めていますので、
とりあえず無視して下さい。
あくまでも、
「Asin()、Acos()、Atan()」で記述された式が「主値」となります。

「第1象限」の「逆三角関数」
  「第1象限」領域にある「1つの物体」への「角度θ」を「逆三角関数」で求めます。
  
  「第1象限」は「Asin()、Acos()、Atan()」全ての「主値」範囲内です。
  「Asin()、Acos()、Atan()」の全てで正しい「角度θ」が取得できます。

「第2象限」の「逆三角関数」
  「第2象限」領域にある「1つの物体」への「角度θ」を「逆三角関数」で求めます。
  
  「第2象限」は「Acos()」の「主値」範囲内です。
  「Acos()」でのみ正しい「角度θ」が取得できます。
  「atan()」に「+180°」しても正しい「角度θ」が取得できます。
  (後述『傾きの特性「tanA、atan()」』にて説明)

「第3象限」の「逆三角関数」
  「第3象限」領域にある「1つの物体」への「角度θ」を「逆三角関数」で求めます。
  
  「第3象限」は「主値」の範囲内に入る「逆三角関数」は存在しません。
  「主値」では正しい「角度θ」を取得する事ができません。
  「atan()」に「+180°」すれば正しい「角度θ」が取得できます。  
  (後述『傾きの特性「tanA、atan()」』にて説明)

「第4象限」の「逆三角関数」
  「第4象限」領域にある「1つの物体」への「角度θ」を「逆三角関数」で求めます。
  
  「第4象限」は「Asin()、Atan()」の「主値」範囲内です。
  「Asin()、Atan()」で正しい「角度θ」を取得する事ができます。

「0° 90° 180° 270° 360°」のときは?
「第1〜4象限」のどの象限にも属さない角度、
「0° 90° 180° 270° 360°」の時、
「sinA」(y軸)と「cosA」(x軸)が
「+プラスか−マイナスか0」のどの値になるのかをまとめておきます。
  
「0°(360°)」
  sinAやy=0
  cosAやx=+プラス値(0より上)
  であれば「0°」となります。(傾きtanA=0)
「90°」
  sinAやy=+プラス値(0より上)
  cosAやx=0
  であれば「90°」となります。(傾きtanA=×不定)
「180°」
  sinAやy=0
  cosAやx=−マイナス値(0より下)
  であれば「180°」となります。(傾きtanA=0)
「270°」
  sinAやy=−マイナス値(0より下)
  cosAやx=0
  であれば「270°」となります。(傾きtanA=×不定)


傾きの特性「tanA、atan()」
「傾きの特性1」(主値)
  「逆三角関数atan()」の「主値」は「270° < 角度θ < 90°」なので、
  「270° < Atan(tanA) < 90°」の範囲内であれば正しい値が得られます。
  

「傾きの特性2」(「cosAやx」が「−マイナス値」場合は「+180°」)
  「主値」の範囲外の時は「+180°」すれば正しい値が得られます。
  (但し「90°と270°」においては「×不定」となる為除く)
  
  これは、
    「傾きtanA」は「180°」毎に同じ値となる
    (「tanAの周期は180°」である)
  と言う事ですので、「傾きtanA」は以下のイメージをとなります。
   

  「逆三角関数atan()」で正しい一つの「角度θの値」を得ようとした場合、
    「現象」か
    「cosAやx」が「−マイナス値」か
  のどちらかの情報が必要となります。

「傾きの特性3」(「角度θ」による「tanA」の数値の変化)
  「時計回り」に「270°から90°を目指す」と「tanAの値」は
  「−∞から+∞」へと向かいます。
  「反時計回り」に「270°から90°を目指す」と「tanAの値」は
  「+∞から−∞」へと向かいます。
  



「三角比」の回転と反転


「三角比」の回転をする為の前知識
内角の和は常に「180°」
  

外角の定理
  

「三角比」の「回転、反転」とは…
  「三角比」の「回転、反転」とは
  「角度θの変換」をする事です。
「角度θの変換」には「回転して変換」と「反転して変換」があります。
スタンダードな状態
  
にある「角度θの変換」をするのですが、
主に、
  「回転90°+」、「回転180°+」
  「反転0°−」、「反転90°−」、「反転180°−」
の5種類で「変換」を行います。
「変換後」も「x軸、y軸、第1〜第4象限」の形状に違いはありません。
「角度θ」は「変換後」には新たな「角度θ」の角度を指す形となります。


「三角比」の「回転0°+」「回転360°+」
「単位円」上に「三角比(sinA、cosA、tanA)」で「角度θ」を表現します。
  sin(θ)=sinA
  cos(θ)=cosA
  tan(θ)=tanA  
「回転も反転もされていない三角比(三角関数)」ですので特に「変換」の無い表現です。
故に「角度θ」は特に変化しません。
『sin(θ) cos(θ) tan(θ)』
  (『sin(360°+θ) cos(360°+θ) tan(360°+θ)』でも同じ角度)
  


「三角比」の回転の表現2種類「回転90°+」「回転180°+」
「三角比(sinA、cosA、tanA)」を回転させて「角度θ」を変換する方法は
主に以下の2種類となります。
『sin(90°+θ) cos(90°+θ) tan(90°+θ)』
  
  (「90°」が絡んだ時「傾きtanA」は「逆数となります」)
  実際の変換は以下のように行います。
  

『sin(180°+θ) cos(180°+θ) tan(180°+θ)』
  
  実際の変換は以下のように行います。
  
  
  この解き方の理屈さえ理解しておけば、
  「回転」に関しては公式を暗記しなくても逆算により公式を思い出す事が出来ます。


「三角比」の反転の表現3種類「反転0°−」「反転90°−」「反転180°−」
「三角比(sinA、cosA、tanA)」を反転させて「角度θ」を変換する方法は
主に以下の3種類となります。
『sin(−θ) cos(−θ) tan(−θ)』
  (『sin(0°−θ) cos(0°−θ) tan(0°−θ)』でも同じ角度)
  
  実際の変換は以下のように行います。
  

『sin(90°−θ) cos(90°−θ) tan(90°−θ)』
  
  (「90°」が絡んだ時「傾きtanA」は「逆数となります」)
  実際の変換は以下のように行います。
  

『sin(180°−θ) cos(180°−θ) tan(180°−θ)』
  
  実際の変換は以下のように行います。
  

  
  この解き方の理屈さえ理解しておけば、
  「反転」に関しては公式を暗記しなくても逆算により公式を思い出す事が出来ます。


ここまでの内容で、
「三角関数」の基本的な部分はある程度理解出来ている状態になったと思います。
ここから先は「三角関数」をプログラム上で使用する事に焦点を当てて
説明を行います。



凄く便利。「atan2」について


x値y値を元にθを取得する
xy座標をプログラム上で扱う際、
  「自分から見た(相対的な)1つの物体の
  x値y値を元に角度θを取得」
を行いたい状況がよく発生します。

「逆三角関数」などの
  「θ = atan(y / x)」
をうまく使えば計算できますが、
  「x = 0」の際は『0で割る「0除算」』となるエラー(計算不可)処理の発生
  「第1、4象限」と「第2、3象限」での同角度の傾きに対する判別処理の発生
などと、色々と気を使ってプログラムする必要があります。

C#では「atan2」関数を使用る事で、これらの処理問題を全て解決出来ます。
「atan2」は「atan」を使いやすく拡張した物です。
「atan2」の引数に「対象物のxy座標」を渡せば、
簡単に「対象物への角度θ[rad]」を得る事が出来ます。
残念ながら「関数電卓」には「atan2」の機能はありません。
「C#などのプログラム」にのみ実装されている機能です。


三角関数系、+1パターン。座標から角度を求める(要「直角三角形」)
atan2(y座標, x座標)」(「θ」を「y」と「x」から求める。-値含む全座標対応)
「atan2」は「-値含む全座標対応」の為、かなり実用的です。
xy座標値を渡せば360°全ての角度で正しいラジアン角度の値を返してくれます。


プログラム例
「x = 25√3」「y = 25」の場合
「atan2(y,x)」を行うと、
戻り値が「0.5235987755983…[red]」つまり「30°」となる。

  
            double x1 = 25 * Math.Sqrt(3); // 25√3
            double y1 = 25;
            double radianAngle = Math.Atan2(y1, x1); //ラジアン角度取得
            double degreeAngle = radianAngle / Math.PI * 180; //度数法に変換
            MessageBox.Show(">>"+ degreeAngle.ToString()+"°"); //表示「>>30°」


「関数電卓」の 「ベクトル計算」機能を使い角度を計算する場合
「関数電卓」に「ベクトル計算」機能があれば角度計算が可能です。
まず、「関数電卓」を「ベクトル計算」のモードにして下さい。
次に、「2次元」のベクトルを2つ登録します。
  「VctA」へ「[0, 10]」等を登録後、(「x」を10としたが、「x」は幾つでもよい。)
  「VctB」へ「[25, 25√3]」(25√3→43.30127019)を登録します。
「ベクトルのなす角」を選択し、
  「Angle(VcaA, VcaB)」
のように計算が出来る「関数電卓」であれば、
  「0.5235987755983[red]」か「30°」
と角度の計算結果が表示されると思います。

  


2点間座標から角度と直線距離を計算、角度と距離からxy座標を計算(プログラム例)
「2点間座標から角度を計算」「2点間座標から直線距離を計算」
「角度と距離からxy座標を計算」のプログラム例です。
        /// <summary>
        ///2点間の角度を計算
        /// </summary>
        private double GetDegreeAngle(double aX, double aY, double bX, double bY)
        {
            double radianAngle = Math.Atan2((bY - aY), (bX - aX));
            return (radianAngle / Math.PI * 180);
        }

        /// <summary>
        ///2点間の直線距離を計算
        /// </summary>
        private double GetDistance(double aX , double aY, double bX , double bY)
        {
            double distance = Math.Sqrt(Math.Pow((bX - aX), 2) + Math.Pow((bY - aY), 2));
            return distance;
        }

        /// <summary>
        ///角度と距離からxy座標を計算
        /// </summary>
        private Tuple<double,double> GetToXY(double degreeAngle, double distance)
        {
            double radianAngle = degreeAngle * Math.PI / 180;
            double resultY = Math.Sin(radianAngle) * distance;
            double resultX = Math.Cos(radianAngle) * distance;
            return Tuple.Create(resultX, resultY);
        }

以下のような形で使用します。
            double x1 = 0;
            double y1 = 0;
            double x2 = 25 * Math.Sqrt(3); // 25√3→43.3012701…
            double y2 = 25;

            //2点間の角度を計算
            double resultDegreeAngle = GetDegreeAngle(x1, y1, x2, y2);
            //表示「角度>>30°」
            MessageBox.Show("角度>>" + resultDegreeAngle.ToString() + "°");
         
            //2点間の直線距離を計算
            double resultDistance = GetDistance(x1, y1, x2, y2);
            //表示「距離>>50」
            MessageBox.Show("距離>>" + resultDistance.ToString());

            //角度と距離からxy座標を計算
            Tuple<double, double> resultXY = GetToXY(30.0, 50.0);
            //表示「座標x>43.3012701892219 座標y>25」
            MessageBox.Show("座標x>" + resultXY.Item1 +" 座標y>"+resultXY.Item2); 


上を0°とした時計回りの角度での変換
「atan2」の角度を人がイメージしやすい以下の角度に変換してみます。
  
「反転90°−θ」を使えばなんとかなりそうです。
  
実際に作成した
「getAngleChange」関数と「getAngleChangeAtan2」関数のコードは以下の形となります。
        /// <summary>
        ///「右0°の反時計回り←→上0°の時計回り」角度変換
        /// </summary>
        private double getAngleChange(double radianAngle)
        {
            double y1 = Math.Sin(radianAngle);
            double x1 = Math.Cos(radianAngle);
            //「90°-θ」をする為、引数のyとxを入れ替える
            double newRdianAngle = Math.Atan2(x1, y1);
            return newRdianAngle;
        }

        /// <summary>
        ///上を0°とした時計回りの角度をラジアンで返す
        /// </summary>
        private double getAngleChangeAtan2(double y1, double x1)
        {
            //「90°-θ」をする為、引数のyとxを入れ替える
            double radianAngle = Math.Atan2(x1, y1);
            return radianAngle;
        }

「getAngleChange」「getAngleChangeAtan2」使用例
            string msgtxt = "";
            for (int i = 0; i < 9; i++)
            {
                double radianAngle = i * (Math.PI / 4);//i*45°

                //atan2で計算(度数法表記)
                msgtxt += "(atan2)";
                msgtxt += (radianAngle / Math.PI * 180).ToString() + "°>>";
                double tmpAngle = Math.Atan2(Math.Sin(radianAngle), Math.Cos(radianAngle));
                msgtxt += (tmpAngle / Math.PI * 180);
                msgtxt += "\n";

                //getAngleChangeで計算(度数法表記)
                msgtxt += "(getAngleChange)";
                msgtxt += (radianAngle / Math.PI * 180).ToString() + "°>>";
                double tmpAngle2 = getAngleChange(radianAngle);
                msgtxt += (tmpAngle2 / Math.PI * 180);
                msgtxt += "°(";
                msgtxt += Math.Round((tmpAngle2 / Math.PI * 180) * 100.0, MidpointRounding.AwayFromZero) / 100.0;
                msgtxt += "°)\n";

                //getAngleChangeで2回計算(度数法表記)
                msgtxt += "(getAngleChange)2回目";
                msgtxt += (radianAngle / Math.PI * 180).ToString() + "°>>";
                double tmpAngle3 = getAngleChange(tmpAngle2);
                msgtxt += (tmpAngle3 / Math.PI * 180);
                msgtxt += "°(";
                msgtxt += Math.Round((tmpAngle3 / Math.PI * 180) * 100.0, MidpointRounding.AwayFromZero) / 100.0;
                msgtxt += "°)\n";

                //getAngleChangeAtan2で計算(度数法表記)
                msgtxt += "(getAngleChangeAtan2)";
                msgtxt += (radianAngle / Math.PI * 180).ToString() + "°>>";
                double tmpAngle4 = getAngleChangeAtan2(Math.Sin(radianAngle), Math.Cos(radianAngle));
                msgtxt += (tmpAngle3 / Math.PI * 180);
                msgtxt += "°\n";
                msgtxt += "\n";
            }
            MessageBox.Show(msgtxt);

「atan2」と
作成した「getAngleChange」「getAngleChangeAtan2」とで
角度の違いは以下のようになります。
  

以下のような実行結果を得る事が出来るはずです。
  



「atan2」を自作する


「atan2」が返す角度
「atan2」は非常に便利な関数です。
引数に「対象物のxy座標」を渡せば、
簡単に「対象物への角度θ[rad]」を得る事が出来ます。
ここまで学んできた「三角関数」の知識を使い、
この「atan2」と同じ処理をする関数を自作してみようと思います。
  

「atan2」自作の為の準備
「atan2」を自作する為には、
処理のをどのようにすべきか考えてみます。
まず、
「x座標」が「0」の場合「y/x」が出来ない為、
「不定の回避」をする為の処理を考えます。
  
次に、
「x座標」が「0より大きく」なった時の処理を考えます。
  
そして、
「x座標」が「0より小さく」かつ、
「y座標」が「0以上」となった時の処理を考えます。
  
更に、
「x座標」が「0より小さく」かつ、
「y座標」が「0より小さく」なった時の処理を考えます。
  
あとは、これらの考えをプログラムに落とし込みます。


「myMakeAtan2」関数のプログラム
完成した「myMakeAtan2」関数は以下の形となります。
        /// <summary>
        ///「自作atan2」
        /// </summary>
        private double MyMakeAtan2(double y1, double x1)
        {
            double resultAngle = 0.0;
            //不定の回避処理
            //x座標が0の場合「tan(y/x)」がエラーとなるのでそれの回避
            if (x1 == 0)
            {
                if (y1 == 0)
                {
                    resultAngle = 0.0; //0°のラジアンを返す
                }
                else if (0 < y1)
                {
                    resultAngle = (Math.PI / 2); //90°のラジアンを返す
                }
                else if (y1 < 0)
                {
                    resultAngle = -(Math.PI / 2); //-90°(270°)のラジアンを返す
                }
            }
            //「-90°<角度θ<90°」の範囲の処理(x=0を除く)
            else if (0 < x1)
            {
                resultAngle = Math.Atan(y1 / x1);
            }
            //「90°<角度θ≦180°」「-180°<角度θ<-90°」の範囲の処理
            else if (x1 < 0)
            {
                //「90°<角度θ≦180°」
                if (0 <= y1)
                {
                    resultAngle = Math.Atan(y1 / x1) + Math.PI;
                }
                else if (y1 < 0)
                {
                    resultAngle = Math.Atan(y1 / x1) - Math.PI;
                }
            }
            return resultAngle;
        }

「myAtan2」使用例です。
            string msgtxt = "";
            for (int i = 0; i < 9; i++)
            {
                double radianAngle = i * (Math.PI / 4);//i*45°;
                //atan2で計算(度数法表記)
                msgtxt += "(atan2)";
                msgtxt += (radianAngle / Math.PI * 180).ToString() + "°>>";
                double tmpAngle = Math.Atan2(Math.Sin(radianAngle), Math.Cos(radianAngle));
                msgtxt += (tmpAngle / Math.PI * 180);
                msgtxt += "\n";
                msgtxt += "(MyMakeAtan2)";
                msgtxt += (radianAngle / Math.PI * 180).ToString() + "°>>";
                double tmpAngle2 = MyMakeAtan2(Math.Sin(radianAngle), Math.Cos(radianAngle));
                msgtxt += (tmpAngle2 / Math.PI * 180);
                msgtxt += "\n\n";
            }
            MessageBox.Show(msgtxt);

実行すると以下のような表示となります
  
うまく「atan2」と同じ結果の関数を自作出来ました。




C# 統計・微分積分・線形代数への道
次へ→http://1studying.blogspot.jp/2017/08/senkei-index.html#kuw02






以下のサイトを参考にしました。

三角比・三角関数
http://www24.atpages.jp/venvenkazuya/math1/trigonometric_ratio1.php
http://www24.atpages.jp/venvenkazuya/math1/trigonometric_ratio2.php
http://www24.atpages.jp/venvenkazuya/math1/trigonometric_ratio3.php
http://www24.atpages.jp/venvenkazuya/math1/trigonometric_ratio4.php
http://www24.atpages.jp/venvenkazuya/math1/trigonometric_ratio5.php
http://www24.atpages.jp/venvenkazuya/math1/trigonometric_ratio6.php

cos,sin,tanの値の対応表
http://www24.atpages.jp/venvenkazuya/math1/trigonometric_ratio6_table1.php

cos,sin,tan,cosec,sec,cotの値の対応表
http://www24.atpages.jp/venvenkazuya/math1/trigonometric_ratio6_table2.php

三角関数講座
http://78578203.at.webry.info/theme/7addd6aad5.html

三角比・三角関数の公式一覧。正弦・余弦・加法定理など
https://atarimae.biz/archives/18041

三角関数の基礎知識。sinθ cosθ tanθ の覚え方・孤度法・三角比の表まとめ
https://atarimae.biz/archives/18037

【図形と計量】sin,cos,tanの値の覚え方
http://kou.benesse.co.jp/nigate/math/a14m0313.html

高校で学べない人のための三角比と三角関数
http://www.geocities.co.jp/Technopolis/1505/sin.htm

逆三角関数の値
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1128926906

逆三角関数の「sin-1()」「Sin-1()」「asin()」「Asin()」の違い
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1191807661

Wiki:逆三角関数
https://ja.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0#.E9.80.86.E4.B8.89.E8.A7.92.E9.96.A2.E6.95.B0

数Iの三角比についての質問
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1134917496
sin(π/2+θ)=cosθ等の三角関数の公式の覚え方
http://integers.hatenablog.com/entry/2016/02/27/220804
【三角関数の基礎】必ず覚えておかなくてはならない5つの性質
https://juken-mikata.net/how-to/mathematics/sankakukansu.html
【三角関数の基礎】試験にでる要点まとめ
https://juken-mikata.net/how-to/mathematics/sankakukansu-youten.html
「sin(90° − θ) = cos θの加法定理を使った導きかた」
https://www.hmg-gen.com/sankaku90.pdf
三角比の公式 tanA=sinA/cosAの証明
http://manapedia.jp/text/2197
高校数学で習う三角関数の公式一覧と覚え方
加法定理の公式を覚えよう、積和公式を覚えよう、和積公式を覚えよう
http://media.studytown.jp/official-list-of-trigonometric-function/
数学Ⅰの三角比(サイン・コサイン・タンジェント)で使う公式の一覧
http://manapedia.jp/text/2177

90°+θ,180°+θなどの三角比の公式と覚え方
https://mathtrain.jp/kangenkoushiki

2つの座標から角度や距離を求める
https://qiita.com/arthur87/items/23d3c896dafbc8223fd5
2点間の距離と角度と座標の求め方
https://qiita.com/Hoshi_7/items/d04936883ff3eb1eed2d



0 件のコメント:

コメントを投稿

↑Topへ