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

У меня есть куча точек, лежащих на вертикальной плоскости. На самом деле это самолет
должно быть точно вертикально. Но когда я визуализирую облако точек, возникает
небольшой наклон (почти 2 градуса) от вертикальности. На данный момент могу подсчитать
это только склонность. Что касается других ошибок, я предполагаю, что нет
сдвиги или что-то в этом роде.

Итак, я хочу обновить координаты моих точечных данных, чтобы они лежали на вертикальной плоскости. Я думаю, я должен сделать какую-то трансформацию. Это может быть только посредством вращения вдоль оси X. Не уверен, что это будет.

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

Примечание: Поскольку я реализую это на c ++, и есть много программистов, которые хорошо разбираются в этих вещах, я публикую этот вопрос на c ++.

ОБНОВЛЕНИЕ

Если я скажу точно, что я сделал до сих пор;
У меня есть данные облака точек, представляющие вертикальный объект + окружающие его вещи. (Данные собираются движущимся сканером и могут иметь отклонения осей от правильных мировых осей). Проблема в том, что я не могу точно сказать, есть ли ошибка в моих данных или нет. Поэтому я проверил это с помощью вертикального плоского объекта (который также является доминирующим объектом в моих данных). На самом деле эта плоскость действительно вертикальная. Но когда я подгоняю плоскость, удаляя выбросы, тогда эта плоскость не является действительно вертикальной и имеет наклон почти на 2 градуса. Поэтому я подозреваю, что в моих данных есть какая-то ошибка. Поэтому я хочу обновить все мои облака точек (включая точки на плоскости и точки, представляющие другие объекты) таким образом, чтобы эти конкретные плоские точки были расположены точно на вертикальной плоскости. Тогда, я думаю, все точки будут обновлены на правильные позиции, как в реальности. То есть все (x, y, z) координаты должны быть обновлены.

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

слева — исходное облако точек (как вы можете видеть, сами точки не являются вертикальными), а задняя линия указывает вертикальную плоскость, которую я установил, а красная — линия зенита. как видите, есть наклон вертикальной плоскости.
Итак, я хочу обновить все мои данные на правильном рисунке. затем, после обновления, если я снова подгоняю плоскость (удаляя выбросы), то она точно параллельна зенитной линии. Помогите мне, пожалуйста.

0

Решение

Я прочитал ваш вопрос еще раз, и, надеюсь, этот ответ поможет вам. Если есть что-то еще, что мне нужно знать, пожалуйста, скажите мне.

Теперь, чтобы вращать что-либо, должна быть центральная точка, чтобы вращаться вокруг. Теперь вы уже можете определить угол наклона, поэтому теперь нам нужна формула для поворота точки на определенный угол вокруг начала координат. Кроме того, поскольку эта проблема возникает только на 2D-плоскости, мы можем использовать эту базовую формулу для перенастройки точек. Для любых двух осей x и y:

Тета — это угол, на который вы будете вращаться в направлении против часовой стрелки. х и у ваши новые очки. x.origin и y.origin — это координаты точки, которую вы собираетесь обойти. Теперь я не знаю, является ли моя математика правильной на 100%, но если это не так, надеюсь, вы можете изменить одну или две вещи, и это сработает.

0

Другие решения

Я могу помочь вам, учитывая, что я недавно работал с самолетами. Прежде всего, почему точки не являются компланарными с самого начала? Во-первых, я бы сделал точки копланарными, вместо того, чтобы они находились под наклоном (из какого источника?), А затем пришлось бы их исправлять. Кроме того, наличие точек, находящихся в одной плоскости, повышает эффективность.

Извините, если это ответ, который вы не ищете, но мне нужно больше информации, прежде чем я могу помочь вам. Кроме того, 3D математика это сложно. Если вы работаете с ним достаточно, он начинает биться в вашу голову, где вы НИКОГДА не забудете этого, особенно если вы прошли через головные боли, через которые мне пришлось пройти.

1

Я немного подумал над этим, и, поскольку вы хотите вращаться вдоль оси x, ваше вращение будет выполняться на плоскости xz, что означает, что мы можем сделать это 2D-проблемой. После небольшого исследования Википедии, это может быть вашим решением.

new z = ((x - intended x) * sin(angle)) + (z * cos(angle)) + intended x

То, что я делаю здесь, это вычитание нашего предполагаемого значения x из нашего текущего значения x, так что мы заставляем (намеревался x, 0) нашу точку начала вращаться вокруг. После того, как точка повернута, я добавляю (намеревался x, 0) обратно к нашей координате, чтобы мы получили правильный результат.

1

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

Ключевое слово поиска «плоскость регрессии» может помочь — есть несколько способов нахождения плоскостей, приближающих облака точек, и несколько способов «привязать» точки к плоскостям.

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

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

  1. Перевод (чтобы добраться до вашей точки отсчета)
  2. вращение
1