Функция для преобразования 3d-точек в новую систему координат с NumPy - PullRequest
0 голосов
/ 24 марта 2019

У меня n точек в пространстве: points.shape == (n,3)

У меня есть новая система координат, определяемая точкой O = [ox, oy, oz] и 3 ортогональными векторами различной длины: Ox = [oxx, oxy, oxz], Oy = [oyx, oyy, oyz], Oz = [ozx, ozy, ozz].

Как мне написать такую ​​функцию?

def change_coord_system(points, O, Ox, Oy, Oz)
    return # points in new coordinate system

Ответы [ 2 ]

2 голосов
/ 25 марта 2019

У вас есть 4 некомпланарных точки в исходной системе (где lx - длина первого вектора и т. Д.):

(0,0,0), (lx,0,0), (0,ly,0), (0,0,lz)

и их двойники в новой системе

 [ox, oy, oz]
 [oxx + ox, oxy + oy, oxz + oz]
 [oyx + ox, oyy + oy, oyz + oz]
 [ozx + ox, ozy + oy, ozz + oz]

Матрица аффинного преобразования A должна преобразовать начальные точки в их пары точек

   A * P = P' 

сделать матрицу с векторами столбцов точек:

      |x1  x2  x3  x4|    |x1' x2' x3' x4'|
   A *|y1  y2  y3  y4| =  |y1' y2' y3' y4'|  
      |z1  z2  z3  z4|    |z1' z2' z3' z4'|
      |1   1   1    1|    |1   1    1    1|

      |0  lx  0  0|    |ox oxx + ox . .|
   A *|0  0  ly  0| =  |oy oxy + oy . .| // lazy to make last columns  
      |0  0  0  lz|    |oz oxz + oz . .|
      |1  1  1   1|    |1   1    1    1|

Для вычисления A необходимо умножить обаsudes by reverse P matrix

A * P * P-1 = P' * Pinverse
A * E = P' * Pinverse
A = P' * Pinverse

Итак, вычислите обратную матрицу для P и умножьте ее на правую матрицу.

Редактировать: обратная матрица, вычисленная Maple, равна

 [[-1/lx, -1/ly, -1/lz, 1], 
  [1/lx, 0, 0, 0], 
  [0, 1/ly, 0, 0], 
  [0, 0, 1/lz, 0]]

И результирующая матрица аффинного преобразования имеет вид

[[-ox/lx+(oxx+ox)/lx, -ox/ly+(oyx+ox)/ly, -ox/lz+(ozx+ox)/lz, ox],
 [-oy/lx+(oxy+oy)/lx, -oy/ly+(oyy+oy)/ly, -oy/lz+(ozy+oy)/lz, oy], 
 [-oz/lx+(oxz+oz)/lx, -oz/ly+(oyz+oz)/ly, -oz/lz+(ozz+oz)/lz, oz], 
 [0, 0, 0, 1]]

Просмотр листа клена для справки

Редактировать:
Только что заметили:Maple не удаляет излишние слагаемые, поэтому результат должен быть проще:

[[(oxx)/lx, (oyx)/ly, (ozx)/lz, ox],
 [(oxy)/lx, (oyy)/ly, (ozy)/lz, oy], 
 [(oxz)/lx, (oyz)/ly, (ozz)/lz, oz], 
 [0, 0, 0, 1]]
1 голос
/ 25 марта 2019

Предположим, что у нас есть две точки, P=[2, 4, 5] и Q=[7, 2, 5].Сначала нужно найти матрицу для преобразования вращения A и матрицу B для транспорта и применить приведенное ниже уравнение

enter image description here

Код с использованием numpy:

import numpy as np
# points P and Q
points = np.array([[2,4,5], [7,2,5]])

# suppose that the matrices are
rotation_matrix = np.matrix('1 2 1; 1 2 1; 1 2 1')
b = np.array([1, 1, 1])

def transformation(points, rotation_matrix, b):
    for n in range(points.shape[0]):
    points[n,0] = rotation_matrix[0,0] * points[n, 0] + rotation_matrix[0,1] * points[n, 1] + rotation_matrix[0,2] * points[n, 2] + b[0]
    points[n,1] = rotation_matrix[1,0] * points[n, 0] + rotation_matrix[1,1] * points[n, 1] + rotation_matrix[1,2] * points[n, 2] + b[1]
    points[n,2] = rotation_matrix[2,0] * points[n, 0] + rotation_matrix[2,1] * points[n, 1] + rotation_matrix[2,2] * points[n, 2] + b[2]


Output:  array([[16, 30, 82],
                [17, 27, 77]])

Я думаю, что вышеуказанная функция дает новые очки.Вы можете проверить это.Конечно, вы можете выполнять матричное умножение с помощью numpy, хотя вам необходимо изменить форму np.arrays.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...