如何在 3D 中放置一个点,以便它创建某个角度

How to place a point in 3D so that it creates a certain angle?

本文关键字:创建 一个 3D      更新时间:2023-10-16

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

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

我有两点:

答: 12 4 5乙: 6 8 -10

我还有一点:C: 5 6 7

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

我该怎么做?如果有人可以帮助我使用公式,甚至将上述示例变成一个工作示例,我将不胜感激。

另一种说法:如何变换 C.x、C.y 和 C.z,使角度 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;
}

你使用它:角度( B.x - A.x, B.y - A.y, B.z - A.z, C.x - B.x, C.y - B.y, C.z - B.z );

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

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

c' 将是 c' = A+t*(B-A) + u*(C-A),约束 Normalize(c'-A)

点 Normalize(B-A) == cos (48/180 * pi)。

我首先建议规范化 D=(B-A),然后:

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 中的二阶多项式。

C点的轨迹其实是一个圆锥体,你可以想象,B是顶点,线AB是圆锥体的中心线,意味着3D圆锥体在AB上是对称的。

相关文章: