Я пишу часть программного обеспечения для моделирования, и мне нужен эффективный способ проверки на столкновения вдоль линии.
Имитация поезда, пересекающего несколько стрелок на пути. Когда колесо находится в пределах N дюймов от переключателя, переключатель включается, а затем выключается, когда колесо отключается. Поскольку все колеса имеют одинаковый размер, а все переключатели одинакового размера, я могу представить их как одну координату X вдоль пути. Расстояния переключения и расстояния между колесами не изменяются относительно друг друга, после установки.
Это довольно тривиальная проблема, когда она выполняется грубой силой, помещая координаты X в списки и обходя их, но мне нужен способ сделать это эффективно, потому что он должен быть чрезвычайно точным, даже когда поезд движется на высоких скоростях. Существует множество обучающих программ по обнаружению столкновений в 2D, но я не уверен, что это лучший способ реализовать этот уникальный 1D сценарий.
Видимо, есть некоторая путаница в том, как выглядят мои данные.
Я моделирую один сайт, а не целый регион. Поезда могут быть любой длины, с разными типами вагонов, но есть только один поезд. Мои данные о поездах имеют вид {48,96,508,556,626,674,...}
, указывающий расстояния от передней части поезда (0
) до центра оси.
(Данные поезда, скорее всего, придут ко мне в виде упорядоченного списка Car
объектов, каждый из которых имеет длину и список целых чисел, представляющих расстояния от оси до передняя часть этой машины, но все это объединено в один список, поскольку все оси для меня одинаковы.)
Все мои переключатели находятся в пределах нескольких сотен футов, и часто будут полностью покрыты поездом. Переключатели могут находиться на любом интервале от сотен футов до нескольких дюймов друг от друга и находятся в той же форме, что и поезд: * с указанием расстояния от начала площадки до центра коммутатора.
Наконец, я знаю расстояние, на котором колесо активирует переключатель, в дюймах.
Например, используя приведенные выше примеры данных и расстояние активации 8 дюймов, первый переключатель при X = 0 активируется, когда поезд достигает X = 40, что означает, что поезд находится на площадке в 40 дюймов. Когда поезд достигает X = 48, переключатель при X = 8 также активируется. При X = 56 первый выключатель отключается, а при X = 64 второй выключатель также выключается. Различные оси включают и выключают разные переключатели, когда они пересекают площадку.
Поезд обычно движется со скоростью менее 10 миль в час, но может идти намного выше. (Прямо сейчас наша симуляция ограничена 30 милями в час, но выше было бы здорово.)