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

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

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

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
По умолчанию Проверка принадлежности окружности группе квадратов.

Задача на стороне модели. Есть группа квадратов со стороной 1, есть окружность представленная координатами и радиусом, который может быть меньше или больше единицы. Нужно проверить, находится ли данная окружность внутри квадратов.
Квадраты представлены двумерным массивом, ячейки которого = null – нет квадрата, не null – есть квадрат.
Точнее так:
Есть одномерный array и пара переменных width, height. Проверка на существование квадрата для точки x,y: array[x+y*width]!=null.
Естественно можно построить какие то промежуточные данные по поверхности квадратов.
Задача происходит часто, по сути по событию mouseMove, в определенном режиме(создание/перемещение объектов).
Подскажите решение?
__________________
Искренне Ваш, Джек.

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

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
А можешь нарисовать "окружность внутри квадратов", а то я шота нифига не могу визуализировать задачу.
__________________
Поймай яблоко 2!

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

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™

Серые квадраты - есть квадрат, белые квадраты - нет квадрата.

Добавлено через 6 минут
На основе квадратов нельзя построить один выпуклый многоугольник... К тому что они не выпуклые, еще добавляется то, что внутри могут быть пустые квадраты, и это не обязательно одна группа квадратов, т.е. внутри матрицы может быть несколько групп квадратов... в общем жесть
Например так:


Добавлено через 11 минут
P.S. Картинки выложил вконтакте... так что что бы отображались надо быть залогиненым... Как выкладывать файлы на форуме, не в курсе
__________________
Искренне Ваш, Джек.


Последний раз редактировалось JackFromChaos; 22.03.2011 в 13:25.
Старый 22.03.2011, 13:37
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 4  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Сори, сейчас с реализацией не помогу, но я бы действовал по следующему алгоритму.
Пляшем не от квадратов, а от окружности. Первым шагом находим все квадраты, которые она пересекает. Вторым шагом проверяем найденную группу квадратов на "серость" )
Нам нужно определиться, что координатой квадрата мы будем считать координату его верхнего левого угла. Таким образом для первого шага находим все квадраты, которые удовлетворяют условиям:


Код AS3:
if ((squareX >= circleX - R) && ((squareX + 1) < circleX + R) && (squareY >= circleY - R) && ((squareY + 1) < circleY + R)) {
    allGrayFlag = allGrayFlag && array[squareX + squareY * width];
    if (!allGrayFlag) break;
}
if (allGrayFlag) {
    trace("Принадлежит!");
} else {
    trace("Облом.");
}
P.S.
код написан прямо тут есличё )
__________________
Поймай яблоко 2!


Последний раз редактировалось Zebestov; 22.03.2011 в 13:40.
Старый 22.03.2011, 13:39
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 5  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
Ага, спасибо. Неплохой вариант.
__________________
Искренне Ваш, Джек.

Старый 22.03.2011, 13:40
crazylena вне форума Посмотреть профиль Отправить личное сообщение для crazylena Найти все сообщения от crazylena
  № 6  
Ответить с цитированием
crazylena

Регистрация: Mar 2011
Сообщений: 2
Зая, не позорь семью, приду все напишу )))

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

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Сейчас понял, что можно еще проще — алгоритм будет быстрее, если просто тупо найти координаты самого верхнего левого квадрата, пересекающего окр. и самого правого нижнего. В этих пределах пройтись вложенными циклами и сделать только часть с allGrayFlag.

Добавлено через 3 минуты
а координаты собственно такие:

Код AS3:
topLeftX = Math.floor(circleX - R);
topLeftY = Math.floor(circleY - R);
bottomRightX = Math.floor(circleX + R);
bottomRightY = Math.floor(circleY + R);
вот между ними и пройтись циклами. будет быстрее, чем лопатить все все квадраты.
__________________
Поймай яблоко 2!

Старый 22.03.2011, 13:44
crazylena вне форума Посмотреть профиль Отправить личное сообщение для crazylena Найти все сообщения от crazylena
  № 8  
Ответить с цитированием
crazylena

Регистрация: Mar 2011
Сообщений: 2
Zebestov ксати вариант не очень хорош его сложность n^2 где n размерность сетки, для алгоритма который выполняется несколько раз в секуду это многовато, нужно построить промежуточные данные о "пограничных с серыми клетках" и отслеживать пересечение с ними - тогда алгоритм станет линейным

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

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
А на сколько больше может быть диаметр кругов чем сторона квадрата? Т.е. может быть такая ситуация, что круг полностью "закрывает" незакрашеный квадрат, и должна ли такая ситуация "дисквалифицировать" круг?
__________________
Hell is the possibility of sanity

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

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
crazylena, если ты о первом, то его оптимальность уже подверглась критике самого автора
А вот с "поправкой" алгоритм (именно алгоритм) претендует на звание "оптимальный" — быстрее не будет.

Добавлено через 3 минуты
wvxvw круг с диаметром больше 1 не может просто полностью закрыть незакрашенный квадрат — он автоматически зацепит соседние 3-8 квадратов.
__________________
Поймай яблоко 2!

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

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

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


 


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


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