Форум 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, 15:16
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 8  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
Цитата:
Сообщение от Zebestov Посмотреть сообщение
Сейчас понял, что можно еще проще — алгоритм будет быстрее, если просто тупо найти координаты самого верхнего левого квадрата, пересекающего окр. и самого правого нижнего. В этих пределах пройтись вложенными циклами и сделать только часть с allGrayFlag.
...
Ну собственно я сразу о чем то таком подумал, правда не успел сформулировать
Вариант по моему нормальный, вряд ли его можно принципиально улучшить...
Зато здесь можно легко и просто все проверять, и не только на Null, а скажем на тип квадрата... если поверхность может быть разного типа, например вода... На которой тоже нельзя строить... Или если сооружение может строится только на поверхностях какого то определенного типа. Правда пока так задача не стоит, но потенциально можно применять

Добавлено через 15 минут
Цитата:
Сообщение от wvxvw Посмотреть сообщение
А на сколько больше может быть диаметр кругов чем сторона квадрата? Т.е. может быть такая ситуация, что круг полностью "закрывает" незакрашеный квадрат, и должна ли такая ситуация "дисквалифицировать" круг?
Диаметр круга может быть любого размера...

Добавлено через 28 минут
Кстати, как мне кажется, вполне доказательство, что красиво могут выгладить не только изометрические и хексагональные тайлы
__________________
Искренне Ваш, Джек.

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

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

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

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

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

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

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


 


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


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