![]() |
Модераторы: Poseidon |
![]() ![]() ![]() |
|
Pale_Master |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 22.2.2007 Репутация: нет Всего: нет |
Заданы две фигуры на плоскости.
Круг (именно круг, а не окружность) координатами центра и радиусом + прямоугольник - координатами левого верхнего угла и шириной+высотой (под прямоугольником имеется ввиду множество точек, а не 4 прямых). Нужно определить факт существования общих точек у этих фигур. Буду рад увидить математический алгоритм решения этой задачи. Заранее благодарен. |
|||
|
||||
Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
Ну начнем с того, что для плоскости не важно круг это или окружность и про прямоугольтик тоже самое. А решается она например так
- выбираем сторону четырехугольника. находим точки пересечения линии, которой она пренадлежит и окружности. - если такие есть - проверяем попадают они на сторону или нет( смотрим диапазон по каждой координате). - и так для каждой стороны. |
|||
|
||||
KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: нет Всего: 38 |
Чисто математически:
Решаем систему уравнений: 1: (x-a)^2 + (y-b)^2 <= r^2 2: s1<= x <=s3 3: s2<= y <=s4 Здесь1 - уравнение круга(или неравенство) причем a - расстояние от центра по х, b - расстояние от центра по у, r - радиус круга. 2 и 3 - множество точек которые являются прямоугольником(+ то что внутри него) со сторонами s1, s2, s3,s4 Из этой системы можно найти все точки пересечения круга и заполненного прямоугольника Но как сказал Sartorius
Это сообщение отредактировал(а) KelTron - 22.2.2007, 17:38 -------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
Pale_Master |
|
||||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 22.2.2007 Репутация: нет Всего: нет |
1.
Ну как это неважно? Ведь если фигуры будут вписаны друг в друга, то если говорить про линии, а не множества точек, то это не будет считаться пересечением. 2.
Это понятно. А вот решить, да ещё и так, чтобы выполнялось быстро.. вот с этим проблема.. |
||||
|
|||||
KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: нет Всего: 38 |
Ты прав -------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: нет Всего: 38 |
Вот что взбрело мне в голову:
Если провести через окружность вертикальный диаметр и горизонтальный, то получим 4 точки пересечения - левая, правая, верхняя, нижняя. для левой xLeft = a - r, для правой xRight = a + r, для нижней yBottom = b - r, для верхней yTop = b + r. Пусть rectLeft, rectRight - координаты х для левой и праваой сторон прямоугольника, а reftTop, rectBottom - координаты у для верхней и нижней сторон прямоугольника. Тогда проверяем условие: если ((xLeft < rectLeft) и (xRight < rectLeft)) или ((xLeft > rectRight) и (xRight > rectRight)) или((yTop > rectTop) и (yBotton > rectTop)) или ((yTop < rectBottom) и (yBottom < rectBottom)) то значит фигуры не имеют общих точек, иначе - фигуры имеют общие точки. -------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
KelTron, а почему ты думаешь, что стороны прямоугольника параллельны осям координат ? да и для такого случая такая система неравенств не годиться. ( нарисовать тут пример не могу)
Pale_Master,
Да этот случай пропустил(( Мне кажется, что врядли найдется что то лучше обычной системы неравенств Y <=(>=) kx + b( для каждой из сторон прямоугольника задаем) (X-X0)^2 + (Y-Y0)^2 <= R^2 - окружность если у нее есть решение - то есть общие точки |
|||
|
||||
KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: нет Всего: 38 |
Даже если это не так, то можно повернуть окружность вместе с прямоугольником относительно центра координат так, что стороны станут параллельны и решение не изменится. я придумал этот алгоритм 5 минут назад, хотелось бы всё - таки увидеть пример, а то сам что то не могу представить (голова уже слабо варит - спать надо) -------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
посмотри. Если я обозначения правильно понял, то ты написал условия непересечения двух прямоугольных областей с параллельными сторонами
Это сообщение отредактировал(а) Sartorius - 22.2.2007, 19:32 Присоединённый файл ( Кол-во скачиваний: 10 ) ![]() |
|||
|
||||
Pale_Master |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 22.2.2007 Репутация: нет Всего: нет |
И всё же, как вот это:
превратить в код ? |
|||
|
||||
Rockie |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 13 Всего: 31 |
Если расстояние от одной из вершин прямоугольника до центра окружности меньше радиуса - есть общие точки.
Если центр окружности лежит внутри прямоугольника: есть общие точки. Есть функция определения принадлежности точки к полигону, с кодом, в том числе на Си Point in polygon -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
неверно. Представь , что окружность касается одной из сторон... Расстояние до всех вершин больше радиуса, а общие точки есть. |
|||
|
||||
Rockie |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 13 Всего: 31 |
вообще-то верно, но не единственно верно. =) Да, я сам до этого уже додумал. Тогда нахождением пересечения. Пересечение отрезка и круга(окружности) -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
Pale_Master |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 22.2.2007 Репутация: нет Всего: нет |
Если вдруг кому интересно, то ниже функция определяющая пересечение окружности с ориентированным прямоугольником.
Но все жё жутко интересно, как вот это:
превратить в код.. ![]()
|
||||||
|
|||||||
MBo |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 234 Регистрация: 10.6.2002 Репутация: 7 Всего: 18 |
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Центр помощи" | |
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Центр помощи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |