Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.09.2011, 18:31
MrCyber вне форума Посмотреть профиль Отправить личное сообщение для MrCyber Найти все сообщения от MrCyber
  № 1  
Ответить с цитированием
MrCyber

Регистрация: Aug 2011
Сообщений: 21
По умолчанию Проверка на столкновение с линией

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

Старый 19.09.2011, 19:03
incvizitor вне форума Посмотреть профиль Отправить личное сообщение для incvizitor Найти все сообщения от incvizitor
  № 2  
Ответить с цитированием
incvizitor
 
Аватар для incvizitor

блогер
Регистрация: Sep 2008
Адрес: Менск
Сообщений: 586
Записей в блоге: 1
Отправить сообщение для incvizitor с помощью Skype™
1 - Сохраняете координаты начала и конца отрезка.
2 - Проверяете hitTestObject. if(!hitTestObject) return false;
3 - Разбиваете объект на точки лежащие на его границе.
4 - Находите формулу прямой, на которой лежит Ваш отрезок.
5 - Если находите 2 точки, полученные из пункта 3, лежащие с разных сторон прямой - объект пересекается с линией.
__________________
ranga

Старый 19.09.2011, 19:19
MrCyber вне форума Посмотреть профиль Отправить личное сообщение для MrCyber Найти все сообщения от MrCyber
  № 3  
Ответить с цитированием
MrCyber

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

Старый 19.09.2011, 19:48
incvizitor вне форума Посмотреть профиль Отправить личное сообщение для incvizitor Найти все сообщения от incvizitor
  № 4  
Ответить с цитированием
incvizitor
 
Аватар для incvizitor

блогер
Регистрация: Sep 2008
Адрес: Менск
Сообщений: 586
Записей в блоге: 1
Отправить сообщение для incvizitor с помощью Skype™
Ну есть много методик как собрать точки лежащие на прямой. Но в данном случае проще использовать формулу расстояния точки от прямой. Если расстояние центра окружности от линии больше радиуса - то они не пересекаются.
__________________
ranga

Старый 19.09.2011, 19:54
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 5  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Тогда все еще проще:

Код 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 — они высчитываются однажды, если линия не движется.
__________________
Поймай яблоко 2!


Последний раз редактировалось Zebestov; 19.09.2011 в 20:27.
Старый 19.09.2011, 20:16
MrCyber вне форума Посмотреть профиль Отправить личное сообщение для MrCyber Найти все сообщения от MrCyber
  № 6  
Ответить с цитированием
MrCyber

Регистрация: Aug 2011
Сообщений: 21
incvizitor, Zebestov, большое спасибо! Все работает.

Создать новую тему Ответ Часовой пояс GMT +4, время: 10:01.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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