Если ваша «линия» - это действительная линия (кратчайшее расстояние между двумя точками), а не набор случайных отрезков, возможно, вы можете использовать поиск в ширину, как я делал здесь . Это помогает объяснить немного больше. Это действительно применимо, только когда вся область открыта. Возможно, вам придется изменить это, если диагонали в порядке, и вы хотите использовать PHP вместо ActionScript. Понятия могут помочь вам, хотя.
Однако, если ваша линия - это не линия, а волнистый рисунок, который начинается и заканчивается в точке, то вам, вероятно, нужно выполнить тест пересечения на ваших квадратах, как вы предлагали.
Я не уверен, что у вас будет несколько кратчайших путей с диагоналями на самом деле ... Я все еще думаю, что ваше ограничивающее решение с оптимизацией, вероятно, будет работать лучше, но я не уверен, что это будет на самом деле неправильно любые отсчеты (с диагоналями в порядке и без препятствий.)
Удачи!