Я разработчик флеш-сценариев, немного отсталый в математике, хотя я нахожу физику интересной и классной.
Для справки это игра, похожая на ту, которую я делаю: Флеш игра
Я сделал эту распутанную игру почти до полного завершения логики. Но когда две линии пересекаются, мне нужны эти пересекающиеся или «запутанные» линии, чтобы показать другой цвет; красный.
Было бы очень любезно с вашей стороны, если бы вы могли предложить алгоритм обнаружения отрезка столкновений. Я в основном человек, который любит думать «визуально», а не «арифметически» :)
Изменить: я хотел бы добавить несколько диаграмм, чтобы сделать идею более ясной
PS я пытаюсь сделать функцию как
private function isIntersecting(A:Point, B:Point, C:Point, D:Point):Boolean
Заранее спасибо.
Ответы:
Я использую следующий метод, который в значительной степени является просто реализацией этого алгоритма . Это в C #, но перевод его в ActionScript должен быть тривиальным.
Однако в алгоритме есть небольшая проблема, в которой две строки совпадают, но не пересекаются. Алгоритм по-прежнему возвращает перемычки в этом случае. Если вы заботитесь об этом случае, я полагаю, что этот ответ на stackoverflow имеет более сложную версию, которая обращается к нему.
редактировать
Это странно, я проверил это, и оно работает для меня, за исключением одного случая, который я описал выше. Используя ту же версию, которую я выложил выше, я получил эти результаты, когда взял ее на тест-драйв:
источник
Без дивизий! Так что нет проблем ни с точностью, ни с делением на ноль.
Сегмент 1 линии от A до B Сегмент 2 линии от C до D
Линия - это бесконечная линия, сегмент линии - это определенная часть этой линии.
Проверьте, пересекаются ли две ограничивающие рамки: если пересечения нет -> Нет пересечения! (расчет выполнен, верните false)
Проверьте, пересекает ли линия seg 1 линию seg 2 и не пересекает ли линия seg 2 линию seg 1 (то есть сегмент линии 1 находится по обе стороны от линии, определяемой сегментом линии 2).
Это можно сделать, переместив все точки на -A (т.е. вы переместите 2 строки, чтобы A находилось в оригинале (0,0))
Затем вы проверяете, находятся ли точки C и D по разные стороны линии, определенной от 0,0 до B
Если у вас еще нет «Нет креста», продолжайте использовать не A, B против C, D, а C, D против A, B (те же кальки, просто поменяйте местами A и C, B и D), если нет "Нет Креста!" тогда у вас есть пересечение!
Я искал точные расчеты для перекрестного продукта и нашел этот пост в блоге, который также объясняет метод.
источник
Я просто хочу сказать, что мне это нужно для моей игры Gamemaker Studio, и она работает хорошо:
источник
Принятый ответ дал неправильный ответ в этом случае:
Эти линии, очевидно, не пересекаются, но в соответствии с функцией «правильного ответа» линии пересекаются.
Это то, что я использую:
возвращает 0 = линии не пересекаются
возвращает> 0 = линии пересекаются
Обновление, чтобы ответить на вопрос:
Я не создавал этот код сам. Ему более 5 лет, и я не знаю, каков первоисточник. Но..
Я думаю, что возвращаемое значение - это относительная позиция первой строки, где они пересекаются (это плохо объясняется). Чтобы вычислить точку пересечения, вы, вероятно, можете использовать lerp следующим образом:
(Я не проверял это)
источник