Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Алгоритм] Прямоугольник и луч 
V
    Опции темы
MaXL
Дата 21.12.2006, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


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

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



Всем привет!
Помогите мне, натолкните в правильное направление :-). Я сколько думал, ничего не выходит. Получилось решить только для 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


Это сообщение отредактировал(а) Kuvaldis - 23.12.2006, 00:03


--------------------
MaXL
PM MAIL   Вверх
Alexeis
Дата 21.12.2006, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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




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



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Pete
Дата 22.12.2006, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
MaXL
Дата 23.12.2006, 04:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


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

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



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


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


Эксперт
****


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

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



значит надо сводить одни варианты к другим 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


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


Developer
**


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

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



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

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

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

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

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


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


Эксперт
****


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

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



т.е. по первым трём пунктам вопросов нет, только по последней стадии?

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


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


Опытный
**


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

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



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

Не 105, а 10^5.  smile 

Это сообщение отредактировал(а) Pete - 23.12.2006, 21:35


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
MaXL
Дата 24.12.2006, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


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

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



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

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

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


--------------------
MaXL
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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