楕円の中心点、大きさは以下です。
CENTER_X = 0,
CENTER_Y = 25,
RADIUS_X = 280,
RADIUS_Y = 75
この楕円の軌道上をn個のスプライトを等速で動かしたいです。
スプライトは1個〜15個です。
updateで以下の計算をしています。
float newX = (CENTER_X + cos(m_theta) * RADIUS_X);
float newY = (CENTER_Y + sin(m_theta) * RADIUS_Y);
sprite->setPosition(newX, newY);
m_theta += 100.0f;
加算するm_thetaの算出方法が知りたいです。
スプライト12個の時にm_theta +=100.0fで丁度良い速度になるので、同じ速度を他の個数の時にも再現したく思います。
何卒よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
数学的な話をするなら,速さv=sqrt((dx/dt)^2+(dy/dt)^2)を求めて,
微分方程式dv/dt=0を解いてm_thetaと時間tの関係式を求めることになると思います.
ただ私も最後まで解けないですし,実用上プログラムに組めるのか,という疑問もあります.
途中まで解いて
![方程式]WIDTH:300
ただし
![theta式]WIDTH:300
(xr = RADIUS_X, yr = RADIUS_Y)
という式になりました
追記
自己満足ですが,近似を使ってグラフを描いてみました
近似の方法は,ある時点でのθをθn,その時の求めるθの差分をΔθnとします.
また,時間差分はΔtで一定だとします.
Δθnが微小なら,dθ/dt≒Δθn/Δt
θの2階微分はΔθ/Δtの差分をΔtで割ったもの,
すなわち((Δθn/Δt)-(Δθn-1/Δt))/Δt = (Δθn - Δθn-1)/Δt^2
で近似できます(Δθn-1は前回のΔθの計算結果で既知である).
これらを適用すると,
![差分方程式]WIDTH:400
という方程式が得られます.
これをΔθnについて解くと,f'(θn)≠0,すなわちsin2θn≠0の場合
![近似解]WIDTH:400
sin2θn=0の場合は Δθn=Δθn-1
この結果を使い,θ=0の時から始めて,最初のΔθを設定して順次足しあわせて行きました
θ-t
![θ-t]WIDTH:558
Δθ-t(初期Δθ=0.02rad)
![Δθ-t]WIDTH:560
この粗い精度(Δθがθ=0,π,2πで揃わない)でも計算回数が100回単位になります(2π回るのに770回以上).
速く動かそうとすると厳しいですね.
だんだん誤差が大きくなると途中でルートの中がマイナスになるエラーになりますし.
追記2
度々の追記すみません.
上の計算の精度は,最初に与えるΔθの値が0に近づくほど上がります.
初期Δθ=0.001radで,θ=πでのΔθの誤差は0.2%以下になりました(π回るまでの計算回数が8000回に達しましたが).
あらかじめこの計算をしておいて,θの配列を作っておく,と言うのはどうでしょうか.
θが0からπ/2までの情報があれば,残りの範囲は比較的単純な計算で求められます.
そのままでは数が多すぎるので,必要に応じて例えば100回ごとの値をピックアップしておきます.
スプライトごとに時間を示すインデックス番号(0からθ配列の最大数-1)と象限の情報(1-4)を入れておいて,
lang
1double[] theta; 2int i; //インデックス 3int quadrant; //象限 4 5//以下メソッド内のイメージ 6//インデックスと象限の操作 7/*updateでiを一定値増加させたあと*/ 8if(i >= theta.length){ 9 i -= theta.length; 10 quadrant += 1 11 if(quadrant > 4) 12 quadrant -= 4; 13} 14 15//座標を求めるためのm_thetaを求める 16switch(quadrant){ 17 case 1: 18 m_theta = theta[i]; 19 break; 20 case 2: 21 m_theta = Math.PI - theta[theta.length - i]; 22 break; 23 case 3: 24 m_theta = Math.PI + theta[i]; 25 break; 26 case 4: 27 m_theta = 2 * Math.PI - theta[theta.length - i]; 28 break; 29}
このようにm_thetaを求めることができます.
速さはインデックスの変化の速さでコントロールすることができます.
投稿2015/03/03 03:08
編集2015/03/08 10:15総合スコア20649
0
楕円の代わりに、次の形で考えれば、周を長さ N 等分することは簡単です。
http://www.shaku8.com/seika/figkoban0.gif
![イメージ説明]WIDTH:465
ここで求めた各分点の角度から 実際の楕円上の点を計算をしては?
上の図は 次のページからの引用です。
投稿2015/03/08 12:43
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
等速というのが、軌道上の移動速度なのか、見た目の速度?なのかで変わってきますね・・・
前者と仮定した場合、ちょっとずるいかもですが、
単位時間に進む距離が十分に小さいと仮定した場合、楕円は小さな移動ベクトルの集合と見ることができます。
なので、それらの値をあらかじめテーブルにぶっこんでおき、進んだ分だけ該当のとこの値を抜き出す、みたいな感じにするのはダメでしょうか・・・・・
追記ですが、自分もちょっと考えてみました。x,y,tの関係を考える方式で。
ある時間tにおける座標を(x,y)とし、そこから微小時間での変位を(dx,dy)と置きます。
式① 速度一定の式
![イメージ説明]WIDTH:178
式② 楕円の方程式
![イメージ説明]WIDTH:89
式③ 楕円の接線の式(ちょっと自信なしw)
![イメージ説明]WIDTH:83
①②③からyとdyを消去します。するとこんな式ができました。
式④ xとtの関係式
![イメージ説明]WIDTH:90
ただし、
![イメージ説明]WIDTH:183
④の両辺を時間tで積分します。
![イメージ説明]WIDTH:171
![イメージ説明]WIDTH:161
ただし、x0=移動前のx座標、x1=移動後のx座標、t=時間
多分どっか間違ってると思いますが、左辺の積分を解いてやればx1の解が出るような気がします(笑)
投稿2015/03/02 14:31
編集2015/03/05 09:59総合スコア52
0
何点か気になるところがありました。
0. タイミングを合わせる処理はどのようにやっているのでしょうか。ループ内の処理負荷でタイミングを合わせるような処理だと、動かすマシンや負荷などの環境が変われば速度も変化してしまいます。
0. 厳密に言えば、このままだと長い方向に行った時に速くなって、等速ではなくなっています。
投稿2015/03/02 07:41
総合スコア145121
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/03/03 04:55
2015/03/03 05:22
2015/03/03 06:13
2015/03/10 09:22
2015/03/10 09:48