![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 |
Пользователь
Регистрация: 06.11.2009
Сообщений: 68
|
![]()
Здравствуйте!
Задача заключается в следующем: дано количество точек n, по которым будет строиться ломанная на сфере. Далее пары чисел. Первая пара - точка M (в сферических координатах, углы пси и фи), от которой будет искаться расстояние, далее n пар, соответственно сферические координаты точек, по которым строится ломанная. Моя идея решения. Первым делом, конечно, переводим всё в декартовы координаты. Рассматриваем каждый раз отрезок, заключённый между i-й и (i + 1)-й точками. Строим плоскость, проходящую через начало координат (сфера имеет центр в начале прямоугольной системы координат) и точки A и B, между которыми заключён рассматриваемый отрезок. Далее проверяем, попадает ли проекция точки M на плоскость AOB в круговой сектор (т.е. в область AOB), и в зависимости от результата выполняем одно из следующих действий: 1) Если проекция точки M попадает в область AOB - находим расстояние от точки M до плоскости AOB, а затем, зная радиус сферы (он дан) находим угол между прямыми OM и плоскостью AOB, и, умножив его на радиус сферы, находим длину дуги MK (K - точка, лежащая на отрезке AB, OK соответственно - кратчайшее расстояние от точки до данного отрезка); 2) Если же проекция точки M не попадает в нужную область - ищем дуги MA и MB (проводим прямые OA, OB, OM, ищем углы между OA и OM, OB и OM, умножаем их на радиус - получаем нужные дуги). Выбираем минимальную из них - это и есть расстояние от M до данного отрезка AB. Таким образом просматриваем все отрезки и ищем все расстояния. Затем берём минимальное из них - оно и будет минимальным расстоянием от точки до ломанной на сфере. Как проверяем, попадает ли проекция точки M в область AOB: Ищем координаты точки M' - проекции точки M на плоскость AOB. Проводим прямую OM', ищем точку K её пересечения с отрезком AB, переводим декартовы координаты этой точки в сферические и если хотя бы одна из координат точки K не попадает в промежуток между соответствующими сферическими координатами точек A и B - то точка M' не попадает в область AOB. Если же обе координаты K лежат между соответствующими координатами точек A и B - точка M' попадает в область AOB. Прошу прощения за эти "многабукаф", знаю, что рискую ими отпугнуть большинство потенциальных помошников))), но короче вроде и не объяснишь... Идея решения вроде логичная, и я полагаю, она далеко не нова, но в интернете мне решения найти почему-то не удалось, а искать в бумажных изданиях, честно говоря, лень. Я понимаю, что форум программистский, а не математический, но у меня всё-таки больше проблем возникает с реализацией, чем с математикой. Последний раз редактировалось silent_1991; 06.11.2009 в 19:35. |
![]() |
![]() |
![]() |
#2 |
Пользователь
Регистрация: 06.11.2009
Сообщений: 68
|
![]()
Вот мой вариант реализации на чистом Си:
Код:
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 06.11.2009
Сообщений: 68
|
![]()
Суть в том, что значение вроде бы считается, и вроде оно даже похоже на правду, но, например, если во входных данных я записываю координаты точки M как пару (90, 0) - считается одно значение, а если как пару (90, 45) или (90, 90) (при тех же координатах остальных точек) - другие, хотя при повороте точки по углу пси на 90 градусов поворот по углу фи не должен играть абсолютно никакой роли... Или я ошибаюсь?
Далее, если я запишу пару (88, 0) - посчитается настолько отличное от предыдущего (90, 0) значения, что такого просто быть не может. Я думаю, что напортачил с проверкой попадания точки M' в область AOB, хотя вроде все условия соблюдены, с проверкой, в какой четверти находятся координаты, тоже вроде всё как надо... Кто заинтересовался, пожалуйста, помогите разобраться... Я конечно тоже не буду сиднем сидеть, попробую поискать ошибку, но коллективный разум - он решает... Заранее огромное спасибо за помощь! P.S. Прошу прощения за мультипост, но в 5000 символов, как можно заметить, не впихнуть полное описание... Уж извините меня, не могу я коротко рассказывать))) Последний раз редактировалось silent_1991; 06.11.2009 в 19:43. |
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 06.11.2009
Сообщений: 68
|
![]()
Сегодня понял, что для точки, лежащей на полюсе необходимо дополнительное условие, т.к. её проекция на плоскость OAB совпадает с точкой O, таким образом мы не можем провети прямую, проходящую через 2 точки - O и M', т.к. они совпадают. Пока не придумал, каким должно быть это условие, но тем не менее не понятно, почеми результяты для 89 и 88 градусов ТАК разнятся...
P.S. Прилагаю файл кода с комментариями, может это продвинет дело... |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Поиск минимального маршрута, ошибка в коде | Paul Hindenburg | Общие вопросы C/C++ | 2 | 31.05.2009 19:57 |
Поиск максимального и минимального элемента массива(с существенным дополнением) | Dayterius | Паскаль, Turbo Pascal, PascalABC.NET | 6 | 20.05.2009 11:37 |
Поиск точки (х;у) | Slavik | Microsoft Office Excel | 4 | 01.05.2009 10:48 |
Поиск минимального (максимального) элемента массива | Radamant | Помощь студентам | 10 | 24.12.2008 17:44 |
Заменить в каждой строке воскл. знаки на точки. - язык Pascal | Karinna | Помощь студентам | 12 | 08.05.2008 08:13 |