Просмотр полной версии : Проверка на столкновение с линией
В коде реализовано создание прямой линии с помощью класса Graphics. Затем проверяется столкновение движущегося объекта с ней (hitTestObject). Однако если линия не строго вертикальная или горизонтальная, то ее границы являются прямоугольником, а сама она является по сути его диагональю. И столкновение срабатывает до того, как объект визуально сталкивается с ней.
Подскажите, как реализовать нормальное столкновение с этой линией, или альтернативный вариант. Заранее благодарю.
incvizitor
19.09.2011, 19:03
1 - Сохраняете координаты начала и конца отрезка.
2 - Проверяете hitTestObject. if(!hitTestObject) return false;
3 - Разбиваете объект на точки лежащие на его границе.
4 - Находите формулу прямой, на которой лежит Ваш отрезок.
5 - Если находите 2 точки, полученные из пункта 3, лежащие с разных сторон прямой - объект пересекается с линией.
incvizitor, спасибо что откликнулись.
Все ясно, кроме пункта 3. У меня объект - круг, что за точки, лежащие на его границе?
incvizitor
19.09.2011, 19:48
Ну есть много методик как собрать точки лежащие на прямой. Но в данном случае проще использовать формулу расстояния точки от прямой (http://www.pm298.ru/reshenie/tochpr.php). Если расстояние центра окружности от линии больше радиуса - то они не пересекаются.
Zebestov
19.09.2011, 19:54
Тогда все еще проще:
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 — они высчитываются однажды, если линия не движется.
incvizitor, Zebestov, большое спасибо! Все работает.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.