2

私は数学の問題を抱えています:

現在の時刻のみをパラメータとする関数があります。リターンは、特定の場所にオブジェクトを配置するために使用される位置である必要があります。

int position(int time)
{
    int x = 0; //TODO implement x depending on time
    return x;
}

つまり、基本的に関数はフレームごとに呼び出され、オブジェクトを動かします。

モーションは次のようになります(これが実際の質問です)。

  1. 時間Aの線形運動、オブジェクトは一定の速度で移動します
  2. 時間Bの動きがない場合、オブジェクトは停止します
  3. 1で繰り返します。

ありがとう!

編集:わかりました。言い換えると、一定速度でA分間運転し、その後B分間停止する車を想像してみてください。その後、再びA分間運転し、再びB分間停止します。

時間Xの車はどこにありますか?

4

6 に答える 6

2

OK、私が正しく理解していれば:

int position(int time)
{
    int count_of_AB_cycles = time / (A + B);
    int time_in_current_cycle = time % (A + B);
    int time_moved_this_cycle = (time_in_current_cycle < A) ? time_in_current_cycle : A;
    int total_time_moving = (count_of_AB_cycles * A) + time_moved_this_cycle;
    return total_time_moving * speed;
}

整数除算などを想定していますfloor()。AとBが非整数などの場合は、sが必要です。

于 2010-06-10T13:46:43.743 に答える
1

あなたが提供する限られた情報で、より具体的なものは何もありません

return x * THE_SPEED

提案することができます。

2番目の条件は、戻り値の最大値として意図されている可能性がありますが、コンテキストなしではわかりません。

3番目の仕様は私を困惑させます。

于 2010-06-10T13:39:29.313 に答える
1

何かのようなもの

int position(int t)
{
  static int pt = -1;
  static int px = 0;
  static int state = 1; // running...
  static int lastt = 0;
  if (pt < 0) { pt = t; lastt = t; }
  if ( state == 1 ) {
     if ( (t-pt) > A ) {
        state = 0;
        pt = t;
     }
  } else {
     if ( (t-pt) > B ) {
        state = 1;
        pt = t;
     }
  }
  px += state ? SPEED*(t-lastt) : 0; // advance
  lastt = t;
  return px;
}

前のコードの使用法についてのコメントを編集する

このコードは「実行時」に使用することを目的としています。時間tが与えられた場合、結果は得られません。これは、関数が呼び出されるたびに、前回の呼び出しから経過した時間に応じて、実質的に車を1ステップ「移動」するようにプログラムされています。ファンクが「ダニ」ごとに呼び出される「ゲーム」に適しており、現在の位置で画面にダニごとに描画できるように、ダニが増えるにつれて車の位置を更新する必要があります。 。

OPの質問が、時間tで車がどこにあるかを「数学的に」知ることに関するものである場合、他の解決策が適切です(また、質問に対する私の2番目のコメントを読んでください)

于 2010-06-10T13:59:27.410 に答える
0

最初の2つの時間間隔では、これを行うことができます。

time = min(time, TIME_INTERVAL_A);
return time * CONST_SPEED;

これにより、オブジェクトは時間間隔Aにわたって一定の速度で移動し、その後停止します。

于 2010-06-10T13:45:28.120 に答える
0

あなたの問題を正しく理解したかどうかはわかりませんが、このようなものが必要ですか?

(Cを想定)

int position(int time)
{
    static int x = 0;
    x += time * SPEED;
    return x;
}
于 2010-06-10T13:46:22.813 に答える
0

私が正しく理解していれば、あなたはしばらく一定の速度で移動し、次に停止し、次に(同じ速度で?)再び開始し、次に停止し、次に開始するなどのオブジェクトを持っていますか?1Dパスに沿って移動するため、原点からの距離だけが関心のある出力ですか?

speedAt(time T)次のような補助関数を定義することをお勧めします。

if 0 < T <= 25 then 5;
if 25 < T <= 32 then 0;
if 32 < T <= 47 then 3;
if 47 < T <= 49 then 0;
if 49 < T <= 125 then 1;
if 125 < T then 0.

ここで行う必要があるのは、この関数を統合して、Tのグラフと水平軸(xyプロット)の間の領域で表される時間Tでの移動距離を導出することです。

これは微分可能または連続関数ではないため、難しい計算を行う必要がないため、数値積分を非常に簡単に行うことができます。このようなビット:

distanceTravelled = 0
for t = 1 to T
   distanceTravelled = distanceTravelled + speedAt(t)
end

これはおそらくあなたには少し厄介に見えます。より洗練されたアプローチは、データ構造からspeedAtの値を導出することですが、全体像を把握していただければ幸いです。

于 2010-06-10T13:55:51.157 に答える