![]() |
координаты точки пересечения
как узнать координаты точки пересечения прямой и мувиклипа? я проверил при помощи hitTestObject() пересеклась ли моя прямая и мувик. если пересеклась, то в какой точке? помоги, плиз, разобраться
|
Математикой.
|
наверняка уже есть все давно высчитанное до меня. подскажите, где можно найти формулы и применить их
Добавлено через 56 секунд т.к. у меня опыт во Flash не большой, то я надеялся, что я просто не знаю функцию, которая вернет мне координату точки пересечения... эх... |
Если в двумерном пространстве (на плоскости) искать - то у вас серьезные проблемы :)
Если в трехмерном (т.е. пересечение плоскости мувика и прямой) - то смотрите по ссылке http://ru.wikipedia.org/wiki/%D0%9D%...80%D0%B8%D1%8F |
Код AS3:
|
я так понимаю "слегка" дооптимизировать :)
|
о пересечении прямой(геометрическое понятие) и мувиклипа (программный объект) и говорить-то не очень серьезно, хотя понятно, что под мувиклипом подразумевается некая фигура, но если неизвестно какая, то какие тут могут быть формулы..
как вариант: прошагать по прямой с каким-то шагом (точностью), походу проверяя hitTestPoint мувика с каждой точкой, затратно, но будешь все знать: где пресекается, сколько раз и т.д. |
Однако же, если шаг будет больше, чем линия пересечения - можно тупо перескочить её. Везде свои плюсы и минусы.
|
Цитата:
|
всем спасибо. похоже придется достать конспект по матану и сдуть пыль :) почитать про аппроксимацию. любую (практически любую) сложную фигуру можно свести к простой с определенной степенью точности... а пока что попробую вариант, который предложил silin. буду шагать :)
|
Цитата:
|
аналоговый хак:
отрисовываем мувик в битмапдату1. отрисовываем красную линию в битмапдату2. мержим (или copyChanell) битмапдату1 по альфаканалу битмапдаты2 в битмапдату3(размер общий, зависит от заимного расположения). или так: создаем битмапдату3 ( альфа=0) - размер которой зависит от размеров битмапа1 и битмапа2 и их расположения. копируем красный канал из битмапы2, копируем альфа канал из битмап1. берём результирующую выборку по красному цвету не 0 альфы (getColorBoundsRect) размер rect соответствует "степени пересечения" |
Котяра, а не могли бы вы привести пример кодом, плиз. Я там в начале сразу указал, что у меня опыта не оч много :) моя первая игруха... буду весьма благодарен
|
Цитата:
|
на самом деле, Wolsh, конечно прав. у этого алгоритма даже название есть... Wolsh, подскажи, плиз, как рисовать прямую, увеличивая ее шаг, если я пока рисую ее так
Код AS3:
|
Код AS3:
|
Цитата:
|
оптимизировать.
1) берем промежуток ограниченный баундсом мувика ( формулу сами посчитаете) 2) делаем шаг в delta = len/2 (посередине) 3) хиттестим. если false уменьшаем шаг ( дихотомией, фибоначчи, золотым сечением итп) и в 3) так до 1 пикселя, чтоб быть уверенным что проверили всё. чтоб не хиттестить уже проверенные точки, можно их помечать - записывать в массив или еще как, хотя проверка наличия метки может быть дороже хиттеста) нет здесь никакого экстремума) |
Цитата:
|
По теме: у меня где - то завалялась геометрическая либа. Определяет пересечение графисеских примитивов с прямыми. Кому надо напомните и вечером вставлю
|
было бы неплохо. если там уже все расчеты есть. тут представили несколько вариантов. попробую сделать и так и так. посмотрю, что больше подходит
|
http://img-novosib.fotki.yandex.ru/g..._967ef1b2_orig
Psycho Tiger, читай внимательней))) Мой ответ был как раз на "шаг в пиксель". Предлагал же я вот что. За четыре "шага" мы сокращаем область поиска в 16 раз. 1. Известно, что линия пересекает фигуру, но ее половина - нет. Остается вторая половина для поиска. 2. Новая линия пересекла фигуру - есть точка без пересечения (середина всей линии) и точка с пересечением - 75% всей линии 3. Сокращаем область еще в два раза. Пересечение есть. 4. Сокращаем область еще в два раза. Пересечения нет. Продолжаем в том же духе. 10 "шагов" и у нас останется пять точек для точечной проверки. Не надо идти по каждому пикселю линии! UPD: к сожалению все это только красивая теория. Флэш не сравнивает реальные шейпы, только шейп и точку или bounds шейпов. В реальности даже уменьшая bounds контрольной линии мы рискуем никогда не найти пересечение, так как... его вообще может не быть, хотя hitTestObject и уверяет что есть. Битмапдата пожалуй на сегодняшний день единственный вариант. |
наверное метод, который предложил Партизан самый точный...
Добавлено через 3 минуты Wolsh, то что ты предлагаешь классический алгоритм, который проходят в уневере, так что он по-любому рабочий |
А можно вопрос к топикстартеру.
MovieClip можно представить в виде замкнутого многоуголиника (не обязательно выпоклуго) без самопересечений? Если да, то есть простой алгоритм... (ну почти простой :). Могу расписать. |
Wolsh, метод поиска делением на 2 мне знаком, но это всё равно не выход, я считаю)
|
Обрисовать прямыми мувик и тестить на пересечение как wvxvw нaписал. Пример:
http://www.murmadillo.tut.su/html/li...Intersect.html |
krolser, можно. хотел бы увидеть твой практически простой алгоритм. спасибо. то, что предложил wvxvw тоже работает. надо мувик обрисовать прямыми, закинуть их в массив и проверять на пересечение, а потом юзать его формулы, которые выше. точность будет не высокой. но для некоторых задач ее вполне хватит
|
Цитата:
|
всем спасибо, узнал много нового :), надеюсь для кого-то это тоже было полезно
|
Вот уж не думал , что мой, заброшеный на заре моей юности, блог ещё кому-то может помочь http://as3.ru/?p=6 =)
Вроде в статье есть всё необходимое. |
| Часовой пояс GMT +4, время: 08:16. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.