5: 2015-03-24 (火) 04:24:02 osinko  |
現: 2015-03-25 (水) 11:57:39 osinko  |
| このcos(x)とsin(x)をグラフで描くと以下の様な波のグラフになる | | このcos(x)とsin(x)をグラフで描くと以下の様な波のグラフになる |
| &ref(sincos1.png); | | &ref(sincos1.png); |
- | この実際の値の動きを視覚的に確認できるプログラムを作りました。unity_webプレーヤーで実際に触って挙動を確認できます。ご参考にどうぞ | + | この実際の値の動きを視覚的に確認できるプログラムを作りました。unity_webプレーヤーで実際に触って挙動を確認できます |
| [[三角関数プレーヤー_for_Unity:https://dl.dropboxusercontent.com/u/87271864/Math_sincosCurve/Math_sincosCurve.html]] | | [[三角関数プレーヤー_for_Unity:https://dl.dropboxusercontent.com/u/87271864/Math_sincosCurve/Math_sincosCurve.html]] |
| #code(csharp){{ | | #code(csharp){{ |
| float x = Mathf.Cos (60 * Mathf.Deg2Rad); | | float x = Mathf.Cos (60 * Mathf.Deg2Rad); |
| float y = Mathf.Sin (60 * Mathf.Deg2Rad); | | float y = Mathf.Sin (60 * Mathf.Deg2Rad); |
- | print (Mathf.Pow (x, 2) + Mathf.Pow (y, 2)); //三平方の定理の効用が確認できる | + | print (Mathf.Pow (x, 2) + Mathf.Pow (y, 2)); //三平方の定理により1になる事が確認できる |
| } | | } |
| } | | } |
| | | |
| **atan(アークタンジェント:逆正接) [#zbc175fe] | | **atan(アークタンジェント:逆正接) [#zbc175fe] |
- | atan は tan の逆関数になる(つまり傾きから角度を得る)。傾きはわかっているが角度が判らない時に使うと便利。ゲームのコードでは機能的に利用される機会が多い。返り値はラジアン角θとなる | + | atan は tan の逆関数になる(つまり傾きから角度を得る)。傾きはわかっているが角度が判らない時に使うと便利。逆算が可能なのでゲームコードで利用される頻度は比較的高い。返り値はラジアン角θとなる |
| \(\tan { \theta } =\frac { \sin { \theta } }{ \cos { \theta } } =\frac { y }{ x } \quad \quad \Leftrightarrow \quad \quad \arctan { \left( \frac { y }{ x } \right) } =\theta \) | | \(\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) } \)も同じ意味となる | | arctanは幾つかの表現方法があり\(\arctan { \left( \frac { y }{ x } \right) }\) も\(\tan ^{ -1 }{ \left( \frac { y }{ x } \right) } \)も同じ意味となる |
| 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 | | #hr |
| 出力 | | 出力 |
- | 0.8660254 | + | cos=0.8660254 sin=0.5 tan=0.5773503 arctan=30 arctan2=30 |
- | 0.5 | + | 30°回転させたベクトル=(0.9, 0.5) arctan関数で逆算した値=30 |
- | 0.5773503 | + | |
- | 0.5773503 | + | |
- | (1.0, 0.0) | + | |
- | (0.9, 0.5) | + | |
- | 30 | + | |
- | 30 | + | |
- | 30 | + | |
| #hr | | #hr |
- | この場合のvecは正規化の必要はない(引数にtanθを渡すという事は比だから) | |
| | | |
| **有名なsin,cos値 [#xc1bbc15] | | **有名なsin,cos値 [#xc1bbc15] |
| | | |
| **三角関数の表記注意点 [#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 |