使用 numpy 将 3d 点转换为新坐标系的函数 [英] Function to transform 3d points to a new coordinate system with numpy

查看:35
本文介绍了使用 numpy 将 3d 点转换为新坐标系的函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在空间中有 n 个点:points.shape == (n,3)

I have n points in space: points.shape == (n,3)

我有一个由点O = [ox, oy, oz]和3个不同长度的正交向量定义的新坐标系:Ox = [oxx, oxy, oxz],Oy = [oyx, oyy, oyz], Oz = [ozx, ozy, ozz].

I have a new coordinate system defined by a point O = [ox, oy, oz] and 3 orthogonal vectors of different lengths: Ox = [oxx, oxy, oxz], Oy = [oyx, oyy, oyz], Oz = [ozx, ozy, ozz].

我怎样才能写出这样的函数?

How can I write a function like that?

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

推荐答案

您在原始系统中有 4 个非共面点(其中 lx 是第一个向量的长度,依此类推):

You have 4 non-coplanar points in original system (where lx is length of the first vector and so on):

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

和他们在新系统中的双胞胎

and their twins in new system

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

仿射变换矩阵 A 应该将初始点变换成它们的对点

Affine transformation matrix A should transform initial points into their pair points

   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,需要将两个 sude 乘以 P 矩阵的逆

To calculate A, it is needed to multiply both sudes by inverse of P matrix

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

因此计算 P 的逆矩阵并将其与右侧矩阵相乘.

So calculate inverse matrix for P and multiply it with right-side matrix.

Maple 计算的逆矩阵是

inverse matrix calculated by Maple is

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

由此产生的仿射变换矩阵为

And resulting affine transformation matrix is

[[-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 没有去除过多的被加数,所以结果应该更简单:


Just have noticed: Maple did not remove excessive summands, so result should be simpler:

[[(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]]

这篇关于使用 numpy 将 3d 点转换为新坐标系的函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆