回答編集履歴

4

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

2015/03/08 10:15

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -69,3 +69,87 @@
69
69
  速く動かそうとすると厳しいですね.
70
70
 
71
71
  だんだん誤差が大きくなると途中でルートの中がマイナスになるエラーになりますし.
72
+
73
+ ---
74
+
75
+ 追記2
76
+
77
+ 度々の追記すみません.
78
+
79
+ 上の計算の精度は,最初に与えるΔθの値が0に近づくほど上がります.
80
+
81
+ 初期Δθ=0.001radで,θ=πでのΔθの誤差は0.2%以下になりました(π回るまでの計算回数が8000回に達しましたが).
82
+
83
+ あらかじめこの計算をしておいて,**θの配列を作っておく**,と言うのはどうでしょうか.
84
+
85
+ θが0からπ/2までの情報があれば,残りの範囲は比較的単純な計算で求められます.
86
+
87
+ そのままでは数が多すぎるので,必要に応じて例えば100回ごとの値をピックアップしておきます.
88
+
89
+ スプライトごとに時間を示すインデックス番号(0からθ配列の最大数-1)と象限の情報(1-4)を入れておいて,
90
+
91
+ ```lang-java
92
+
93
+ double[] theta;
94
+
95
+ int i; //インデックス
96
+
97
+ int quadrant; //象限
98
+
99
+
100
+
101
+ //以下メソッド内のイメージ
102
+
103
+ //インデックスと象限の操作
104
+
105
+ /*updateでiを一定値増加させたあと*/
106
+
107
+ if(i >= theta.length){
108
+
109
+ i -= theta.length;
110
+
111
+ quadrant += 1
112
+
113
+ if(quadrant > 4)
114
+
115
+ quadrant -= 4;
116
+
117
+ }
118
+
119
+
120
+
121
+ //座標を求めるためのm_thetaを求める
122
+
123
+ switch(quadrant){
124
+
125
+ case 1:
126
+
127
+ m_theta = theta[i];
128
+
129
+ break;
130
+
131
+ case 2:
132
+
133
+ m_theta = Math.PI - theta[theta.length - i];
134
+
135
+ break;
136
+
137
+ case 3:
138
+
139
+ m_theta = Math.PI + theta[i];
140
+
141
+ break;
142
+
143
+ case 4:
144
+
145
+ m_theta = 2 * Math.PI - theta[theta.length - i];
146
+
147
+ break;
148
+
149
+ }
150
+
151
+ ```
152
+
153
+ このようにm_thetaを求めることができます.
154
+
155
+ 速さはインデックスの変化の速さでコントロールすることができます.

3

近似の詳細説明

2015/03/08 10:15

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -8,11 +8,11 @@
8
8
 
9
9
 
10
10
 
11
- ![方程式][WIDTH:453](8d24453122109b9e9295cd753475d687.png)
11
+ ![方程式][WIDTH:300](8d24453122109b9e9295cd753475d687.png)
12
12
 
13
13
  ただし
14
14
 
15
- ![theta式][WIDTH:478](2226dbb620e4158f382797ca358e9727.png)
15
+ ![theta式][WIDTH:300](2226dbb620e4158f382797ca358e9727.png)
16
16
 
17
17
  (xr = RADIUS_X, yr = RADIUS_Y)
18
18
 
@@ -25,6 +25,36 @@
25
25
 
26
26
 
27
27
  自己満足ですが,近似を使ってグラフを描いてみました
28
+
29
+ 近似の方法は,ある時点でのθをθn,その時の求めるθの差分をΔθnとします.
30
+
31
+ また,時間差分はΔtで一定だとします.
32
+
33
+ Δθnが微小なら,dθ/dt≒Δθn/Δt
34
+
35
+ θの2階微分はΔθ/Δtの差分をΔtで割ったもの,
36
+
37
+ すなわち((Δθn/Δt)-(Δθn-1/Δt))/Δt = (Δθn - Δθn-1)/Δt^2
38
+
39
+ で近似できます(Δθn-1は前回のΔθの計算結果で既知である).
40
+
41
+ これらを適用すると,
42
+
43
+ ![差分方程式][WIDTH:400](20c8a74b52157fc423b08017ae74bcc2.png)
44
+
45
+ という方程式が得られます.
46
+
47
+ これをΔθnについて解くと,f'(θn)≠0,すなわちsin2θn≠0の場合
48
+
49
+ ![近似解][WIDTH:400](82807bae0f725e1bc8408f5602a0da1a.png)
50
+
51
+ sin2θn=0の場合は Δθn=Δθn-1
52
+
53
+
54
+
55
+ この結果を使い,θ=0の時から始めて,最初のΔθを設定して順次足しあわせて行きました
56
+
57
+
28
58
 
29
59
  θ-t
30
60
 

2

近似的に解いてみた

2015/03/05 15:43

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -17,3 +17,25 @@
17
17
  (xr = RADIUS_X, yr = RADIUS_Y)
18
18
 
19
19
  という式になりました
20
+
21
+ ---
22
+
23
+ 追記
24
+
25
+
26
+
27
+ 自己満足ですが,近似を使ってグラフを描いてみました
28
+
29
+ θ-t
30
+
31
+ ![θ-t][WIDTH:558](d3dc750c6c4546c67a68c70bd350dfd8.png)
32
+
33
+ Δθ-t(初期Δθ=0.02rad)
34
+
35
+ ![Δθ-t][WIDTH:560](f5a234d1dc720848099bd2d150240eed.png)
36
+
37
+ この粗い精度(Δθがθ=0,π,2πで揃わない)でも計算回数が100回単位になります(2π回るのに770回以上).
38
+
39
+ 速く動かそうとすると厳しいですね.
40
+
41
+ だんだん誤差が大きくなると途中でルートの中がマイナスになるエラーになりますし.

1

式を見やすくしました

2015/03/04 16:42

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -8,12 +8,12 @@
8
8
 
9
9
 
10
10
 
11
- (df(theta)/d(theta)) * (d(theta)/dt)^2 + 2*f(theta)*(d^2 (theta)/dt^2) = 0
11
+ ![方程式][WIDTH:453](8d24453122109b9e9295cd753475d687.png)
12
12
 
13
- ただしf(theta)=(RADIUS_X * sin(theta))^2 + (RADIUS_Y * cos(theta))^2
13
+ ただし
14
14
 
15
- d^2 (theta)/dt^2はthetaをtで2回微分したもの
15
+ ![theta式][WIDTH:478](2226dbb620e4158f382797ca358e9727.png)
16
16
 
17
+ (xr = RADIUS_X, yr = RADIUS_Y)
17
18
 
18
-
19
- という,ここで書くは非常に見難い式が出来上がりました(しかも私には解けない)
19
+ というりました