3

我有一个关于 3D 的小问题。

以下是我的问题的一个例子。

我有两点:

答:12 4 5 B:6 8 -10

我还有一点:C:5 6 7

我需要变换(?)点 C,使角度 ABC 为 48 度。

我该怎么做呢?如果有人可以帮助我使用公式,或者甚至可以将上述示例变为可行的示例,我将不胜感激。

换一种说法:如何变换 Cx、Cy 和 Cz 使角 ABC 为 48 度?

我真的很感激这方面的一些帮助,因为我现在被困住了。

旁注:我已经实现了一种寻找角度的方法:

float Angle( float x1, float y1, float z1,
             float x2, float y2, float z2 )
{
  float x, y, z;
  CrossProduct( x1, y1, z1, x2, y2, z2, &x, &y, &z );

  float result = atan2 ( L2Norm( x, y, z ),
                         DotProduct( x1, y1, z1, x2, y2, z2 ) );

  return result;
}

你使用它:角度(Bx - Ax,By - Ay,Bz - Az,Cx - Bx,Cy - By,Cz - Bz);

4

2 回答 2

2
       A------C    
       |     
 c''   |    c'
       B

由于 3D 中的三个点定义了一个平面,因此在该平面上只有 2 个可能的变换 C-->c' 或 C-->c'' 候选。

c' 将是 c' = A+t*(BA) + u*(CA) 约束 Normalize(c'-A) dot Normalize(BA) == cos (48 / 180 * pi)。

我首先建议标准化 D=(BA),然后:

D dot D+u*(C-A) = 1 * |D+u(C-A)| * cos (48 degrees)

Dx*(Dx+u*(Cx-Ax))+ Dy*(Dy+u*(Cy-Ay))+Dz*(Dz+u*(Cz-Az)) ==
    0.669 * sqrt ((Dx+u*(Cx-Ax))^2+(Dy+u*(Cy-Ay))^2+(Dz+u*(Cz-Az))^2)

其形式为 a+u*b == 0.669*sqrt(c+du+e*u^2),通过两边均方可简化为u中的二次多项式。

于 2013-01-23T05:11:52.860 回答
0

C点的轨迹实际上是一个圆锥体,可以想象,B是顶点,AB线是圆锥体的中心线,也就是说3D圆锥体在AB上是对称的。

于 2013-01-23T04:52:08.100 回答