Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проверка на столкновение с линией (http://www.flasher.ru/forum/showthread.php?t=168306)

MrCyber 19.09.2011 18:31

Проверка на столкновение с линией
 
В коде реализовано создание прямой линии с помощью класса Graphics. Затем проверяется столкновение движущегося объекта с ней (hitTestObject). Однако если линия не строго вертикальная или горизонтальная, то ее границы являются прямоугольником, а сама она является по сути его диагональю. И столкновение срабатывает до того, как объект визуально сталкивается с ней.
Подскажите, как реализовать нормальное столкновение с этой линией, или альтернативный вариант. Заранее благодарю.

incvizitor 19.09.2011 19:03

1 - Сохраняете координаты начала и конца отрезка.
2 - Проверяете hitTestObject. if(!hitTestObject) return false;
3 - Разбиваете объект на точки лежащие на его границе.
4 - Находите формулу прямой, на которой лежит Ваш отрезок.
5 - Если находите 2 точки, полученные из пункта 3, лежащие с разных сторон прямой - объект пересекается с линией.

MrCyber 19.09.2011 19:19

incvizitor, спасибо что откликнулись.
Все ясно, кроме пункта 3. У меня объект - круг, что за точки, лежащие на его границе?

incvizitor 19.09.2011 19:48

Ну есть много методик как собрать точки лежащие на прямой. Но в данном случае проще использовать формулу расстояния точки от прямой. Если расстояние центра окружности от линии больше радиуса - то они не пересекаются.

Zebestov 19.09.2011 19:54

Тогда все еще проще:

Код AS3:

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 — они высчитываются однажды, если линия не движется.

MrCyber 19.09.2011 20:16

incvizitor, Zebestov, большое спасибо! Все работает.


Часовой пояс GMT +4, время: 15:19.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.