Вычислить 3d вектор перпендикулярно плоскости, описанной точкой и истинным северным курсом - PullRequest
4 голосов
/ 02 апреля 2009

У меня есть Точка на поверхности Земли, которую я преобразовываю в Вектор из Центра Земли.

У меня Истинный Северный курс в градусах, описывающий путь, по которому точка будет перемещаться по поверхности Земли.

Мне нужно вычислить Вектор, который перпендикулярен плоскости, созданной путем прохождения этой точки вдоль поверхности земли.

Я попытался вычислить произвольную точку вдоль пути, используя метод, описанный здесь и затем взять перекрестное произведение двух векторов, однако оно не кажется достаточно точным и кажется более затратным, чем необходимо.

Это связано с моим другим постом луч-полигон-точка-пересечение-точка-на-поверхности-сферы .

Ответы [ 3 ]

4 голосов
/ 02 апреля 2009

Я предполагаю, что вы пытаетесь вычислить вектор , лежащий в плоскости пути, а не перпендикулярно ему (поскольку у вас уже есть один, а именно вектор от начала координат до вашего точка).

Сначала вам нужно вычислить векторы, лежащие в этой плоскости, которые указывают на север и на восток. Для этого назовем P вашу точку, O точку отсчета, а N = (0, 0, R) - точку в верхней части вашей сферы. Тогда

e = cross(N - P, P - O)

- это вектор, который указывает на восток и касается сферы, потому что он перпендикулярен P - O, радиусу сферы.

По аналогичным причинам

n = cross(e, P - O)

будет указывать прямо на север и будет касаться сферы.

Теперь нормализуйте n и e, и вы получите ортонормированный базис для касательного пространства в вашей точке. Чтобы найти вектор в направлении theta (скажем, против часовой стрелки от положительной восточной оси, чтобы упростить математику), просто возьмите немного e и немного n:

v = cos(theta) * e + sin(theta) * n
0 голосов
/ 02 апреля 2009

У вас уже есть 2 вектора:

N = (0,0,1) точек прямо от начала координат.

P = (a, b, c) указывает от начала координат до вашей точки.

Рассчитайте единичный вектор до вашей точки U = P / | P |

Рассчитать единичный вектор перпендикулярно U и N E = U X N

Рассчитать единичный вектор, перпендикулярный U и E (это будет касаться сферы) T = U X E Т может указывать либо на север, либо на юг, поэтому если T.z <0, умножить T на -1. </p>

T теперь указывает на север и параллельна плоскости, касательной к сфере в точке P.

Теперь у вас достаточно информации для построения матрицы вращения (R), чтобы вы могли вращать T вокруг U. Вы можете найти, как создать матрицу для вращения вокруг любой оси в wikipedia :

Используя R, вы можете вычислить вектор, указывающий направление движения.

A = RT

A - это ответ, который вы ищете.

0 голосов
/ 02 апреля 2009

Вот мое понимание вашей проблемы:

  • У вас есть точка на поверхности Земли, указанная в виде координат широты / долготы
  • Направление «истинный север» - это направление, в котором человек в этой точке будет двигаться, чтобы достичь (географического) Северного полюса по максимально прямому маршруту. То есть «вектор истинного севера» касается поверхности Земли в выбранной вами точке и указывает прямо на север, параллельно линии долготы.
  • Направление движения точки будет (первоначально) касательным к поверхности Земли в выбранной вами точке.
  • У вас есть угол в градусах от истинного севера, который указывает курс, по которому будет двигаться эта точка.
  • Этот угол является углом между «вектором истинного севера» и направлением движения точки.
  • Вы хотите вычислить вектор, касательный к поверхности Земли в этой точке, но перпендикулярный направлению движения точки.

Если я все правильно понял, вы можете сделать это следующим образом:

  1. «Вектор истинного севера» на широте lat, долгота lng задается как

    [-sin(lat) * cos(lng), -sin(lat) * sin(lng), cos(lat)]
  2. Вектор, перпендикулярный «вектору истинного севера», который указывает вдоль линии широты (на восток), задается как

    [-sin(lng), cos(lng), 0]
  3. Поскольку эти два вектора идентифицируют плоскость, касательную к поверхности Земли, и вектор, указывающий направление движения вашей точки, также находится в этой плоскости, ваш вектор движения является линейной комбинацией двух предыдущих:

    [
    -(sin(lat) * cos(lng) * cos(th) + sin(lng) * sin(th))
    -(sin(lat) * sin(lng) * cos(th) - cos(lng) * sin(th))
    cos(lat) * cos(th)
    ]
    где th - ваш угол курса.
  4. Чтобы найти вектор, перпендикулярный этому вектору движения, вы можете просто взять перекрестное произведение вектора радиуса (то есть вектора, указывающего из центра Земли в вашу точку,

    [cos(lat) * cos(lng), cos(lat) * sin(lng), sin(lat)]
    с движением вектор. (Эта математика будет грязной, лучше всего, чтобы компьютер справился с ней)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...