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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.04.2012, 17:30
anmelegov вне форума Посмотреть профиль Отправить личное сообщение для anmelegov Найти все сообщения от anmelegov
  № 1  
Ответить с цитированием
anmelegov
[+4 07.04.12]
[+1 20.01.12]

Регистрация: Nov 2009
Адрес: Украина, Славутич
Сообщений: 263
По умолчанию алгоритм прилипания панелек при перетаскивании

есть некий интерфейс с панельками, которые можно перетаскивать драг эн дропом, я хочу сделать так чтобы панельки "прилипали" друг к другу, а не наезжали друг на друга... каритнка
Название: 1.JPG
Просмотров: 510

Размер: 3.1 Кб
красным цветом показано как сейчас, синим как я хочу сделать. По идее алгоритм простой, но к концу рабочего дня что-то уже совсем не думается...

Добавлено через 2 минуты
П.С. точка 0,0 панелек в левом верхнем углу


Последний раз редактировалось iNils; 24.04.2012 в 18:06.
Старый 24.04.2012, 21:23
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 2  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Я бы делал сетку и записывал в нее свободные/занятые ячейки. Каждая панелька имела бы заданый размер в ячейках сетки. Чтобы проверить помещается ли панелька ничего лучше обычного перебора всех ячеек сетки не придумать, если минимальный размер панели = одна ячейка. Алгоритм поиска положения ближжайшего к текущему неподходящему наверное проще всего сделать имитируя физику т.е. "прикладывая силу" двигать панельку в каком-то направлении, пока ее нельзя полностью поместить. Почти наверняка есть более сложные алгоритмы как разместить объект на сетке, но почти так же наверняка они более сложные. В общем, этот класс проблем известен как http://en.wikipedia.org/wiki/Packing_problem
__________________
Hell is the possibility of sanity

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

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
ИМХО какая сетка, зачем сетка?
- Задаемся допуском TOLERATE, начиная с которого всё будет прилипать;
- берем таскаемую панельку;
- гоним циклом по всем остальным (сложность линейная, не квадратичная - ничего страшного);
- смотрим i-ю панельку если Math.abs(panelI.x - draggedPanel.x) < TOLERATE - то делаем draggedPanel.x = panelI.x и прекращаем перебор;
- снова перебираем панельнки, но делаем то же самое уже для y-координаты.
Вот вобщем-то и всё. Только лучше дополнительно учесть, что если Math.abs(panelI.x - draggedPanel.x) < TOLERATE, но по y панельнки друг друга не перекрывают - то ничего делать не нужно.

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Оторвать не сможешь.
__________________
Reality.getBounds(this);

Старый 24.04.2012, 23:53
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 5  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
А ещё можно вокруг таскаемой панельки сделать прямоугольник на TOLERATE в каждую сторону больше, и проверять пересечение его с имеющимися панельками, из них определять ближайшие по осям и к ним прилипать.
__________________
:)

Старый 24.04.2012, 23:53
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 6  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Строго говоря задача нерешаема, так как нет никакой гарантии, что есть вообще свободное место, в которое панель поместится, не перекрывая ни одну другую панель. Следовательно необходимо при перегруппировке решать и этот конфликт – то есть перемещать еще и остальные панели, чтобы освободить место для таскаемой. И всё это – только при заданном условии, что площадь всех панелей меньше площади экрана.
__________________
Reality.getBounds(this);

Старый 24.04.2012, 23:54
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 7  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
А обнаружение столкновений для прямоугольников оси стороны которых параллельны осям придумно уже много очень быстрых алгоритмов, AABB и прочие деревья.

Добавлено через 2 минуты
Я так понимаю в начальных условиях панельки как-то расположены и юзер тащит мышкой панель, и надо чтоб она прилепалаи объезжала имеющиеся. В таком случае просто пытаемся помещать панель туда куда юзер указывает курсором, чекаем коллизии и потом резолвим двигая только одну панель, ту которую юзер тащит, а то что она при этом может выехать за границы экрана, так я не вижу в этом особого криминала.
__________________
:)

Старый 25.04.2012, 00:07
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 8  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Оторвать не сможешь.
Чтой-то вдруг? Пользователь оттащил больше чем на допуск - отлепилось. Их же не надо прилепленными таскать, насколько я понял.

Старый 25.04.2012, 00:44
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 9  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
А, ну если снепить только по отпускании, это конечно проще.
Но попробуйте рассматривать не идеальные ситуации, а возможные.
Как бы в этом задача программиста – сделать не так чтобы нечто работало при соблюдении 100500 идеальных условий, а чтобы работало в случае 100500 враждебных.
Вот на картинке топикстартера представьте что синий прямоугольник УЖЕ там стоит, а красную панельку вот в этом месте отпустили. Куда ей бедной прыгать?
Эта ситуация похожа на надуманную, или она будет происходить в 80% случаев?
__________________
Reality.getBounds(this);

Старый 25.04.2012, 12:05
anmelegov вне форума Посмотреть профиль Отправить личное сообщение для anmelegov Найти все сообщения от anmelegov
  № 10  
Ответить с цитированием
anmelegov
[+4 07.04.12]
[+1 20.01.12]

Регистрация: Nov 2009
Адрес: Украина, Славутич
Сообщений: 263
кароче проще забить да?

Добавлено через 5 минут
ладно, а если не учитывать перекрытие других панелек и прилипать только к той, по которой первым срабатывает хитТест, то какой самый простой способ?

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

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

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


 


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


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