математика: движение в зависимости от времени - PullRequest
2 голосов
/ 10 июня 2010

У меня есть математическая проблема:

У меня есть функция, где единственным параметром является текущее время. возврат должен быть позицией, которая используется для размещения объекта в определенном месте.

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

поэтому в основном функция вызывается каждый кадр, чтобы привести объект в движение.

движение должно выглядеть так (это актуальный вопрос):

  1. линейное движение за время А, объект движется с постоянной скоростью
  2. нет движения в течение времени B, объект остановлен
  3. повторить в 1.

спасибо!

edit: хорошо, другими словами: представьте себе машину, которая едет с постоянной скоростью в течение A минут, а затем останавливается на B минут затем снова едет на A минут и снова останавливается на B минут.

где находится машина во время X?

Ответы [ 6 ]

2 голосов
/ 10 июня 2010

ОК, если я правильно понимаю:

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 не являются целыми числами и т. Д.

1 голос
/ 10 июня 2010

Что-то вроде

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 раз и навсегда. Он запрограммирован так, чтобы фактически «перемещать» машину на один шаг каждый раз, когда вызывается функция, в зависимости от того, сколько времени прошло с предыдущего вызова. Подходит для «игры», где функция называется каждый «тик» или около того, и положение автомобиля должно обновляться по мере увеличения тика, чтобы оно могло быть, например. нарисовано на экране, отметьте галочкой в ​​текущей позиции.

Если ОП вопрос был о том, чтобы узнать, где находится машина в момент времени t, «математически», то другое решение является хорошим (также, прочитайте мой второй комментарий к вопросу)

1 голос
/ 10 июня 2010

С учетом предоставленной вами ограниченной информации нельзя предложить ничего более конкретного, чем

return x * THE_SPEED

.

Второе условие может быть задано как максимальное значение для возвращаемого значения, но оно сложнобез контекста.

Третья спецификация ставит меня в тупик.

0 голосов
/ 10 июня 2010

Если я правильно понимаю, у вас есть объект, который некоторое время движется с постоянной скоростью, затем останавливается, затем снова запускается (с той же скоростью?), Затем останавливается, затем запускается и так далее? Он движется по одномерной траектории, поэтому расстояние от источника - единственный выход, который вас интересует?

Я предлагаю вам определить вспомогательную функцию с именем 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, которое представлено областью между графиком T и горизонтальной осью (на графике x-y).

Поскольку это не дифференцируемая или непрерывная функция, вам не придется выполнять сложные математические вычисления, вы можете очень легко интегрировать численно. Немного так:

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

Возможно, это выглядит немного беспорядочно. Более сложный подход заключается в получении значения speedAt из структуры данных, но я надеюсь, что вы получите представление.

0 голосов
/ 10 июня 2010

Я не уверен, правильно ли я понял вашу проблему, но вы хотите что-то подобное?

(при условии C)

int position(int time)
{
    static int x = 0;
    x += time * SPEED;
    return x;
}
0 голосов
/ 10 июня 2010

Для первых двух временных интервалов вы можете сделать это:

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

Это заставит ваш объект двигаться с постоянной скоростью в течение интервала времени A, а затем остановится.

...