我有3D点A,B,C,D和E.这些点不共面或共线.我可以得到另一个坐标系中的点A '和B',保持原始AB距离.仅凭这些信息,我可以得到点C ',D'和E ',它们具有A'C',A'D '等距离,Angular 和关系,就像原始AC,AD等?

我试过各种方法try 旋转矩阵,但没有工作.我试图找到一个旋转矩阵,将A映射到A ',B映射到B',并利用它得到C ',D'和E ',但它没有工作. 最接近的是:

C_prime = A_prime + (C - A)
D_prime = A_prime + (D - A)
E_prime = A_prime + (E - A)

(A_PRIME、A、C、D和E是3D坐标的数字数组). 这给了我C‘,D’和E‘,它们是到A’的正确距离,但不是B‘.使用B和B_PRIME而不是A和A_PRIME会产生相反的结果.我如何结合这两个约束呢? 我用的是Python 和麻木.

推荐答案

一种可能的图像来自C_prime = A_prime + R(C - A)等,其中R是需要ABA_prime B_prime的旋转矩阵,C是任何其他点.旋转矩阵(通常)可以从这两个向量之间的夹角和它们的叉积形成的轴中找到.除非它们是共线的,因此叉积是0.

请注意,此变换不是唯一的,因为您可以随后应用您喜欢的大约A_prime B_prime的任何旋转,并且仍然保持距离和相对Angular .

您还必须强制要求AB具有与A_prime B_prime相同的长度.

在下面的代码中,点是数组pts[,]的行.我为糟糕的3-d剧情道歉:这不是我的强项.

import math
import numpy as np
import matplotlib.pyplot as plt


def rotationMatrix( a, theta ):        # rotation matrix for active rotation, angle theta about axis a
    R = np.zeros( ( 3, 3 ) )
    n = a / np.linalg.norm( a )
    C = math.cos( theta )
    S = math.sin( theta )

    R[0,0] = C + n[0] * n[0] * ( 1.0 - C )
    R[0,1] =     n[0] * n[1] * ( 1.0 - C ) - n[2] * S
    R[0,2] =     n[0] * n[2] * ( 1.0 - C ) + n[1] * S
    R[1,1] = C + n[1] * n[1] * ( 1.0 - C )
    R[1,2] =     n[1] * n[2] * ( 1.0 - C ) - n[0] * S
    R[1,0] =     n[1] * n[0] * ( 1.0 - C ) + n[2] * S
    R[2,2] = C + n[2] * n[2] * ( 1.0 - C )
    R[2,0] =     n[2] * n[0] * ( 1.0 - C ) - n[1] * S
    R[2,1] =     n[2] * n[1] * ( 1.0 - C ) + n[0] * S

    return R


pts = np.array( [ [0,0,0], [1,0,0], [1,1,0], [0.5,1.5,0.5], [0,1,0] ], dtype=float )

A = pts[0,:]
B = pts[1,:]
Aprime = np.array( [2,2,0] )
Bprime = np.array( [2,2,-1] )
# Ensure that A'B' has the same length as AB
length = np.linalg.norm( B - A )
Bprime = Aprime + length * ( Bprime - Aprime ) / np.linalg.norm( Bprime - Aprime )

# Rotation matrix
rotate = rotationMatrix( np.cross( B - A, Bprime - Aprime ), math.acos( np.dot( Bprime - Aprime, B - A ) / length ** 2 ) )

# Transform points
ptsprime = np.zeros_like( pts )
for i in range( len( pts[:,0] ) ): ptsprime[i,:] = Aprime + rotate @ ( pts[i,:] - A ).T

# Draw it
ax = plt.figure().add_subplot( projection='3d' )
ax.plot( pts[:,0], pts[:,1], pts[:,2], color='r' )
ax.plot( ptsprime[:,0], ptsprime[:,1], ptsprime[:,2], color='b' )
ax.set_aspect( 'equal' )
plt.show()

Output: enter image description here

Python相关问答推荐

使用plotnine和Python构建地块

在Pandas DataFrame操作中用链接替换'方法的更有效方法

Python库:可选地支持numpy类型,而不依赖于numpy

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

将pandas Dataframe转换为3D numpy矩阵

Pre—Commit MyPy无法禁用非错误消息

递归访问嵌套字典中的元素值

driver. find_element无法通过class_name找到元素'""

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

Pandas GroupBy可以分成两个盒子吗?

如何指定列数据类型

如何禁用FastAPI应用程序的Swagger UI autodoc中的application/json?

为什么if2/if3会提供两种不同的输出?

基于另一列的GROUP-BY聚合将列添加到Polars LazyFrame

当HTTP 201响应包含 Big Data 的POST请求时,应该是什么?  

为罕见情况下的回退None值键入

如何从数据框列中提取特定部分并将该值填充到其他列中?

来自任务调度程序的作为系统的Python文件

有没有一种方法可以根据不同索引集的数组从2D数组的对称子矩阵高效地构造3D数组?

基于2级列表的Pandas 切片3级多索引