Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Алгоритм] Прямоугольник и луч


Автор: MaXL 21.12.2006, 09:34
Всем привет!
Помогите мне, натолкните в правильное направление :-). Я сколько думал, ничего не выходит. Получилось решить только для 0 и 360 градусов.
Вот данные:
Код

Прямоугольник со сторонами, параллельными осям координат, задан координатами двух
противоположных вершин (x1, y1) и (x2, y2). Луч, выходящий из начала координат, 
задан углом α, который он образует с положительным направлением оси ординат.

Требуется вычислить площадь части прямоугольника, лежащей внутри угла, 
образованного лучом и положительным направлением оси ординат.
Все координаты не превосходят по модулю 105. Угол находится в диапазоне от 0 до 360°.

Примеры тестов
№    Входной файл    Выходной файл
1    

0.0 0.0 50.0 50.0 45.0            1250.0
2     
-20.0 -50.0 -10.0 -40.0 78.0   0.0

Автор: Alexeis 21.12.2006, 10:17

M
alexeis1
Модератор: указывайте язык программирования в заголовке так как этого требуют правила.

Автор: Pete 22.12.2006, 21:49
Решить просто, но придется аккуратно рассматривать много возможных ситуаций. Может, есть более элегантное решение...

Автор: MaXL 23.12.2006, 04:46
Вот именно много различных вариантов. И сам код может разрастись до таких размеров что....
Сейчас делал для угла в 90 градусов, и там получилось окло 10-15 строк. А нужно для всех  smile 
Вот уже вторую неделю голову ломаю...

Автор: maxim1000 23.12.2006, 05:06
значит надо сводить одни варианты к другим smile
честно говоря, не помню, что такое ось ординат, буду предполагать, что горизонтальная
если ошибся - просто поменять x на y

1. отсекаем углы > 180:
если угол больше 180, значит, область между лучом и положительной частью оси ординат состоит из полуплоскости и сектора с углом < 180
для полуплоскости решаем отдельно (там всё очевидно)
для сектора - просто отражаем всю задачу относительно начала координат и решаем

2. отсекаем углы > 90:
если угол больше 90, значит наш сектор может быть представлен как объединение двух: с углом 90 и с углом (alpha - 90) (второй меньше 90, т.к. alpha < 180)
для "прямоугольного" сектора опять решаем отдельно (опять же очевидно)

3. переносим прямоугольник вверх:
если прямоугольник полностью внизу, площадь - 0
если частично, просто отрезаем нижнюю часть (приравниваем её y-координаты 0-лю)

дальше уже достаточно просто - рассмотреть три области по горизонтали:
1. луч ниже нижней стороны прямоугольника, эта часть даст 0
2. между сторонами, площадь этой части считаем, как для прямоугольного треугольника
3. над верхней, это - обычный прямоугольник (часть исходного), площадь посчитать просто

Добавлено @ 05:09 
да, кстати, я предполагал, что для углов > 180 берётся бОльшая часть угла (т.е. по часовой стрелке от положительной части горизонтальной оси к лучу)
если нужно в меньшей, то на первом шаге нужно отражать не относительно начала координат, а относительно горизонтальной оси, и угол станет 360-alpha

Автор: MaXL 23.12.2006, 10:49
Ось Y - эта по вертикали smile
У
Цитата(maxim1000 @  23.12.2006,  05:06 Найти цитируемый пост)
да, кстати, я предполагал, что для углов > 180 берется большая часть угла (т.е. по часовой стрелке от положительной части горизонтальной оси к лучу)

да берется большая часть. Я забыл указать, что угол отсчитывается против часовой стрелки. Ну т.е. если угол 90 градусов, то угол будет YOX (O - начала координат). 

maxim1000, я вот понял, только то что нужно отрезать и для полуплоскости и для сектора находить по разному, а потом просто суммировать. Но вот как найти площадь сектора а если чесно не очень понял  smile 

Цитата(maxim1000 @  23.12.2006,  05:06 Найти цитируемый пост)
для сектора - просто отражаем всю задачу относительно начала координат и решаем

А вот тут я всё немогу понять, что имеется ввиду  smile 
Можно поподробнее?  smile 

Автор: maxim1000 23.12.2006, 20:45
т.е. по первым трём пунктам вопросов нет, только по последней стадии?

надо нарисовать прямоугольник, луч и ось
продолжить горизонтальные (ну всё-таки пока продолжу для оси X) стороны прямоугольника до прямых
найти точки пересечения луча с верхней и с нижней сторонами
для верхней точка будет правее (специально для этого был второй пункт)
потом разбиваем всё это двумя вертикальными прямыми, проходящими через эти две точки, получаем три области, в каждой решаем задачу (там получаются простые фигуры, для которых можно посчитать площадь)

Автор: Pete 23.12.2006, 21:34
Цитата(MaXL @  21.12.2006,  10:34 Найти цитируемый пост)
Все координаты не превосходят по модулю 105.

Не 105, а 10^5.  smile 

Автор: MaXL 24.12.2006, 10:20
Цитата(Pete @  23.12.2006,  21:34 Найти цитируемый пост)
Не 105, а 10^5. 

Да конечно 10^5  smile 

maxim1000, спасибо, вроде бы ход твоих мыслей понял  smile  буду пробовать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)