Имитация движения машины по трассе - PullRequest
3 голосов
/ 16 апреля 2009

Для класса «Операционные системы» я собираюсь написать симулятор планирования под названием «Парк Юрского периода».

Конечная цель для меня состоит в том, чтобы несколько машин следовали по заданному пути, а пассажиры стояли в очереди в заданном месте, чтобы те машины могли вернуться, чтобы их можно было забрать и взять с собой в тур. Это будет простой двухмерный вид сверху на трек и движущиеся по нему автомобили.

Несмотря на то, что я могу легко это кодировать, не имея визуального отображения чего-либо, я не совсем уверен, как лучше реализовать автомобиль, движущийся по фиксированной трассе.

Для начала я собираюсь просто использовать OpenGL, чтобы рисовать свои машины в виде прямоугольников, но я все еще немного озадачен тем, как подходить к обновлению позиции автомобиля и обеспечению его движения по заданному пути для смоделированной темы. парк.

Стоит ли хранить вершины трека в списке и каждый вызов update() перемещать автомобили на шаг ближе к следующей вершине?

Ответы [ 4 ]

2 голосов
/ 17 апреля 2009

Если вы хотите изогнутую дорожку, вы можете использовать сплайны, которые являются математически определенными кривыми, заданными двумя конечными точками вектора. Вы падаете на конечные точки, а затем решаете для хорошей кривой между ними. Поиск должен выявить исходный код или математику, которые вы можете получить в исходном коде. Хорошая вещь в этом заключается в том, что вы можете точно определить курс вашего автомобиля, а также получить следующую точку на вашем пути, выполнив расчет процента. Сложность состоит в том, что вам нужно вычислить длину кривой, если вы не хотите, чтобы одинаковое количество шагов между каждым набором конечных точек.

Альтернативный подход заключается в использовании скрытого растрового изображения с путем, нарисованным на нем в виде кривой шириной в один пиксель. Вы можете найти следующее местоположение на пути, сопоставив пиксели, окружающие ваше текущее местоположение, с вектором направления движения, а затем обновите вектор дельта-функцией на каждом шаге. Мы использовали этот подход для прототипа путешествия по пути, когда «транспортное средство» «двигалось» по различным путям с помощью джойстика, и это работает нормально, пока у вас не возникнут некоторые пересечения, которые запутывают ваши векторные вычисления. Но если это однонаправленный замкнутый цикл, это будет прекрасно работать, и его очень просто реализовать. Вы можете сгладить угол курса вашего автомобиля, усредняя последние несколько дельт. Кроме того, каждый пиксель становится одним «шагом», поэтому вы легко можете управлять скоростью.

В первом случае вы можете иметь специально помеченные конечные точки для мест начала / остановки или точек интереса. В последнем случае просто используйте другой цветовой пиксель на пути для специальных узлов. В любом случае, то, что вы отображаете, вероятно, будет не базовыми данными пути, а каким-то изощренным представлением вашего «парка».

Просто выберите все, что проще, и напишите функцию tick (), которая переходит к следующему пути и обновляет курс вашего автомобиля, когда автомобиль находится в движении. Если вы действительно умны, вы можете выполнить некоторую обработку столкновений на основе радиуса, чтобы машины автоматически останавливались, когда перед ними остановилась машина.

0 голосов
/ 16 апреля 2009

Ну, вы можете использовать какой-нибудь путь, как вы описываете, эфир с фиксированной точкой или сплайн. Затем двигайтесь как фиксированная «скорость» на этом пути. Это может выглядеть жестко, если автомобиль движется с той же скоростью, что и на поворотах.

Таким образом, у вас может быть скорость для каждого участка пути, но вам потребуется много заданных значений скорости или смешать скорости, иначе вы получите резкие изменения скорости.

Или вы можете пойти на полную симуляцию автомобиля и использовать A *, чтобы построить оптимальный путь. Все кончено но очень круто .

0 голосов
/ 16 апреля 2009

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

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

Существуют и другие подходы, которые могут сработать, но этот простой, ИМО, и позволяет вам иметь плавные повороты на дороге.

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

Это было бы не так гладко, но также легко сделать.

0 голосов
/ 16 апреля 2009

Я бы сказал проще:

Запустите таймер (каждые 100 мсек), и на каждом таймере нарисуйте каждую из машин в новом месте. Местоположение читается из файла, который содержит 2D-координаты автомобиля (каждый автомобиль?).

Если вы планируете очень длинный путь (скажем, 30 секунд), написание 30 * 10 баллов будет ... трудным. Так как насчет сохранения в файле местоположения в каждую полную секунду? Тогда между этими двумя интервалами у вас будет 9 слепых зон, просто двигайте машину с постоянной скоростью (x + = dx / 9, y + = dy / 9).

Я хотел бы услышать лучший подход:)

...