Поиск:

Ответ в темуСоздание новой темы Создание опроса
> попадание объекта на полигоны, математика 
:(
    Опции темы
СЭНСЭЙ
Дата 29.7.2011, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Добрый день.
Разрабатываю 2Д РПГ.
Решаю задачу области видимости.

Итак:
2х мерная система координа.
есть области невидимости. Каждая описана 3мя уравенениями вида
у*а+х*в+с>0
Эти области могут налазить одна на другую
Есть геометрические фигуры: многогранники, круги, линии
многогранники описаны координатами вершин, круг - координатами центра и радиусом, линии - координатами начала и конца.

Нужно разработать алгоритм определения находится ли фигура полностью на зонах невидимости или нет.
PM MAIL   Вверх
Earnest
Дата 29.7.2011, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



А в чем проблема? Область невидимости у тебя - полуплоскость; определение - видима ли конкретная точка - тривиально: она должна быть вне всех областей невидимости... Видимость фигур определяется тоже через точки. Для ускорения можно сначала проверить видимость охватывающих фигуры прямоугольников. В зависимости от числа областей невидимости и\или частоты их изменения возможно есть смысл пересчитать их в видимые полигоны.


--------------------
...
PM   Вверх
СЭНСЭЙ
Дата 30.7.2011, 11:03 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Это настоящее мастерство - написать заумный текст, но на вопрос не ответить вообще.
Я тут ничего ни от кого не требу.
И одолжений никто ни кому не делает.
Кто хочет, то решает задачку.

А такие ответы это флуд чистой воды.
Минусы надо за такие ответы ставить.

Это сообщение отредактировал(а) СЭНСЭЙ - 30.7.2011, 11:03
PM MAIL   Вверх
maxim1000
Дата 30.7.2011, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



СЭНСЭЙ, это не очень эффективный подход к поиску ответа

когда содержимое ответа непонятно, есть два варианта:
1. объявить его "заумным", "водой", лишенным смысла и ждать следующего ответа
2. попытаться уточнить детали и проверить, а действительно ли там нет смысла, или его просто сложно разглядеть

Иногда люди действительно пытаются просто показаться умными и "льют воду", однако, если предполагать это всегда, когда текст непонятен, можно пропустить много полезного.

Второй вариант поведения, как правило, позволяет получить ответ гораздо быстрее.

В данном случае Earnest дала почти полный ответ (по крайней мере для многогранников).

Я попытаюсь написать пояснения, которые могли бы появиться после уточняющих вопросов:

Цитата(Earnest @  29.7.2011,  16:02 Найти цитируемый пост)
Видимость фигур определяется тоже через точки.

Для проверки видимости многогранника мы пробегаем по всем его точкам и ищем хотя бы одну видимую. Если не нашли ни одной - весь многогранник невидим. Если нашли, значит, по крайней мере, кусочек вокруг найденной точки видимый.

Цитата(Earnest @  29.7.2011,  16:02 Найти цитируемый пост)
видима ли конкретная точка - тривиально: она должна быть вне всех областей невидимости..

Для проверки видимости одной точки просто просчитываем неравенство невидимых областей. Если бы хотя бы одно выполнилось - точка невидима.

Цитата(Earnest @  29.7.2011,  16:02 Найти цитируемый пост)
Для ускорения можно сначала проверить видимость охватывающих фигуры прямоугольников

Если у нас многогранник на 10000 вершин, можно сначала вписать его в какую-нибудь простую бОльшую фигуру (квадрат, например) и проверить её точки (4). Если бОльшая фигура не видна, нам не нужно пробегаться по всем очкам многогранника и считать неравенства.


Это сообщение отредактировал(а) maxim1000 - 30.7.2011, 11:50


--------------------
qqq
PM WWW   Вверх
Earnest
Дата 1.8.2011, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Хм, ну да, возможно мой ответ был слишком кратким... ну там жара и т.д. smile 
Кроме того, когда задают вопросы такого сорта, хочется как-то очертить проблему, а не расписывать все и вся от Адама. Может, автору просто в голову не пришли простые вещи, и его нужно просто пнуть в нужном направлении (тем более, когда ник такой скромный  smile).
В общем, maxim все правильно расписал за меня; если остались вопросы - уточняй.


--------------------
...
PM   Вверх
СЭНСЭЙ
Дата 1.8.2011, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Товарищи. Не поймите меня не правильно...
Когда идет посик ответов на такие сложные вопросы действительно расписывать все с нуля не правильно.
Это будет нагромождение текста.
Естественно если я говорю про наложение плогонов, описанных уравнениями, то уж попадание точки в зоны
для меня должно быть тривиальной задачей. Давайте говорить на одном языке.

Естественно вариант вписать фигуры в квадрат и проверить попадание его вершин
само собой разумеющийся.

Я же спрашиваю то что пока не разумеющееся, а конкретно -
Все вершины попадают в зоны, но неизвестно попала ли вся площадь фигуры в зоны.

Я исписал уже пару десятков А4. Думаю на форуме не стоит плодить столько текста.

Итак еще раз вопрос:

2х мерная система координа.
есть области невидимости. Каждая описана 3мя уравенениями вида
у*а+х*в+с>0
Эти области могут налазить одна на другую
Есть геометрические фигуры: многогранники, круги, линии
многогранники описаны координатами вершин, круг - координатами центра и радиусом, линии - координатами начала и конца.

Нужно разработать алгоритм определения находится ли фигура полностью на зонах невидимости или нет.
PM MAIL   Вверх
Earnest
Дата 1.8.2011, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Цитата(СЭНСЭЙ @  1.8.2011,  12:04 Найти цитируемый пост)
Все вершины попадают в зоны, но неизвестно попала ли вся площадь фигуры в зоны.

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

Понятно, что есть некоторая сложность, как представить "открытые" области - т.е. стороны, неотсеченные никакой плоскостью. Здесь возможны, видимо, разные подходы, но самое простое - просто ограничить рассматриваемое пространство - ведь оно наверняка и так ограничено. Скажем, это может быть охватывающий прямоугольник всех проверяемых фигур. Этот же подход дает и ответ на вопрос, как построить полигон видимости из полуплоскостей: начинаем с квадрата и по очереди рассекаем его каждой полуплоскостью, оставляя только видимую часть.



--------------------
...
PM   Вверх
maxim1000
Дата 1.8.2011, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



многоугольники выпуклые?


--------------------
qqq
PM WWW   Вверх
СЭНСЭЙ
Дата 2.8.2011, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Earnest - не совсем. Вся ли фигура попала в зонЫ.
Вы почти правильно поняли.
Только вы расписываете проблему, а я ищу математическое решение.
Статью на эту тему напишем после.

На данный момент работаю над графическим, дискретным решением.

maxim1000 - можете прокомментировать свой вопрос?
PM MAIL   Вверх
maxim1000
Дата 2.8.2011, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



если у многоугольника все углы направлены внутрь, он выпуклый
http://s2.ipicture.ru/uploads/20110802/fzToVSRN.png

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



--------------------
qqq
PM WWW   Вверх
СЭНСЭЙ
Дата 2.8.2011, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Мы еще не подошли к тому моменту когда это может быть принципиальным,
но
предполагается что все многоугольники будут 4 сторонними.
Скорее всего будут только прямоугольники, но хочу что бы решение было универсальным хотя бы выпуклых для 4гранников
PM MAIL   Вверх
maxim1000
Дата 2.8.2011, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



если выпуклые, то алгоритм довольно простой:
1. чтобы определить видимость многоугольника, нужно отрезать от него каждую невидимую полуплоскость и посмотреть, осталось ли что-то
2. одно отрезание делается так:
Код

TPolygon CutoffInvisibleArea(TPolygon polygon, TArea invisibleArea)
{
    TPolygon result;
    for(TVertex vertex:polygon)
    {
        if(invisibleArea.Contains(vertex))
        {
            if(!invisibleArea.Contains(polygon.NextVertex(vertex))
                result.Add(invisibleArea.BorderVertex(vertex,polygon.NextVertex(vertex)));
        }
        else
        {
            result.Add(vertex);
            if(invisibleArea.Contains(polygon.NextVertex(vertex))
                result.Add(invisibleArea.BorderVertex(vertex,polygon.NextVertex(vertex)));
        }
    }
    return result;
}

TPolygon - полигон
TArea - невидимая область
TVertex - вершина полигона
TArea::Contains(vertex) - проверяет содержится ли точка в области
TPolygon::NextVertex(vertex) - находит вершину, следующую за vertex
TArea::BorderVertex(vertex1,vertex2) - находит точку пересечения отрезка [vertex1,vertex2] и прямой, которая ограничивает невидимую область


--------------------
qqq
PM WWW   Вверх
СЭНСЭЙ
Дата 11.8.2011, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



А меня есть получше алгоритм:
написать программу{З: Задумка; И:Инструмент}
{
for нафига 
{
писать;
}
else
{
оставить как есть;
}
}

Еще есть анекдот, как программиста нашли мертвым в душе.
В руке он держать флакон с шампунем, а на флаконе было написано:
"Нанести на руку, растереть, повторить".


Короче решил пока что так:
Расставил все фигуры в порядке удаленности от наблюдателя,
Описал зону невидимости от первой фигуры,
Перебираю остальные фигуры по очереди,
Беру на периметре фигуры 12 точек, получить координаты которых не составляет труда.
Проверяю попадание каждой точки на зоны невидимости. Если все 12 точек попали хоть на одну из зон, то фигура невидимая.
Если фигура видимая, то вычисляется ее зона невидимости и добавляется в список зон.
12 точек вполне достаточно для моей задумки, учитывая что я делаю Рогалик.
В крайнем случае можно взять 24 или 32.
Работает быстро.
PM MAIL   Вверх
Cheloveck
Дата 11.8.2011, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32





--------------------
user posted image
PM Jabber   Вверх
СЭНСЭЙ
Дата 12.8.2011, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Прочитал.
Но мой случай довольно отличается.
И мое решение на данный момент на много проще.
Возьму на заметку.

Спасибо тебе!!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.2953 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.