直接上代码
import numpy as np
#结构式旋转的函数。只需要四个参数即可。这几个参数的意义:
#p1: 固定不动的那个点。p1不要求是坐标原点,可以是任意坐标。
#p2: 要移动的那个点。
#p3: 移动的目标点。这个点与p2移动之后的点不一定是重合的,但p1, p2'(p2移动后的点), p3一定是在同一直线上的
#listPoint: 要旋转的结构式
#具体原理:根据p1, p2, p3,计算出旋转矩阵。有了旋转矩阵之后,旋转公式与每一个点都点乘,即可得到旋转之后的坐标,
#对于整个结构式而言,得到的是旋转之后的结构式,且每个点的相对位置保持不变,且移动到所希望的位置。
@staticmethod
def structureRoate_fixOnePoint(p1, p2, p3, listPoint):
#计算旋转矩阵
rotationMatrix = Move_and_Rotation.calculationRoationMatrixByThreePoints(p1, p2, p3)
listPoint2 = []
for point in listPoint:
#起始位置。注意,- p1.x, - p1.y和- p1.z的目的是让p1点变成坐标原点,计算完之后再加上这些数据即可。
#如果p1不是坐标原点,计算结果是错误的
resourceMatrix = np.array([point.x - p1.x, point.y - p1.y, point.z - p1.z]).T
#利用旋转矩阵对原始坐标进行旋转
targetMatrix = np.dot(rotationMatrix, resourceMatrix)
#point旋转之后得到point2,其坐标如下。记得要加上p1的坐标
point2 = Point(targetMatrix[0] + p1.x, targetMatrix[1] + p1.y, targetMatrix[2] + p1.z)
listPoint2.append(point2)
return listPoint2
#矩阵的叉乘。这里其实是向量的叉乘
@staticmethod
def crossProduct(a, b):
c = []
c.append(a[1] * b[2]