如何在三维空间中放置一个点,使其产生特定的角度?

3

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

以下是我的问题示例。

我有两个点:

A: 12 4 5 B: 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;
}

你可以这样使用它: Angle(B.x - A.x,B.y - A.y,B.z - A.z, C.x - B.x,C.y - B.y,C.z - B.z);

1
有无限数量的转换可以做到这一点。 - Ignacio Vazquez-Abrams
你如何解决2D的问题? - Arun
你想制作哪个48度的角度? - Ignacio Vazquez-Abrams
你可能需要提供的另一个信息是这个点不应该离开平面。我认为这是情况。否则,正如其他一些人指出的那样,可能会有比你要寻找的答案更多的可能性。 - Ed Marty
由于您正在处理三维数据,因此会有无限数量的结果点位于一个圆锥体上。 - Ignacio Vazquez-Abrams
显示剩余2条评论
2个回答

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

作为三维空间中的三个点可以定义一个平面,因此在该平面上只有两种可能的转换C-->c'或C-->c''。
其中,c'的计算方式为:c' = A+t*(B-A) + u*(C-A),并且需要满足约束条件Normalize(c'-A) dot 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) 的表达式,通过将两边平方可简化为二次多项式。


谢谢您的回答。不过我还没有真正理解这个公式。t和u是什么意思呢?能否请您把我的三个点的例子代入进去,让我看看它的运作方式? - user985611
u和t是未知变量,它们将向量(B-A)和(C-A)缩放以满足点积方程的定义,即t(B-A)点乘u(C-A)==|t(B-A)||u(C-A)|cos(angle),其中||是长度运算符==sqrt(xx+yy+z*z)。您将固定角度并查看您将获得哪些u和t。 - Aki Suihkonen
你指出t == 1。(B-A)点乘u(C-A)== sqrt((B.x-A.x)^2 +(B.y-A.y)^2 +(B.z-A.z)^2)*sqrt(u(C.x-A.x)^2 + u(C.y-A.y)^2 + u(C.z-A.z)^2)如果我使用:A:12 4 5; B:6 8 -10; C:5 6 7然后:(-6,4,-15)点乘u(-7,2,2)= sqrt(36 + 16 + 225)* sqrt(49u + 4u + 4u)(-6,4,-15)点乘u(-7,2,2)= 16.65 * sqrt(u)* 7.55 (-6,4,-15)点乘(-7,2,2)= 125.705 * sqrt(u)在此之后我不确定。 - user985611
ABC之间的角度是固定的,但我的意思是1*(B-A)和c'之间的角度是可以商量的,其中c'=u*(C-A)+(B-A)。 - Aki Suihkonen
还有一件事:这个方程只能解决通过c'的向量的_u_,这意味着您可能希望将c'缩放为与|C-A|相同的长度。 - Aki Suihkonen
显示剩余8条评论

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

我点赞了,但是如果你能找到那个圆锥体的方程,甚至是找到离点C最近的点,这个答案会更完整。 - Stef
我点赞了,但是如果你能找到那个圆锥体的方程,甚至是找到离点C最近的点,这个答案会更完整。 - undefined
还要注意,点C是一个给定输入的点,具有已知坐标。锥体是变换图像的所有可能点的集合。由于已经有一个名为C的点,所以变换后的图像不会被命名为点C。因此,你的第一句话“点C的轨迹实际上是一个锥体”表达得有些拗口。 - Stef
还要注意,点C是一个给定输入的点,具有已知的坐标。锥体是转换图像的所有可能点的集合。转换后的图像将不被命名为点C,因为已经有一个名为C的点。所以你的第一句话“点C的轨迹实际上是一个锥体”表达得有些拙劣。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接