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

回答編集履歴

4

近似計算を使ったスプライト移動方法の提案

2015/03/08 10:15

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -33,4 +33,46 @@
33
33
  ![Δθ-t][WIDTH:560](f5a234d1dc720848099bd2d150240eed.png)
34
34
  この粗い精度(Δθがθ=0,π,2πで揃わない)でも計算回数が100回単位になります(2π回るのに770回以上).
35
35
  速く動かそうとすると厳しいですね.
36
- だんだん誤差が大きくなると途中でルートの中がマイナスになるエラーになりますし.
36
+ だんだん誤差が大きくなると途中でルートの中がマイナスになるエラーになりますし.
37
+ ---
38
+ 追記2
39
+ 度々の追記すみません.
40
+ 上の計算の精度は,最初に与えるΔθの値が0に近づくほど上がります.
41
+ 初期Δθ=0.001radで,θ=πでのΔθの誤差は0.2%以下になりました(π回るまでの計算回数が8000回に達しましたが).
42
+ あらかじめこの計算をしておいて,**θの配列を作っておく**,と言うのはどうでしょうか.
43
+ θが0からπ/2までの情報があれば,残りの範囲は比較的単純な計算で求められます.
44
+ そのままでは数が多すぎるので,必要に応じて例えば100回ごとの値をピックアップしておきます.
45
+ スプライトごとに時間を示すインデックス番号(0からθ配列の最大数-1)と象限の情報(1-4)を入れておいて,
46
+ ```lang-java
47
+ double[] theta;
48
+ int i; //インデックス
49
+ int quadrant; //象限
50
+
51
+ //以下メソッド内のイメージ
52
+ //インデックスと象限の操作
53
+ /*updateでiを一定値増加させたあと*/
54
+ if(i >= theta.length){
55
+ i -= theta.length;
56
+ quadrant += 1
57
+ if(quadrant > 4)
58
+ quadrant -= 4;
59
+ }
60
+
61
+ //座標を求めるためのm_thetaを求める
62
+ switch(quadrant){
63
+ case 1:
64
+ m_theta = theta[i];
65
+ break;
66
+ case 2:
67
+ m_theta = Math.PI - theta[theta.length - i];
68
+ break;
69
+ case 3:
70
+ m_theta = Math.PI + theta[i];
71
+ break;
72
+ case 4:
73
+ m_theta = 2 * Math.PI - theta[theta.length - i];
74
+ break;
75
+ }
76
+ ```
77
+ このようにm_thetaを求めることができます.
78
+ 速さはインデックスの変化の速さでコントロールすることができます.

3

近似の詳細説明

2015/03/08 10:15

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -3,15 +3,30 @@
3
3
  ただ私も最後まで解けないですし,実用上プログラムに組めるのか,という疑問もあります.
4
4
  途中まで解いて
5
5
 
6
- ![方程式][WIDTH:453](8d24453122109b9e9295cd753475d687.png)
6
+ ![方程式][WIDTH:300](8d24453122109b9e9295cd753475d687.png)
7
7
  ただし
8
- ![theta式][WIDTH:478](2226dbb620e4158f382797ca358e9727.png)
8
+ ![theta式][WIDTH:300](2226dbb620e4158f382797ca358e9727.png)
9
9
  (xr = RADIUS_X, yr = RADIUS_Y)
10
10
  という式になりました
11
11
  ---
12
12
  追記
13
13
 
14
14
  自己満足ですが,近似を使ってグラフを描いてみました
15
+ 近似の方法は,ある時点でのθをθn,その時の求めるθの差分をΔθnとします.
16
+ また,時間差分はΔtで一定だとします.
17
+ Δθnが微小なら,dθ/dt≒Δθn/Δt
18
+ θの2階微分はΔθ/Δtの差分をΔtで割ったもの,
19
+ すなわち((Δθn/Δt)-(Δθn-1/Δt))/Δt = (Δθn - Δθn-1)/Δt^2
20
+ で近似できます(Δθn-1は前回のΔθの計算結果で既知である).
21
+ これらを適用すると,
22
+ ![差分方程式][WIDTH:400](20c8a74b52157fc423b08017ae74bcc2.png)
23
+ という方程式が得られます.
24
+ これをΔθnについて解くと,f'(θn)≠0,すなわちsin2θn≠0の場合
25
+ ![近似解][WIDTH:400](82807bae0f725e1bc8408f5602a0da1a.png)
26
+ sin2θn=0の場合は Δθn=Δθn-1
27
+
28
+ この結果を使い,θ=0の時から始めて,最初のΔθを設定して順次足しあわせて行きました
29
+
15
30
  θ-t
16
31
  ![θ-t][WIDTH:558](d3dc750c6c4546c67a68c70bd350dfd8.png)
17
32
  Δθ-t(初期Δθ=0.02rad)

2

近似的に解いてみた

2015/03/05 15:43

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -7,4 +7,15 @@
7
7
  ただし
8
8
  ![theta式][WIDTH:478](2226dbb620e4158f382797ca358e9727.png)
9
9
  (xr = RADIUS_X, yr = RADIUS_Y)
10
- という式になりました
10
+ という式になりました
11
+ ---
12
+ 追記
13
+
14
+ 自己満足ですが,近似を使ってグラフを描いてみました
15
+ θ-t
16
+ ![θ-t][WIDTH:558](d3dc750c6c4546c67a68c70bd350dfd8.png)
17
+ Δθ-t(初期Δθ=0.02rad)
18
+ ![Δθ-t][WIDTH:560](f5a234d1dc720848099bd2d150240eed.png)
19
+ この粗い精度(Δθがθ=0,π,2πで揃わない)でも計算回数が100回単位になります(2π回るのに770回以上).
20
+ 速く動かそうとすると厳しいですね.
21
+ だんだん誤差が大きくなると途中でルートの中がマイナスになるエラーになりますし.

1

式を見やすくしました

2015/03/04 16:42

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -3,8 +3,8 @@
3
3
  ただ私も最後まで解けないですし,実用上プログラムに組めるのか,という疑問もあります.
4
4
  途中まで解いて
5
5
 
6
+ ![方程式][WIDTH:453](8d24453122109b9e9295cd753475d687.png)
7
+ ただし
6
- (df(theta)/d(theta)) * (d(theta)/dt)^2 + 2*f(theta)*(d^2 (theta)/dt^2) = 0
8
+ ![theta式][WIDTH:478](2226dbb620e4158f382797ca358e9727.png)
7
- ただしf(theta)=(RADIUS_X * sin(theta))^2 + (RADIUS_Y * cos(theta))^2
9
+ (xr = RADIUS_X, yr = RADIUS_Y)
8
- d^2 (theta)/dt^2はthetaをtで2回微分したもの
9
-
10
- という,ここで書くには非常に見難いが出来上がりました(しかも私には解けない)
10
+ という式になりました