2: 2015-03-23 (月) 12:37:45 osinko Deleted an attach file: trigon2.png at 2015-03-23 (月) 19:43:31, Deleted an attach file: trigon1.png at 2015-03-23 (月) 19:43:38 |
3: 2015-03-23 (月) 22:35:34 osinko Deleted an attach file: trigon1.png at 2015-03-23 (月) 19:49:58, Deleted an attach file: trigona_0.png at 2015-03-23 (月) 19:50:54, Deleted an attach file: 2dd687bd02294405f9e3b13f158ba9b9.png at 2015-03-23 (月) 19:57:30, Deleted an attach file: f251ae8248eb7f58752c4597e59b4629.png at 2015-03-23 (月) 19:57:32, Deleted an attach file: f4fffaa556cc1947882e537ec053c9dd.png at 2015-03-23 (月) 19:57:35, Deleted an attach file: 0cded19e12a181bf3e8388dbce4eb67e.png at 2015-03-23 (月) 19:57:37, Deleted an attach file: 78feedc804f38212694e84d9d5210330.png at 2015-03-23 (月) 19:57:38, Deleted an attach file: e1c2780d9457ca20ed35d48d38814082.png at 2015-03-23 (月) 19:57:41 |
||
---|---|---|---|
Line 1: | Line 1: | ||
TITLE:三角関数 | TITLE:三角関数 | ||
#jsmath | #jsmath | ||
- | 直角三角形は90度の直角と鋭角\(\theta\)(シータ)とで構成される | + | **三角比の定義 [#n0296726] |
- | &ref(trigon1.png); | + | 直角三角形は90度の直角と鋭角\(\theta\)(シータ)とで構成される。三辺は各々以下のように定義される。鋭角\(\theta\)は任意に決めることが出来る事に留意。証明では時にこの角を切り替える。それに従って対辺と隣辺が入れ替わる |
+ | &ref(trigona.png); | ||
+ | -直角に向かい合う辺を斜辺(hypotenuse) | ||
+ | -\(\theta\)に向かい合う辺を対辺(opposite) | ||
+ | -残りの辺(θから直角に向かう辺)を隣辺(adjacent) | ||
- | 三辺は各々以下のように定義される | + | 三角関数、sin(サイン:正弦:せいげん)、cos(コサイン:余弦:よげん)、tan(タンジェント:正接:せいせつ)は、この各辺の長さを比で表すので三角比と呼ばれる |
- | -直角に向かい合う辺を斜辺 | + | |
- | -\(\theta\)に向かい合う辺を対辺 | + | |
- | -残りの辺(θから直角に向かう辺)を隣辺 | + | |
- | &ref(trigon2.png); | + | |
- | + | ||
- | 三角関数、sin、cos、tanは、この各辺の長さを比で表すので三角比と呼ばれる | + | |
- | (この分数の関係式は英語の筆記体の書き順で憶えると良い。分母のほうから辺の長さを割り当てる) | + | |
\(\sin { \theta } =\frac { 対辺 }{ 斜辺 } \quad ,\quad \cos { \theta } =\frac { 隣辺 }{ 斜辺 } \quad ,\quad \tan { \theta } =\frac { 対辺 }{ 隣辺 } \) | \(\sin { \theta } =\frac { 対辺 }{ 斜辺 } \quad ,\quad \cos { \theta } =\frac { 隣辺 }{ 斜辺 } \quad ,\quad \tan { \theta } =\frac { 対辺 }{ 隣辺 } \) | ||
+ | この分数の関係式は頭文字の英語の筆記体の書き順で憶えると良い。分母のほうから辺の長さを割り当てる | ||
+ | &font(Red){sin,cosは斜辺が母(分母)と憶える。これはベクトルで考えたとき正規化の際「1単位」となる}; | ||
+ | |||
+ | 二つの角が同じ角度になる三角形同士は相似と言えるので、どんなに大きさが変わっても各辺の「比」は変わらない | ||
+ | &ref(trigonb.png); | ||
+ | 比は変わらないので斜辺rの長さを基準としてsinθやcosθの長さが導き出される式へと変形できる | ||
+ | &ref(2dd687bd02294405f9e3b13f158ba9b9.png); | ||
+ | tanθは一次関数式の傾きとしても取り扱える | ||
+ | &ref(e1c2780d9457ca20ed35d48d38814082.png); | ||
+ | |||
+ | **ラジアン(RadianAngles:弧度法) [#t390a9c0] | ||
+ | 三角関数では角の大きさを測る引数に弧の長さの実数であるラジアンを利用する。日本人が日常で角度を測る際、分度器などで使う°はオイラー角(EulerAngles)と呼ばれる単位値であり実数ではない(メートルやキログラム等の単位値と同類) | ||
+ | 1回転 = 360° = \(2\pi\) | ||
+ | 通常、角はギリシャ文字θ(シータ)を用いて表される。aを°によるオイラー角度とするとラジアンを求める式は以下になる | ||
+ | &ref(78feedc804f38212694e84d9d5210330.png); | ||
+ | 基本的にLの長さによる&font(Red){単位の無い実数となり y=cos(x)等の実数の関数式に対して比の値として扱える事になる};(だから三角関数に対してラジアンが利用される)。unityでMathf.sin関数に喰わせる引数もラジアンでありオイラー角ではないので注意。また相互変換には上記の式を利用すると便利だが\(\frac { \pi }{ 180 } \)は定数なのでunityには[[Mathf.Deg2Rad:http://docs.unity3d.com/ja/current/ScriptReference/Mathf.Deg2Rad.html]]などの専用のプロパティが用意されている。以下の章のサンプルコードで利用している | ||
+ | |||
+ | **三角関数の定義 [#s4879201] | ||
+ | ラジアンと単位円、三角比を用いた三角関数の定義。原点を中心とした半径1の円周上にあってx軸正の方向から反時計回りにラジアン角θを取った座標位置を(cosθ,sinθ)とする。この定義よりθはオイラー角90°を超える角度が扱える事となる。三角形OABは常に直角三角形になるので「三角比」の考えと同時に「三平方の定理」が適用できる(尚、半径1の円を単位円と呼ぶ) | ||
+ | &ref(0cded19e12a181bf3e8388dbce4eb67e.png); | ||
+ | コード例: | ||
+ | #code(csharp){{ | ||
+ | using UnityEngine; | ||
+ | using System.Collections; | ||
+ | |||
+ | public class Rad1 : MonoBehaviour | ||
+ | { | ||
+ | void Start () | ||
+ | { | ||
+ | print (Method (30 * Mathf.Deg2Rad)); | ||
+ | } | ||
+ | |||
+ | Vector2 Method (float theta) | ||
+ | { | ||
+ | return new Vector2 (Mathf.Cos (theta), Mathf.Sin (theta)); | ||
+ | } | ||
+ | } | ||
+ | }} | ||
+ | |||
+ | **負角、余角の公式 [#s9eafcd0] | ||
+ | θを時計回りに進めると負角(-)となり、以下の負角の公式が利用できる | ||
+ | \(\cos { (-\theta ) } =cos\theta \quad ,\quad \sin { (-\theta ) } =-\sin { \theta } \) | ||
+ | 直角\(\frac { \pi }{ 2 } \)からθを引いた余りの角を余角と呼び、以下の余角の公式が利用できる | ||
+ | \(\cos { \left( \frac { \pi }{ 2 } -\theta \right) } =\sin { \theta } \quad ,\quad \sin { \left( \frac { \pi }{ 2 } -\theta \right) = } \cos { \theta } \) | ||
+ | &ref(f251ae8248eb7f58752c4597e59b4629.png); | ||
+ | ※unityのMathfクラスsin,cos関数ではマイナスの引数でも上記の公式を内部で処理し正確に値を算出します | ||
+ | |||
+ | **atan [#y3e00982] | ||
+ | |||
+ | atan(アークタンジェント:逆正接) | ||
+ | atan は tan の逆関数になる(つまり傾きから角度を得る)。&color(#990000){atanを利用する事により内角θを求める事が出来る}。角度が判らない時に使うと便利 | ||
+ | 引数はtanθ=(sinθ/cosθ)を渡す。返り値はラジアン角θとなる | ||
+ | &ref(daum_equation_1412255954447.png) | ||
+ | |||
+ | <サンプルコード> | ||
+ | using UnityEngine; | ||
+ | using System.Collections; | ||
+ | |||
+ | public class Atan : MonoBehaviour | ||
+ | { | ||
+ | void Start () | ||
+ | { | ||
+ | print (Mathf.Cos (Mathf.Deg2Rad * 30)); | ||
+ | print (Mathf.Sin (Mathf.Deg2Rad * 30)); | ||
+ | print (Mathf.Sin (Mathf.Deg2Rad * 30) / Mathf.Cos (Mathf.Deg2Rad * 30)); //tan30° | ||
+ | print (Mathf.Tan (Mathf.Deg2Rad * 30)); | ||
+ | |||
+ | Vector2 vec = Vector2.right; //三角関数は数学的にX+が基準になる為、atanも例外ではない | ||
+ | print (vec); | ||
+ | vec = Quaternion.AngleAxis (30, Vector3.forward) * vec; //クォータニオンの後にベクトルを掛ける(反対はエラーが出るので注意) | ||
+ | print (vec); | ||
+ | print (Mathf.Atan (vec.y / vec.x) * Mathf.Rad2Deg); | ||
+ | print (Mathf.Atan2 (vec.y, vec.x) * Mathf.Rad2Deg); | ||
+ | print (Mathf.Atan (Mathf.Sin (Mathf.Deg2Rad * 30) / Mathf.Cos (Mathf.Deg2Rad * 30)) * Mathf.Rad2Deg); //tan30° | ||
+ | } | ||
+ | } | ||
+ | |||
+ | 出力 | ||
+ | |||
+ | 0.8660254 | ||
+ | 0.5 | ||
+ | 0.5773503 | ||
+ | 0.5773503 | ||
+ | (1.0, 0.0) | ||
+ | (0.9, 0.5) | ||
+ | 30 | ||
+ | 30 | ||
+ | 30 | ||
+ | |||
+ | この場合のvecは正規化が必要ない(引数にtanθを渡すという事は比だから) | ||
+ | |||
+ | **有名なsin,cos値 [#xc1bbc15] | ||
+ | |||
+ | 最低限、暗記しておいた方が良いsin,cos値 | ||
+ | |cos(0°)|1|sin(0°)|0| | ||
+ | |cos(30°)|√0.75 = 0.866~|sin(30°)|√0.25= 0.5| | ||
+ | |cos(45°)|√0.5= 0.7071~|sin(45°)|√0.5= 0.7071~| | ||
+ | |cos(60°)|√0.25= 0.5|sin(60°)|√0.75 = 0.866~| | ||
+ | |cos(90°)|0|sin(90°)|1| | ||
+ | オイラー角45度を境にsin,cosの関係が対称になっている | ||
+ | |||
+ | 上の表から以下の式で三平方の定理が成立している事が確認できる | ||
+ | cos(30°)^2 + sin(30°)^2 = 1 | ||
+ | 0.866^2 + 0.5^2 = 1 | ||
+ | 0.75 + 0.25 = 1 | ||
+ | |||
+ | **三角関数の表記注意点 [#t9eda5be] | ||
+ | |||
+ | 三角関数同士の掛算では以下の様に表記する必要がある | ||
+ | &ref(daum_equation_1412406275415.png) | ||
+ | sinABの様な書き方はNGなので注意 | ||
+ | |||
+ | 累乗表記は | ||
+ | &ref(daum_equation_1412438261779.png) | ||
+ | のように関数側の右肩に書く事が約束となっている | ||
+ | |||
+ | |||
+ | **三角関数プレーヤー_for_Unity [#sa79de2a] | ||
+ | |||
+ | 簡単な三角関数が理解できるサンプルプログラムを作ってみました | ||
+ | 以下のURLよりUnityWebPlayerにてプレイできます | ||
+ | |||
+ | &link(三角関数プレーヤー_for_Unity){https://dl.dropboxusercontent.com/u/87271864/Math_sincosCurve/Math_sincosCurve.html} | ||
+ | |||
+ | GitHubにてソースコードを公開しました | ||
+ | 一応、扱いはフリーライセンスです | ||
+ | |||
+ | &link(Osinko/SinCosGraph · GitHub){https://github.com/Osinko/SinCosGraph} | ||
+ | |||
+ | **Sinθの微分を求めてみて分る事 [#l5fd8429] | ||
+ | |||
+ | f(θ)=sin(θ)として微分する際、式の途中でsin(θ+Δθ)するが、この部分の計算は単純な計算ではうまく行かない | ||
+ | |||
+ | その原因は関数にあると考えられる | ||
+ | f(x-Δx)が正しく計算できる「その関数が持つ加法定理」を明確にしなければ、その関数に対する微分は出来ない | ||
+ | |||
+ | たとえばsin、cosの三角関数の場合、sin(θ+Δθ)をsin(a+b)として | ||
+ | |||
+ | -sin(a+b) = sin(a)cos(b)+cos(a)sin(b) | ||
+ | -sin(a-b) = sin(a)cos(b)-cos(a)sin(b) | ||
+ | -cos(a+b) = cos(a)cos(b)-sin(a)sin(b) | ||
+ | -cos(a-b) = cos(a)cos(b)+sin(a)sin(b) | ||
+ | |||
+ | という基本的な定理が単位円内の二つの直角三角形の相似関係から導ける | ||
+ | ここから式の足し算による変形で | ||
+ | |||
+ | -sin(a)cos(b) = 1/2{sin(a+b)+sin(a-b)} | ||
+ | -cos(a)sin(b) = 1/2{sin(a+b)-sin(a-b)} | ||
+ | -cos(a)cos(b) = 1/2{cos(a+b)+cos(a-b)} | ||
+ | -sin(a)sin(b) = -1/2{cos(a+b)-cos(a-b)} | ||
+ | |||
+ | という式が作れる。ここからさらにsin(a+b)-sin(a-b)をsinA-sinBとして考えると... | ||
+ | |||
+ | (以下省略) | ||
+ | |||
+ | |||
+ | *三角関数サンプルプログラム解説 [#k56680cb] | ||
+ | |||
+ | 一応ソースコードの解説をするとScripts/baseフォルダ内のスクリプトがグラフ描画用の汎用性を持たせたつもりのベクターメッシュ用ライブラリです。シーンに配置したGameObjectとしての個々のライン描画(VectorMesh)をunityのParticleSystem的にDictionaryクラスで辞書管理させています。ユーザーはこの辞書を使ってシーン内のベクターメッシュオブジェクトを一元管理できます(ベクターメッシュはゲームオブジェクトなので、ゲームオブジェクトとして消したりも出来ますが、そういう使い方を想定したつくりにしていません。削除には辞書クラスを経由して行うのが想定している使い方です。それによりパーティクルのライフタイムのような機能や一時的な非表示機能なども正常に運用できるようになります)。Scripts/meshLib/内のコードが個々のメッシュの作画用コードです。たとえばラインや円、グリッドなどを具体的に作画するコードです。Scripts / userLib / 内はVectorMeshクラスを継承したカスタム化された描画オブジェクトのクラスを作成しています。これは今回サインコサインカーブの逐次変化するリアルタイム描画をするベクターメッシュの仕様を担当させています。ここにあるコードのようにVectorMeshクラス継承すると様々なベクター描画が可能となるようなならないような感じです(汗)。正直使い易い形になってるとは思えないので、後々この辺りの仕様等は他のプログラムなどで改良していく予定は未定 | ||
+ | |||
+ | とりあえず数学的に色々な作画が可能になってきたので何か数学を使って面白い表現が出来るコードを今後も書いてみるつもりです | ||
+ | |||
+ | **資料 [#l2a743ec] | ||
+ | |||
+ | &link(長さの違う振り子を同時に動かすと...... - YouTube){http://www.youtube.com/watch?v=gViLqrT6UUU} | ||
+ | |||
+ | T:?? | ||
+ | L:重心からの長さ | ||
+ | g:重力 | ||
+ | |||
+ | T = 2 * Mathf.PI * | ||
- | 尚、直角三角形の鋭角\(\theta\)は任意に決めることが出来る事に留意 | ||
- | 証明ではこの角をよく切り替えるときがある。それに従って対辺と隣辺が入れ替わるが、そのような考えの切り替えにも慣れておくと良い | ||
#navi | #navi |