Возможно, вам не нужны семафоры для реализации решения. Проблема не в контроле ресурсов (не нужно блокировать квадранты), а в планировании ресурсов.
Давайте предположим, что движение / время происходит вдискретные шаги
, чтобы узнать, когда начать движение вашего автомобиля, вы должны предсказать, будет ли использоваться квадрант, когда он понадобится вам в будущем ... для этого, поскольку каждый автомобиль попадает на перекрестокдолжен описать свое намерение .. используя очередь шагов .. пример:
позволяет иметь очередь с 1 строкой для каждого квадранта
T 1 2 3 4 5 6 7 8 9
0|
1|
2|
3|
, когда автомобиль 1 идет снизу (2)он будет использовать (Quadrants: 2 1 0), поэтому он резервирует квадранты
T 1 2 3 4 5 6 7 8 9
0| 1
1| 1
2|1
3|
, если автомобиль № 2 идет справа на тике 2 и хочет двигаться вперед (Q: 1)
T 1 2 3 4 5 6 7 8 9
0| 2*1
1| 2*1
2|1
3|
у нас происходит авария, поэтому каждая машина будет пытаться пометить намерение только в том случае, если все квадранты, в которых она нуждается, пустые ... если нет, то она сдвинет намерение на 1 кадр и попытается снова ... в этом случаерасписаниеДля автомобиля 2 будет
T 1 2 3 4 5 6 7 8 9
0| 1 2
1| 1 2
2|1
3|
, если не возникнет конфликта, движение может быть запланировано как можно скорее, если автомобиль 3 выйдет во временном интервале 2 сверху (0) и захочет опуститься (Q: 0 3) он может начать немедленно.потому что ни один из квадрантов, которые он намеренно использует, не будет занят, когда ему понадобится его использовать
T 1 2 3 4 5 6 7 8 9
0| 3 1 2
1| 1 2
2|1
3| 3
, это общий метод .. для конкретной реализации будут изменения .. есливам нужны потоки (по одному на каждую машину), вам может потребоваться синхронизировать их доступ к очереди .. но это только для синхронизации доступа к данным , а не логика пересечения
и, если движениешаги не являются дискретными единицами, кадр очереди должен представлять X секунд анимации.