Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Центр помощи > [Алгоритм] Прямоугольник и луч |
Автор: MaXL 21.12.2006, 09:34 | ||
Всем привет! Помогите мне, натолкните в правильное направление :-). Я сколько думал, ничего не выходит. Получилось решить только для 0 и 360 градусов. Вот данные:
|
Автор: Alexeis 21.12.2006, 10:17 | ||
|
Автор: Pete 22.12.2006, 21:49 |
Решить просто, но придется аккуратно рассматривать много возможных ситуаций. Может, есть более элегантное решение... |
Автор: MaXL 23.12.2006, 04:46 |
Вот именно много различных вариантов. И сам код может разрастись до таких размеров что.... Сейчас делал для угла в 90 градусов, и там получилось окло 10-15 строк. А нужно для всех ![]() Вот уже вторую неделю голову ломаю... |
Автор: maxim1000 23.12.2006, 05:06 |
значит надо сводить одни варианты к другим ![]() честно говоря, не помню, что такое ось ординат, буду предполагать, что горизонтальная если ошибся - просто поменять 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 |
Автор: maxim1000 23.12.2006, 20:45 |
т.е. по первым трём пунктам вопросов нет, только по последней стадии? надо нарисовать прямоугольник, луч и ось продолжить горизонтальные (ну всё-таки пока продолжу для оси X) стороны прямоугольника до прямых найти точки пересечения луча с верхней и с нижней сторонами для верхней точка будет правее (специально для этого был второй пункт) потом разбиваем всё это двумя вертикальными прямыми, проходящими через эти две точки, получаем три области, в каждой решаем задачу (там получаются простые фигуры, для которых можно посчитать площадь) |
Автор: Pete 23.12.2006, 21:34 |
Не 105, а 10^5. ![]() |
Автор: MaXL 24.12.2006, 10:20 |
Да конечно 10^5 ![]() maxim1000, спасибо, вроде бы ход твоих мыслей понял ![]() |