![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Aug 2011
Сообщений: 21
|
В коде реализовано создание прямой линии с помощью класса Graphics. Затем проверяется столкновение движущегося объекта с ней (hitTestObject). Однако если линия не строго вертикальная или горизонтальная, то ее границы являются прямоугольником, а сама она является по сути его диагональю. И столкновение срабатывает до того, как объект визуально сталкивается с ней.
Подскажите, как реализовать нормальное столкновение с этой линией, или альтернативный вариант. Заранее благодарю. |
|
|||||
|
1 - Сохраняете координаты начала и конца отрезка.
2 - Проверяете hitTestObject. if(!hitTestObject) return false; 3 - Разбиваете объект на точки лежащие на его границе. 4 - Находите формулу прямой, на которой лежит Ваш отрезок. 5 - Если находите 2 точки, полученные из пункта 3, лежащие с разных сторон прямой - объект пересекается с линией.
__________________
ranga |
|
|||||
|
Регистрация: Aug 2011
Сообщений: 21
|
incvizitor, спасибо что откликнулись.
Все ясно, кроме пункта 3. У меня объект - круг, что за точки, лежащие на его границе? |
|
|||||
|
Ну есть много методик как собрать точки лежащие на прямой. Но в данном случае проще использовать формулу расстояния точки от прямой. Если расстояние центра окружности от линии больше радиуса - то они не пересекаются.
__________________
ranga |
|
|||||
|
Lorem ipsum
|
Тогда все еще проще:
private function distance(lineX1:Number, lineY1:Number, lineX2:Number, lineY2:Number, pointX:Number, pointY:Number):Number { var A:Number = lineY1 - lineY2; var B:Number = lineX2 - lineX1; var C:Number = lineX1 * lineY2 - lineX2 * lineY1; return Math.abs((A * pointX + B * pointY + C) / Math.sqrt(A * A + B * B)); } Добавлено через 2 минуты Ну и разумеется, после понимания работы метода неплохо бы оптимизировать его работу и вынести вычисления параметров A, B и C — они высчитываются однажды, если линия не движется.
__________________
Поймай яблоко 2! Последний раз редактировалось Zebestov; 19.09.2011 в 20:27. |
|
|||||
|
Регистрация: Aug 2011
Сообщений: 21
|
incvizitor, Zebestov, большое спасибо! Все работает.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 08:59. |
|
|
« Предыдущая тема | Следующая тема » |
|
|