Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача на геометрию. Требуется посчитать площадь пересечения. 
V
    Опции темы
Vasiliyvaya
Дата 4.12.2011, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проблема решена.

Это сообщение отредактировал(а) Vasiliyvaya - 7.12.2011, 14:00
PM MAIL   Вверх
maxdiver
Дата 5.12.2011, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



С такой точностью подойдёт простое приближённое решение: заменим окружность правильным многоугольником, скажем, со 100 000 точек, и пересечём этот многоугольник с треугольником.

Хинт: чтобы точность была получше, правильный многоугольник надо брать такой, чтобы его площадь равнялась PI*r^2, т.е. расстояние от вершин до центра этого многоугольника должны быть чуть больше r (на сколько больше - можно посчитать с помощью формулы площади правильного многоугольника).

Как пересекать многоугольник с треугольником? Есть очень простой алгоритм пересечения многоугольника с полуплоскостью: мы идём по вершинам многоугольника, и смотрим: если текущая вершина лежит в требуемой полуплоскости, то добавляем её в ответ; затем смотрим: если текущая вершина и следующая вершина лежат строго по разные стороны от прямой, то добавляем в ответ точку пересечения прямой с этим отрезком.

Итого - простое приближённое решение с ~30 строками кода.



Просто для сравнения - точное решение этой задачи будет примерно таким. Находим все точки пересечения окружности со сторонами треугольника, добавляем к ним три вершины треугольника. Затем строим из этих точек планарный граф (в котором рёбра могут быть как прямыми отрезками, так и дугами окружности), и удаляем из графа те рёбра, середины которых не лежат в окружности либо в треугольнике. Дальше у нас остались только рёбра, ограничивающие искомую фигуру, поэтому одним обходом мы можем выписать эти рёбра в том порядке, в котором они идут вдоль границы. Тогда задача нахождения площади сводится к двум позадачкам: по данному ребру найти площадь трапеции под ним (это халява) и по данной дуге найти площадь криволинейной трапеции под ней (а это жесть, придётся поковыряться с интегралами). Итого получилось решение, пожалуй, раз в 100 сложнее по написанию smile
PM MAIL WWW ICQ   Вверх
Vasiliyvaya
Дата 5.12.2011, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



to maxdiver.
Можете показать примерный код приближенного решения?
PM MAIL   Вверх
maxdiver
Дата 5.12.2011, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну у меня нет готовой реализации под рукой. Кажется, что "примерно" я и так словами уже всё описал.
Вся реализация сводится к тому, чтобы три раза пересечь многоугольник с полуплоскостью (полуплоскость - это прямая плюс знак (+ или -) ). Как пересекать - я написал.
PM MAIL WWW ICQ   Вверх
Vasiliyvaya
Дата 5.12.2011, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Непонятно как мы саму площадь пересечения найдем-то? Мы же ведь добавляем точки, а не какую-то площадь чего-либо.
PM MAIL   Вверх
maxdiver
Дата 5.12.2011, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну после того, как мы пересечём всё и получим многоугольник - найти его площадь уже совсем просто.
Формула площади:
Код

| СУММА (x[i] + x[i+1]) * (y[i] - y[i+1]) |

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


Новичок



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

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



Тогда нам надо найти только точки пересечения, зачем добавлять еще точки, которые лежат в нужной стороне полуплоскости?
PM MAIL   Вверх
maxdiver
Дата 5.12.2011, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как это - был многоугольник из тысяч точек, мы хотим пересечь его с треугольником - нельзя же для этого только точки пересечения оставить.
PM MAIL WWW ICQ   Вверх
Vasiliyvaya
Дата 5.12.2011, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Просто если добавлять все точки, которые находятся в нужной полуплоскости, а потом считать площадь фигуры, то можно вообще лишнюю площадь посчитать? Или же мы сначала добавим все нужные точки относительно всех 3х полуплоскостей, а потом посчитаем площадь? Если второй вариант, то надо тогда еще удалять точки из ответа, так как нам могла точка подходить, но для данной полуплоскости она уже может не подходить.
PM MAIL   Вверх
maxdiver
Дата 5.12.2011, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну почти второй вариант, только мы сначала оставим все точки, подходящие под первую полуплоскость, потом среди них оставим все точки, подходящие под вторую полуплоскость, и потом среди оставшихся - только те, что подходят под третью. Итого лишних точек не будет, и точки получатся в порядке обхода многоугольника (это важно для формулы площади: случайно перемешанные точки ей не подойдут).
PM MAIL WWW ICQ   Вверх
Vasiliyvaya
Дата 5.12.2011, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да, понятно.
Тогда еще такой вопрос, а как нормально получить эти 10^6 точек многоугольника? Чтобы они были в порядке обхода.
PM MAIL   Вверх
maxdiver
Дата 5.12.2011, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Изначально - понятно как, это просто правильный многоугольник. Если не понятно, то идея такая: пусть r' - это расстояние от центра многоугольника до вершины (r' примерно равно r, оно должно быть чуть больше), и пусть N - число вершин. Тогда i-ая точка будет иметь координаты (r' * cos(2*PI/N*i), r' * sin(2*PI/N*i)).

Потом - когда мы пересекаем с каждой полуплоскостью, этот порядок не нарушится. Действительно, от того, что часть точек удалилась, а перед/после них добавилось по одной точке (точке пересечения) - от этого относительный порядок оставшихся точек не нарушится.
PM MAIL WWW ICQ   Вверх
Vasiliyvaya
Дата 5.12.2011, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Такое решение работает не всегда верно, например, 
x0 = 4, y0 = 4, r = 5
x1 = 0, y1 = 0, x2 = 4, y2 = 0, x3 = 0, y3 = 4.
Тогда, построив многоугольник, мы включим только точки пересесения и несколько точек многоугольника, но вершины треугольника не добавим, то есть площадь неправильно будет посчитана.
PM MAIL   Вверх
maxdiver
Дата 5.12.2011, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нет, почему же, вершины треугольника тоже добавятся.
Ещё раз: мы последовательно пересекаем многоугольник с тремя полуплоскостями: с одной стороной треугольника, со второй стороной, и затем с третьей.
Скажем, вершина (4,0) появится после пересечения с полуплоскостями (0,0)-(4,0) и (0,4)-(4,0).
PM MAIL WWW ICQ   Вверх
Vasiliyvaya
Дата 5.12.2011, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я не понимаю, как она добавится. Ведь мы же проверяем точки многоугольника с полуплоскостями, мы найдем точку пересечения его со стороной (0 0) - (4 0), добавим её, но ведь точку 4 0 не добавим, ведь она и не принадлежит многоугольнику и не является точкой пересечения.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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