У меня есть набор точек данных в трехмерном пространстве, которые, по-видимому, все падают на конкретную плоскость. Я использую PCA для вычисления параметров плоскости. Третий компонент PCA дает мне нормальный вектор плоскости (самый слабый компонент).Поверните нормальный вектор на плоскость оси
Что я хочу сделать дальше, это преобразовать все точки в указанную плоскость и посмотреть на нее в 2D.
Моя идея состояла в том, чтобы сделать следующее:
- Найти центральную точку (средняя точка) на плоскости
- вычитаем это из всех точек данных, чтобы расположить их вокруг начала координат
- Поворот нормальный так что она становится (0,0, -1)
- Применить это вращение для всех точек данных
- Использовать ортогональную проекцию (в основном, пропустить ось г)
Теперь я застреваю в поиске правильной операции вращения. Я пробовал работать с acos или atan и создавал две матрицы вращения. Кажется, что оба метода (используя acos, используя atan) дают мне неправильный результат. Возможно, вы можете помочь мне здесь!
Matlab код следующим образом:
b = atan(n(1)/n(2));
rotb = [cos(b) -sin(b) 0; sin(b) cos(b) 0; 0 0 1];
n2 = n * rotb;
a = atan(n(1)/n(3));
rota = [cos(a) 0 sin(a); 0 1 0; -sin(a) 0 cos(a)];
n3 = n2 * rotaows:
Я ожидаю n2
иметь у компонента нуля. Однако это уже не выполняется для вектора (-0,6367, 0,7697, 0,0467).
Почему бы вам просто не проецировать все точки на плоскости, а затем вращать все, чтобы вы могли просто нарисовать точки, используя их координаты xz (или xy)? –
Это или прикрепите камеру непосредственно к плоскости, чтобы она смотрела прямо на нее. –
Идея камеры хорошая. Вы перемещаете камеру из плоскости из источника на некоторое расстояние вдоль нормали. Затем вы указываете камеру в начале координат. Конечно, это предполагает, что у вас есть код проецирования камеры, который можно выполнить с помощью поворотов или векторов. – Nosredna