Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 067

Раздел: Delphi » Прочее
/ вопрос открыт /

Здравствуйте, эксперты!Нет ли у кого исходника пересчёта прямоугольных координат в полярные?

GAZ Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: GAZ (статус: Посетитель)
Вопрос отправлен: 1 ноября 2007, 06:33
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: min@y™

Пусть точки отсчёта "О" декартовой и полярной систем совпадают и луч полярной системы совпадает с абсциссой декартовой системы.

Возьмём точку "А"(x, y). Её координатами в полярной системе будут: длина отрезка d = OA и угол psi между осью ОХ и этим отрезком.

Тогда: x = cos(psi), y = sin(psi), d = sqrt(sqr(x) + sqr(y))

uses Math;
 
type
  TPolarCoord = record
    d:   Extended; // длина отрезка от начала координат до точки
    psi: Extended; // угол между осью ОХ и этим отрезком
  end;
 
// Наша МЕГАФУНКЦИЯ :))
function Dekart2Polar(const x, y: Extended): TPolarCoord;
begin
  Result.psi:= ArcCos(x); // или ArcSin(y)
  Result.d:= sqrt(sqr(x) + sqr(y));
end;

З.Ы. Не брезгуйте ходить на лекции по вышке :))

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 1 ноября 2007, 08:59

Ответ #2. Отвечает эксперт: Вадим К

Здравствуйте, GAZ!
Уважаемый min@y™ наверно сам на лекции высшей математике ходит плохо, ибо это учат по в школе, в курсе геометрии 7-8 класса. :)
Привожу точные формулы
пусть x и y - координаты на декартовой оси. r - длина вектора и a - угол. тогда справедливы следующие соотношения
x = r * cos(a); y = r * sin(a);
или
r = sqrt(x*x+y*y); a = arctan(y/x);
При получении угла есть одна неприятность. дело в том, что если первые две четверти по знаку результата можно определить, а 3 и 4 - нет (почему - попробуйте сами попереводить ручками). и для этого нужно смотреть знаки x и y, которые подскажут правильную четверть. Но можно и проще! есть готовая функция ArcTan2. Она требует двух аргументов x и y и выдает правильный угол в диапазоне 0..2PI. Внимательно посмотрите обявление этой функции, не перепутайте аргументы

function ArcTan2(const Y, X: Extended): Extended;
Также не помешает знать, что все трегонометрические функции дают резальтат и требуют аргументов в радианах. Перевод прост, эти функции есть в модуле Math, но они насколько просты, что привожу тут полностью
function DegToRad(const Degrees: Extended): Extended;  { Radians := Degrees * PI / 180 }
begin
  Result := Degrees * (PI / 180);
end;
 
function RadToDeg(const Radians: Extended): Extended;  { Degrees := Radians * 180 / PI }
begin
  Result := Radians * (180 / PI);
end;
в моделе Math вы найдете также функцию RadToGrad. Это не перевод радиан в градусы! это перевод в грады. 100 град = 90 градусам.(полный круг - 400 градов)

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 1 ноября 2007, 11:21


Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 2 ноября 2007, 18:01; участников в обсуждении: 4.
Dron

Dron (статус: Студент), 1 ноября 2007, 06:53 [#1]:

А в чём, собственно, сложность? Формулы перевода просты.
См. здесь: onAlex/Полярная_система_координат#.D0.9F.D0.B5.D1.80.D0.B5.D0.B2.D0.BE.D0.B4_.D0.BF.D0.BE.D0.BB.D1.8F.D1.80.D0.BD.D1.8B.D1.85_.D0.BA.D0.BE.D0.BE.D1.80.D0.B4.D0.B8.D0.BD.D0.B0.D1.82_.D0.B2_.D0.B4.D0.B5.D0.BA.D0.B0.D1.80.D1.82.D0.BE.D0.B2.D1.8B.D0.B5_.D0.B8_.D0.BE.D0.B1.D1.80.D0.B0.D1.82.D0.BD.D0.BE">Перевод полярных координат в декартовые и обратно
С уважением.
GAZ

GAZ (статус: Посетитель), 1 ноября 2007, 20:23 [#2]:

Уточняю ,мне надо пересчитать координаты(X,Y) плюс высоту(H) в дальность угол места и азимут.
Вадим К

Вадим К (статус: Академик), 2 ноября 2007, 00:30 [#3]:

GAZ
Пожалуйста, напишите задачу более детально. непонятно, откуда беруться координаты и в какие именно они переводятся.
Это случайно не геодезическая задача и геометрия на шаре?
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 2 ноября 2007, 08:14 [#4]:

Цитата:

Уважаемый min@y™ наверно сам на лекции высшей математике ходит плохо, ибо это учат по в школе, в курсе геометрии 7-8 класса. :)

2 Вадим К: Не знаю как сейчас, но полярную СК я изучал на 1 курсе универа, а не в школе. Может уже ввели это всё в школьную программу. А универ я закончил в 2001 году, так что не надо на меня наезжать. Из 4 семестров вышки я сдавал только 1-й экзамен, остальные 3 - автоматом. Ни единой лекции я не пропустил.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Dron

Dron (статус: Студент), 2 ноября 2007, 08:23 [#5]:

min@y™: тогда почему Вы в своём ответе привели такие странные формулы? Даже "невооружённым" взглядом видно, что они неправильные.
С уважением.
min@y™

min@y™ (статус: Доктор наук), 2 ноября 2007, 08:32 [#6]:

2 Dron: видать потому, что учился на 1 курсе 11 лет назад. Ошибся, да, x = d * cos(psi), y = d * sin(psi), забыл радиус. Бывает, извините.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
GAZ

GAZ (статус: Посетитель), 2 ноября 2007, 17:54 [#7]:

Вадиму К.
Сама задача давольно таки сложная,не знаю поможете ли Вы мне с ней:
Имеется две следящие станции,координаты обоих заданны(долгота,широта и высота на уровнем моря),имеется объект(координаты его x,y,z заданны относительно первой станции),так вот необходимо расчитать дальность, угол места и азимут относительно другой станции(тут ещё учесть надо и кривизну земли).
Вадим К

Вадим К (статус: Академик), 2 ноября 2007, 18:01 [#8]:

to min@y™ :
Такие формулы успешные студенты не забывают.
to GAZ :
Ну если станции недалеко, то кривизной можно принебречь. Но я не учил этот раздел геометрии, я не математик, а инженер.
Почитайте начиная с http://ru.wikipedia.org/wiki/Сферическая_система_координат
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:26
Выполнено за 0.03 сек.