用Python实现三角形旋转

用Python实现三角形旋转,python,3d,rotation,Python,3d,Rotation,我有3点:A,B,C在三维空间中。AC=长度为BC。它们表示一个称为T的三角形对象。每个点都是表示其坐标的浮点元组。 T已放置,例如A的中点和B已位于轴原点 在我的API中,我可以全局旋转T,即每次相对于任何一个全局轴旋转。 此API的伪代码如下所示: T.旋转('x',角度)用于使用右手尺围绕全局x角度值轴旋转T 我的问题是让代码旋转T,例如: A和B位于x轴上 C位于y轴上 我想我需要连续调用3次,以便围绕每个轴旋转。但我很难通过初始点坐标计算角度。编辑以包括角度计算。 因为在你的问题中

我有3点:
A,B,C
在三维空间中。AC=长度为BC。它们表示一个称为
T
的三角形对象。每个点都是表示其坐标的浮点元组。
T
已放置,例如
A
的中点和
B
已位于轴原点

在我的API中,我可以全局旋转
T
,即每次相对于任何一个全局轴旋转。 此API的伪代码如下所示:

T.旋转('x',角度)
用于使用右手尺围绕全局
x
角度值轴旋转
T

我的问题是让代码旋转
T
,例如:

  • A
    B
    位于
    x
    轴上
  • C
    位于
    y
    轴上

我想我需要连续调用3次,以便围绕每个轴旋转。但我很难通过初始点坐标计算角度。

编辑以包括角度计算。

因为在你的问题中没有提供任何真实的代码,所以我只提供一个算法和角度。如果你用代码改进你的问题,我可以添加一些我自己的代码

为了澄清,我们必须使长度
AC
等于长度
BC
,并且侧面
AB
的中点必须是原点。后者意味着点
A
B
的坐标彼此为负。(实际上,真正的要求是向量
OC
,其中
O
是原点,垂直于向量
AB
,原点在直线
AB
。你的条件比这更严格。)

假设在任何点上,
A
的坐标是
(Ax,Ay,Az)
,同样地,
B
C

首先,将点
A
移动到xy平面。通过绕x轴旋转所有三个点来执行此操作。由于这些条件,点
B
也将位于xy平面内。一个可能的旋转角度是atan2(Az,Ay),尽管其他角度也是可能的。检查
Az
Bz
的结果值是否为零或接近其浮点精度

第二,绕z轴旋转,将点
a
移动到x轴(并适当移动其他点)。点
B
现在也将位于x轴上。此操作的一个旋转角度为
-atan2(Ay,Ax)
。检查生成的
Ay
By

第三个也是最后一个,绕x轴旋转以将点C移动到y轴。点
A
B
将不受上次旋转的影响。此操作的一个旋转角度为
-atan2(Cz,Cy)
。检查产生的
Cx
(在最后一次旋转之前应为零)和
Cz


您的三角形现在位于所需位置,前提是您的原始三角形实际满足条件。请注意,此算法没有使用任何围绕y轴的旋转:这是不需要的,但如果需要,您可以将我最初围绕x轴的旋转替换为围绕y轴的旋转。

请提供更多详细信息,例如示例输入和所需输出。此外,“A和B的中点”和“轴原点”是什么意思?(中位数不是一个点:你是说中点吗?那个中点保证在原点吗?)你怎么知道可以做你想做的事?(在我看来,如果对T没有更多的操作或限制,通常是不可能的。对于后者,原点必须是从C点到AB侧高度的英尺。)最后,到目前为止,您在这方面做了哪些工作,您尝试了哪些代码?对不起,我的意思是中点。对于轴原点,我指的是轴的中心,(0,0,0)AB中点肯定在(0,0,0)中,如果你指的是中点,那么你要问的是,只有当边长AC等于边长BC,也就是说,AB是等腰三角形的底面。只有当原点是从C到AB高度的英尺时,它才能围绕主轴旋转——也就是说,只有当从A到B的矢量垂直于从原点到C的矢量时,它才能工作。这是真的,因为所有旋转都会使原点保持在原位,在所需的末端,我所陈述的情况将是真的。如果你改变条件,我可以给你一个答案,但现在不可能有答案。是的,长度AC=BC。哇,这是你问题中应该包含的关键信息——请编辑你的问题并添加它。另外,API中的旋转方向是什么。它遵循右手法则吗?(也就是说,如果你的右手拇指指向正轴方向,你的手指卷曲,你的手指指向旋转的方向。)我已经详细阐述了这样一个解决方案。我看到你使用了3个旋转,分别是alpha,beta,gamma角度。考虑到我们可能会使用标准的数学函数,如cos、sin、tan、acos、asin、atan,以及点之间的距离函数等,我想知道如何从A、B、C坐标计算出alpha、beta和gamma,然后应用它们。@user1941583:我已经包括了角度。仅需要
atan2
atan
和坐标。我更喜欢atan2,因为这样可以避免可能的异常。您的解决方案优雅而简单。不幸的是,这是渐进的。也就是说,据我所知,每一步我都必须重新找到新的坐标。@user1941583:是的。你的“我需要连续打3个电话”似乎暗示了这一点。它可能只从原始坐标开始工作,但这将重复大部分旋转代码,违反了规则。“增量”有问题吗?不是哲学问题。我推导出了操纵点网格的公式。精确坐标只是网格子弧的质心,在某些过滤器下从整体中提取。所以我试着最小化