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 |
現: 2015-03-25 (水) 11:57:39 osinko | ||
---|---|---|---|
Line 9: | Line 9: | ||
三角関数、sin(サイン:正弦:せいげん)、cos(コサイン:余弦:よげん)、tan(タンジェント:正接:せいせつ)は、この各辺の長さを比で表すので三角比と呼ばれる | 三角関数、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 ,\tan { \theta } =\frac { \sin { \theta } }{ \cos { \theta } } =\frac { 対辺 }{ 隣辺} \) |
この分数の関係式は頭文字の英語の筆記体の書き順で憶えると良い。分母のほうから辺の長さを割り当てる | この分数の関係式は頭文字の英語の筆記体の書き順で憶えると良い。分母のほうから辺の長さを割り当てる | ||
- | &font(Red){sin,cosは斜辺が母(分母)と憶える。これはベクトルで考えたとき正規化の際「1単位」となる}; | + | &font(Red){sin,cosは斜辺が母(分母)と憶える}; |
二つの角が同じ角度になる三角形同士は相似と言えるので、どんなに大きさが変わっても各辺の「比」は変わらない | 二つの角が同じ角度になる三角形同士は相似と言えるので、どんなに大きさが変わっても各辺の「比」は変わらない | ||
&ref(trigonb.png); | &ref(trigonb.png); | ||
比は変わらないので斜辺rの長さを基準としてsinθやcosθの長さが導き出される式へと変形できる | 比は変わらないので斜辺rの長さを基準としてsinθやcosθの長さが導き出される式へと変形できる | ||
- | &ref(2dd687bd02294405f9e3b13f158ba9b9.png); | + | |&ref(sincos2.png);|\(r\cos { \theta } =r\frac { x }{ r } \quad \quad \rightarrow \quad \quad x=r\cos { \theta } \\ r\sin { \theta } =r\frac { y }{ r } \quad \quad \rightarrow \quad \quad y=r\sin { \theta } \)| |
+ | たとえばθ=30°斜辺rの長さが3.5の時のxとyの長さを知りたいときunityで計算するには以下のようなコードになる | ||
+ | |||
+ | <unityのコード例> | ||
+ | #code(csharp){{ | ||
+ | using UnityEngine; | ||
+ | using System.Collections; | ||
+ | |||
+ | public class trigon1 : MonoBehaviour | ||
+ | { | ||
+ | void Start () | ||
+ | { | ||
+ | float r, theta, x, y; | ||
+ | r = 3.5f; | ||
+ | theta = 30 * Mathf.Deg2Rad; //°(単位度)からラジアンへ変換 | ||
+ | x = r * Mathf.Cos (theta); | ||
+ | y = r * Mathf.Sin (theta); | ||
+ | print ("r=" + r + " θ=" + theta + " x=" + x + " y=" + y); | ||
+ | } | ||
+ | } | ||
+ | }} | ||
+ | #hr | ||
+ | 出力 | ||
+ | r=3.5 θ=0.5235988 x=3.031089 y=1.75 | ||
+ | #hr | ||
tanθは一次関数式の傾きとしても取り扱える | tanθは一次関数式の傾きとしても取り扱える | ||
&ref(e1c2780d9457ca20ed35d48d38814082.png); | &ref(e1c2780d9457ca20ed35d48d38814082.png); | ||
Line 23: | Line 47: | ||
三角関数では角の大きさを測る引数に弧の長さの実数であるラジアンを利用する。日本人が日常で角度を測る際、分度器などで使う°はオイラー角(EulerAngles)と呼ばれる単位値であり実数ではない(メートルやキログラム等の単位値と同類) | 三角関数では角の大きさを測る引数に弧の長さの実数であるラジアンを利用する。日本人が日常で角度を測る際、分度器などで使う°はオイラー角(EulerAngles)と呼ばれる単位値であり実数ではない(メートルやキログラム等の単位値と同類) | ||
1回転 = 360° = \(2\pi\) | 1回転 = 360° = \(2\pi\) | ||
- | 通常、角はギリシャ文字θ(シータ)を用いて表される。aを°によるオイラー角度とするとラジアンを求める式は以下になる | + | 通常、角はギリシャ文字θ(シータ)を用いて表される。aを°によるオイラー角度とするとラジアンを求める単位変換式は以下になる |
&ref(78feedc804f38212694e84d9d5210330.png); | &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]]などの専用のプロパティが用意されている。以下の章のサンプルコードで利用している | + | 基本的に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] | **三角関数の定義 [#s4879201] | ||
ラジアンと単位円、三角比を用いた三角関数の定義。原点を中心とした半径1の円周上にあってx軸正の方向から反時計回りにラジアン角θを取った座標位置を(cosθ,sinθ)とする。この定義よりθはオイラー角90°を超える角度が扱える事となる。三角形OABは常に直角三角形になるので「三角比」の考えと同時に「三平方の定理」が適用できる(尚、半径1の円を単位円と呼ぶ) | ラジアンと単位円、三角比を用いた三角関数の定義。原点を中心とした半径1の円周上にあってx軸正の方向から反時計回りにラジアン角θを取った座標位置を(cosθ,sinθ)とする。この定義よりθはオイラー角90°を超える角度が扱える事となる。三角形OABは常に直角三角形になるので「三角比」の考えと同時に「三平方の定理」が適用できる(尚、半径1の円を単位円と呼ぶ) | ||
&ref(0cded19e12a181bf3e8388dbce4eb67e.png); | &ref(0cded19e12a181bf3e8388dbce4eb67e.png); | ||
- | コード例: | + | このcos(x)とsin(x)をグラフで描くと以下の様な波のグラフになる |
+ | &ref(sincos1.png); | ||
+ | この実際の値の動きを視覚的に確認できるプログラムを作りました。unity_webプレーヤーで実際に触って挙動を確認できます | ||
+ | [[三角関数プレーヤー_for_Unity:https://dl.dropboxusercontent.com/u/87271864/Math_sincosCurve/Math_sincosCurve.html]] | ||
#code(csharp){{ | #code(csharp){{ | ||
using UnityEngine; | using UnityEngine; | ||
using System.Collections; | using System.Collections; | ||
- | public class Rad1 : MonoBehaviour | + | public class trigon2 : MonoBehaviour |
{ | { | ||
void Start () | void Start () | ||
{ | { | ||
- | print (Method (30 * Mathf.Deg2Rad)); | + | float x = Mathf.Cos (60 * Mathf.Deg2Rad); |
- | } | + | float y = Mathf.Sin (60 * Mathf.Deg2Rad); |
- | + | print (Mathf.Pow (x, 2) + Mathf.Pow (y, 2)); //三平方の定理により1になる事が確認できる | |
- | Vector2 Method (float theta) | + | |
- | { | + | |
- | return new Vector2 (Mathf.Cos (theta), Mathf.Sin (theta)); | + | |
} | } | ||
} | } | ||
Line 57: | Line 81: | ||
※unityのMathfクラスsin,cos関数ではマイナスの引数でも上記の公式を内部で処理し正確に値を算出します | ※unityのMathfクラスsin,cos関数ではマイナスの引数でも上記の公式を内部で処理し正確に値を算出します | ||
- | **atan [#y3e00982] | + | **atan(アークタンジェント:逆正接) [#zbc175fe] |
+ | atan は tan の逆関数になる(つまり傾きから角度を得る)。傾きはわかっているが角度が判らない時に使うと便利。逆算が可能なのでゲームコードで利用される頻度は比較的高い。返り値はラジアン角θとなる | ||
+ | \(\tan { \theta } =\frac { \sin { \theta } }{ \cos { \theta } } =\frac { y }{ x } \quad \quad \Leftrightarrow \quad \quad \arctan { \left( \frac { y }{ x } \right) } =\theta \) | ||
+ | arctanは幾つかの表現方法があり\(\arctan { \left( \frac { y }{ x } \right) }\) も\(\tan ^{ -1 }{ \left( \frac { y }{ x } \right) } \)も同じ意味となる | ||
+ | unityのコードでは[[Atan:http://docs.unity3d.com/ja/current/ScriptReference/Mathf.Atan.html]]や[[Atan2:http://docs.unity3d.com/ja/current/ScriptReference/Mathf.Atan2.html]]で表される | ||
- | atan(アークタンジェント:逆正接) | + | <unityのコード例> |
- | atan は tan の逆関数になる(つまり傾きから角度を得る)。&color(#990000){atanを利用する事により内角θを求める事が出来る}。角度が判らない時に使うと便利 | + | #code(csharp){{ |
- | 引数はtanθ=(sinθ/cosθ)を渡す。返り値はラジアン角θとなる | + | |
- | &ref(daum_equation_1412255954447.png) | + | |
- | + | ||
- | <サンプルコード> | + | |
using UnityEngine; | using UnityEngine; | ||
using System.Collections; | using System.Collections; | ||
- | public class Atan : MonoBehaviour | + | public class Trigon3 : MonoBehaviour |
{ | { | ||
+ | float theta, x, y, tan, arctan, arctan2; | ||
void Start () | void Start () | ||
{ | { | ||
- | print (Mathf.Cos (Mathf.Deg2Rad * 30)); | + | theta = 30f * Mathf.Deg2Rad; |
- | print (Mathf.Sin (Mathf.Deg2Rad * 30)); | + | x = Mathf.Cos (theta); |
- | print (Mathf.Sin (Mathf.Deg2Rad * 30) / Mathf.Cos (Mathf.Deg2Rad * 30)); //tan30° | + | y = Mathf.Sin (theta); |
- | print (Mathf.Tan (Mathf.Deg2Rad * 30)); | + | tan = Mathf.Tan (theta); |
+ | arctan = Mathf.Atan (tan) * Mathf.Rad2Deg; | ||
+ | arctan2 = Mathf.Atan2 (y, x) * Mathf.Rad2Deg; | ||
+ | print ("cos=" + x + " sin=" + y + " tan=" + tan + " arctan=" + arctan + " arctan2=" + arctan2); | ||
- | Vector2 vec = Vector2.right; //三角関数は数学的にX+が基準になる為、atanも例外ではない | + | Vector2 vec = Vector2.right; |
- | print (vec); | + | vec = Quaternion.AngleAxis (30, Vector3.forward) * vec; |
- | vec = Quaternion.AngleAxis (30, Vector3.forward) * vec; //クォータニオンの後にベクトルを掛ける(反対はエラーが出るので注意) | + | print ("30°回転させたベクトル=" + vec + " arctan関数で逆算した値=" + Mathf.Atan2 (vec.y, vec.x) * Mathf.Rad2Deg); |
- | 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° | + | |
} | } | ||
} | } | ||
+ | }} | ||
+ | #hr | ||
出力 | 出力 | ||
- | + | cos=0.8660254 sin=0.5 tan=0.5773503 arctan=30 arctan2=30 | |
- | 0.8660254 | + | 30°回転させたベクトル=(0.9, 0.5) arctan関数で逆算した値=30 |
- | 0.5 | + | #hr |
- | 0.5773503 | + | |
- | 0.5773503 | + | |
- | (1.0, 0.0) | + | |
- | (0.9, 0.5) | + | |
- | 30 | + | |
- | 30 | + | |
- | 30 | + | |
- | + | ||
- | この場合のvecは正規化が必要ない(引数にtanθを渡すという事は比だから) | + | |
**有名なsin,cos値 [#xc1bbc15] | **有名なsin,cos値 [#xc1bbc15] | ||
Line 109: | Line 126: | ||
|cos(60°)|√0.25= 0.5|sin(60°)|√0.75 = 0.866~| | |cos(60°)|√0.25= 0.5|sin(60°)|√0.75 = 0.866~| | ||
|cos(90°)|0|sin(90°)|1| | |cos(90°)|0|sin(90°)|1| | ||
- | オイラー角45度を境にsin,cosの関係が対称になっている | + | 45°を境にsin,cosの関係が対称になっている |
上の表から以下の式で三平方の定理が成立している事が確認できる | 上の表から以下の式で三平方の定理が成立している事が確認できる | ||
- | cos(30°)^2 + sin(30°)^2 = 1 | + | \(\cos ^{ 2 }{ (30) } +\sin ^{ 2 }{ (30) } =1\quad \quad \rightarrow \quad { \quad 0.866 }...^{ 2 }+{ 0.5 }^{ 2 }=1\) |
- | 0.866^2 + 0.5^2 = 1 | + | |
- | 0.75 + 0.25 = 1 | + | |
**三角関数の表記注意点 [#t9eda5be] | **三角関数の表記注意点 [#t9eda5be] | ||
- | |||
三角関数同士の掛算では以下の様に表記する必要がある | 三角関数同士の掛算では以下の様に表記する必要がある | ||
- | &ref(daum_equation_1412406275415.png) | + | \(\sin { A } \times \sin { B } =\sin { A } \sin { B } \) |
sinABの様な書き方はNGなので注意 | sinABの様な書き方はNGなので注意 | ||
累乗表記は | 累乗表記は | ||
- | &ref(daum_equation_1412438261779.png) | + | \(\sin { \theta } \times \sin { \theta } =\sin ^{ 2 }{ \theta } \) |
のように関数側の右肩に書く事が約束となっている | のように関数側の右肩に書く事が約束となっている | ||
- | |||
- | |||
- | **三角関数プレーヤー_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 * | ||
#navi | #navi |