回答編集履歴
4
近似計算を使ったスプライト移動方法の提案
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
近似の詳細説明
answer
CHANGED
@@ -3,15 +3,30 @@
|
|
3
3
|
ただ私も最後まで解けないですし,実用上プログラムに組めるのか,という疑問もあります.
|
4
4
|
途中まで解いて
|
5
5
|
|
6
|
-
![方程式][WIDTH:
|
6
|
+
![方程式][WIDTH:300](8d24453122109b9e9295cd753475d687.png)
|
7
7
|
ただし
|
8
|
-
![theta式][WIDTH:
|
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
近似的に解いてみた
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
式を見やすくしました
answer
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
ただ私も最後まで解けないですし,実用上プログラムに組めるのか,という疑問もあります.
|
4
4
|
途中まで解いて
|
5
5
|
|
6
|
+
![方程式][WIDTH:453](8d24453122109b9e9295cd753475d687.png)
|
7
|
+
ただし
|
6
|
-
|
8
|
+
![theta式][WIDTH:478](2226dbb620e4158f382797ca358e9727.png)
|
7
|
-
|
9
|
+
(xr = RADIUS_X, yr = RADIUS_Y)
|
8
|
-
d^2 (theta)/dt^2はthetaをtで2回微分したもの
|
9
|
-
|
10
|
-
という
|
10
|
+
という式になりました
|