回答編集履歴
4
近似計算を使ったスプライト移動方法の提案
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
近似の詳細説明
test
CHANGED
@@ -8,11 +8,11 @@
|
|
8
8
|
|
9
9
|
|
10
10
|
|
11
|
-
![方程式][WIDTH:
|
11
|
+
![方程式][WIDTH:300](8d24453122109b9e9295cd753475d687.png)
|
12
12
|
|
13
13
|
ただし
|
14
14
|
|
15
|
-
![theta式][WIDTH:
|
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
近似的に解いてみた
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
式を見やすくしました
test
CHANGED
@@ -8,12 +8,12 @@
|
|
8
8
|
|
9
9
|
|
10
10
|
|
11
|
-
(d
|
11
|
+
![方程式][WIDTH:453](8d24453122109b9e9295cd753475d687.png)
|
12
12
|
|
13
|
-
ただし
|
13
|
+
ただし
|
14
14
|
|
15
|
-
|
15
|
+
![theta式][WIDTH:478](2226dbb620e4158f382797ca358e9727.png)
|
16
16
|
|
17
|
+
(xr = RADIUS_X, yr = RADIUS_Y)
|
17
18
|
|
18
|
-
|
19
|
-
という
|
19
|
+
という式になりました
|