Если это очевидно — на кой тогда ваш ИИ? ИИ нужен там, где, как раз не очевидно. Например, в описанном вами случае: человек, которому очевидно, что тормозить надо перед крутым поворотом, быстрее вашего ИИ пройдёт прямой участок — и вылетит с трассы на повороте. ИИ притомозит на прямом участке, отстанет, но впишется в поворот.
Попробую спросить ещё раз. Предположим, в ваших точках разрыва не разрыв, а крутой — очень крутой — переход от одного значения к другому, так что функция кривизны непрерывна. Что это меняет в вашем алгоритме? Он, кстати, у вас есть, или ещё думаете?
Алгоритм есть. Выглядит вкратце так:
1. Разбиваем траекторию на отрезки (так проще считать), например, по 10 - 20 промежуточных точек между опорными точками.
2. Для каждой точки считаем максимальную мгновенную скорость, с которой можно находиться в этой точке и не улететь в занос.
3. У нас фактически есть на руках функция зависимости радиуса кривизны от позиции на трассе. Находим точки - локальные минимумы. Каждая такая точка - это точка, в которой скорость будет минимальной. Соответственно, до этой точки надо тормозить, в этой точке тормозить уже не нужно, а дальше можно разгоняться.
4. От каждой такой точки двигаемся назад. Например, точка с номером
является локальным минимумом. Используя значение максимально возможного ускорения торможения, считаем, какую максимальную скорость можно иметь в точке
, чтобы успеть затормозить до скорости
к моменту достижения точки
. Сравниваем эту скорость и скорость, полученную на шаге 2. Берем меньшую из них. Переходим к расчету скорости в точке
.
5. В процессе гонки все просто: скорость меньше допустимой - разгоняемся,
больше - тормозим больше быть не должно, потому что если больше - то уже 100% вылетишь с трассы.
Отсюда следует ответ на вопрос, чем мне мешают разрывы. Если разрыв идет "вверх" (то есть позволяет слишком большую скорость) - это не страшно, потому что при расчетах я буду опираться на точки впереди, допускающие меньшую скорость. А если разрыв будет идти "вниз", то есть уменьшать допустимую скорость, то машина будет проходить поворот медленнее, чем могла бы.
То, что мне (дилетанту в этой области) приходит в голову:
1. Прописать заведомо избыточное число узлов
2. Сгладить кривую сплайном нужного порядка (третьего, для простоты)
3. Выбрать новые узлы так, что бы они лежали как можно ближе к полученной кривой
4. Проинтерполировать по полученным узлам кривую кубическими сплайнами с сшиванием двух производных
1 и 3 я пробовал, избежать проблемы не удалось. А 2 и 4 - это фактически взять другой сплайн, этим я и собираюсь сейчас заняться.
Посмотрите в книге Гарднера «Математические новеллы» в главе 33 описание игры «Гонки» (страница 402). Там полторы странички, не считая картинки. Вам, наверное, понравится, и могут прийти какие-то идеи.
Да, такую игру я знаю (хотя и слышал в варианте с более слабыми правилами). У меня концептуально то же самое, только чуть усложнено.
ewertСпасибо! Пойду читать.