![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 19.01.2013
Сообщений: 6
|
![]()
Помогите с алгоритмом.
Дано пересечение окружности (задан радиус и центр окружности в некой точке (x,y)) и прямой (Ax+By+C=0). Нужны идеи по алгоритму данной задачи. Какие идеи? |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 25.04.2010
Сообщений: 881
|
![]()
решить систему уравнений?)
|
![]() |
![]() |
![]() |
#3 |
Регистрация: 19.01.2013
Сообщений: 6
|
![]()
Я пыталась с помощью перенесения центра окружности в центр координат (наиболее популярный в google), но там не учитывается первоначальное положение окружности (мозговой штурм у меня плохо удается). Может я этой части тупо не вижу?
Вот алгоритм: Вместо формального решения системы двух уравнений подойдём к задаче с геометрической стороны (причём, за счёт этого мы получим более точное решение с точки зрения численной устойчивости). Предположим, не теряя общности, что центр окружности находится в начале координат (если это не так, то перенесём его туда, исправив соответствующе константу C в уравнении прямой). Т.е. имеем окружность с центром в (0,0) радиуса r и прямую с уравнением Ax + By + C = 0. Сначала найдём ближайшую к центру точку прямой - точку с некоторыми координатами (x0,y0). Во-первых, эта точка должна находиться на таком расстоянии от начала координат: |C|/sqrt(A2+B2) Во-вторых, поскольку вектор (A,B) перпендикулярен прямой, то координаты этой точки должны быть пропорциональны координатам этого вектора. Учитывая, что расстояние от начала координат до искомой точки нам известно, нам нужно просто нормировать вектор (A,B) к этой длине, и мы получаем: x0 = - A* C/ (A2+B2) y0 = - B* C/(A2+B2) (здесь неочевидны только знаки 'минус', но эти формулы легко проверить подстановкой в уравнение прямой - должен получиться ноль) Зная ближайшую к центру окружности точку, мы уже можем определить, сколько точек будет содержать ответ, и даже дать ответ, если этих точек 0 или 1. Действительно, если расстояние от (x0, y0) до начала координат (а его мы уже выразили формулой - см. выше) больше радиуса, то ответ - ноль точек. Если это расстояние равно радиусу, то ответом будет одна точка - (x0,y0). А вот в оставшемся случае точек будет две, и их координаты нам предстоит найти. Итак, мы знаем, что точка (x0, y0) лежит внутри круга. Искомые точки (ax,ay) и (bx,by), помимо того что должны принадлежать прямой, должны лежать на одном и том же расстоянии d от точки (x0, y0), причём это расстояние легко найти: d = sqrt ( r2 - C2/ (A2+B2)) Заметим, что вектор (-B,A) коллинеарен прямой, а потому искомые точки (ax,ay) и (bx,by) можно получить, прибавив к точке (x0,y0) вектор (-B,A), нормированный к длине d (мы получим одну искомую точку), и вычтя этот же вектор (получим вторую искомую точку). Окончательное решение такое: mult = sqrt ( d2/ (A2+B2)) ax = x0 + B mult ay = y0 - A mult bx = x0 - B mult by = y0 + A mult Если бы мы решали эту задачу чисто алгебраически, то скорее всего получили бы решение в другом виде, которое даёт бОльшую погрешность. Поэтому "геометрический" метод, описанный здесь, помимо наглядности, ещё и более точен. Последний раз редактировалось Sofi Kold; 19.01.2013 в 03:13. |
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 25.04.2010
Сообщений: 881
|
![]()
а может попробовать систему уравнений? неужели там все сложно так?
Ошибка) пост не тот) Последний раз редактировалось Stilet; 19.01.2013 в 11:28. |
![]() |
![]() |
![]() |
#5 |
Регистрация: 19.01.2013
Сообщений: 6
|
![]()
Уфф!!! Я совсем затупила. Там же еще можно тупо геометрическими формулами вычислять! Всего-то пару строк кода получится.
Все равно, спасибо! |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Число точек пересечения прямой с окружностью | Night61 | Помощь студентам | 1 | 20.01.2012 16:57 |
Пересечение эллипса с прямой (Delphi) | 0rtega | Помощь студентам | 0 | 13.04.2010 21:45 |
delphi управление окружностью | tanek | Помощь студентам | 10 | 06.03.2010 20:58 |
Пересечение прямой и круга | CoGnaC | Паскаль, Turbo Pascal, PascalABC.NET | 8 | 11.03.2008 17:01 |