Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проверка принадлежности окружности группе квадратов. (http://www.flasher.ru/forum/showthread.php?t=152720)

JackFromChaos 22.03.2011 12:46

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

Zebestov 22.03.2011 12:56

А можешь нарисовать "окружность внутри квадратов", а то я шота нифига не могу визуализировать задачу.

JackFromChaos 22.03.2011 13:15

http://cs11491.vkontakte.ru/u1006614...x_49f4be2f.jpg
Серые квадраты - есть квадрат, белые квадраты - нет квадрата.

Добавлено через 6 минут
На основе квадратов нельзя построить один выпуклый многоугольник... К тому что они не выпуклые, еще добавляется то, что внутри могут быть пустые квадраты, и это не обязательно одна группа квадратов, т.е. внутри матрицы может быть несколько групп квадратов... в общем жесть :(
Например так:
http://cs11491.vkontakte.ru/u1006614...x_3aa35e98.jpg

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

Zebestov 22.03.2011 13:37

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


Код 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.
код написан прямо тут есличё )

JackFromChaos 22.03.2011 13:39

Ага, спасибо. Неплохой вариант.

crazylena 22.03.2011 13:40

Зая, не позорь семью, приду все напишу )))

Zebestov 22.03.2011 13:40

Сейчас понял, что можно еще проще — алгоритм будет быстрее, если просто тупо найти координаты самого верхнего левого квадрата, пересекающего окр. и самого правого нижнего. В этих пределах пройтись вложенными циклами и сделать только часть с allGrayFlag.

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

Код AS3:

topLeftX = Math.floor(circleX - R);
topLeftY = Math.floor(circleY - R);
bottomRightX = Math.floor(circleX + R);
bottomRightY = Math.floor(circleY + R);

вот между ними и пройтись циклами. будет быстрее, чем лопатить все все квадраты.

crazylena 22.03.2011 13:44

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

wvxvw 22.03.2011 14:00

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

Zebestov 22.03.2011 14:01

crazylena, если ты о первом, то его оптимальность уже подверглась критике самого автора ;)
А вот с "поправкой" алгоритм (именно алгоритм) претендует на звание "оптимальный" — быстрее не будет.

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


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

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