我在3D空间中有一个起点(x,y,z),它对应于一个圆的中心,在终点(x2,y2,z2)中,对应于球的表面。我在球体表面上还有许多其他端点(例如x3,y3,z3),每个端点具有相同的半径长度(rr)。
我想计算从中心点(起点)到终点以及所有其他终点的运动角度。最终,假设有100个球体,我想看看端点是否都从中心以相似的方向性/角度移动。鉴于此目的,我需要使用0和360的方向来“看起来相似”,因此我认为我需要使用某种类型的特定平面。
这篇文章(https://math.stackexchange.com/questions/707673/find-angle-in-degrees-from-one-point-to-another-in-2d-space)末尾的评论使用atan2函数具有很好的图形和答案,但这仅适用于2D空间。
这篇文章(Signed angle between two 3D vectors with same origin within the same plane)和这篇Angle between 3 points in 3d space使我开始学习。
这个(The X angle between two 3D vectors?)也很有用,但根据水平系统计算出错误的角度类型(我认为)。
给出所有这些,这就是到目前为止我要提出的内容。这里有几点:
a = c(-0.0684486861, 0.0125857380, 0.0201056441) #start/center of sphere
b = c(-0.0650557851, 0.0175286346, -0.0228805516) #end point
v1 = c( (a[1] - b[1]), (a[2] - b[2]), (a[3] - b[3]) ) #vector
那么我想我需要计算v1和从两个点成90度平行于平面的向量之间的点积?然后在角度之间取余弦?但是,如果半径始终保持不变不是那么容易吗?
我对算术还不够了解,甚至连两点都没有,要为我所有的领域/点做这些的开发代码也少得多。 指导表示赞赏。
答案 0 :(得分:0)
术语“角度”不适用于两个3D点之间的方向。
点差 D 是矢量。它由三个分量(x,y,z)表征。
您可以将此向量制作单位归一化 d ,并将此方向表示为direction cosines,其中d.x = cos(angle between d and OX)
,依此类推。
3D方向也可能在spherical coordinate system中表示为方向与OZ轴之间的夹角theta
,以及方向在OXY平面和OX轴上的投影之间的夹角phi
。
但是对于方向比较,没有唯一的通用方法。您需要根据自己的特定目的定义一些指标。例如,归一化向量的标量积(方向之间的余弦值)
如果半径为rr
,球体中心为C=(xc,yc,yc)
,球体P=(x1,y1,y1)
和P2=(x2,y2,y2)
上有两个点,则从中心到这些点的方向之间的角度就是向量之间的角度:
V1 = P1 - C
V2 = P2 - C
是(使用点积和反余弦)
angle = acos( ((x1-cx)*(x2-cx) + (y1-cy)*(y2-cy) + (z1-cz)*(z2-cz)) / (rr*rr) )