【问题标题】:How to place a point in 3D so that it creates a certain angle?如何在 3D 中放置一个点以创建某个角度?
【发布时间】:2013-01-23 04:06:43
【问题描述】:

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

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

我有两点:

答: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;
}

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

【问题讨论】:

  • 有无数种转换可以做到这一点。
  • 目前他们的角度为 25.7663。我想对于 C.X、C.Y、C.Z,我必须将(?)点 C 变换 22.2337 度。如果这是正确的,我该怎么做?
  • 你将如何解决 2D 问题?
  • 你想做成哪个48度角?
  • Ignacio,如果我理解正确的话,我用来计算度数的公式有两个 48 度(-48 和 +48)。就我需要使用的方程式而言,我的问题的解决方案是否会有所不同,具体取决于我想要 -48 度还是 +48 度?或者我不明白你的问题。 :)

标签: c++ math 3d rotation trigonometry


【解决方案1】:
       A------C    
       |     
 c''   |    c'
       B

由于 3D 中的三个点定义了一个平面,因此在该平面上只有 2 个可能的候选变换 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) 的形式,通过将两者平方来简化为 u 中的二次多项式侧面。

【讨论】:

  • 感谢您的回答。不过,我并不真正理解这个公式。 t 和 u 是什么?您是否可以将我的 3 点示例插入其中,以便我了解情况如何?
  • u 和 t 是未知变量,它们缩放向量 (B-A) 和 (C-A) 以满足点积方程,根据定义为 t(B-A) dot u(C-A) == | t(B-A)|*|u(C-A)|*cos(angle) 和其中 ||是长度运算符 == sqrt(xx+yy+z*z)。你会固定角度,看看你会得到什么。
  • 您指出 t == 1. (B-A)dot 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;乙: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)dot u(-7,2,2) = 16.65*sqrt(u)*7.55 (-6,4,-15) dot (-7,2,2) = 125.705*sqrt(u) 我不是之后确定。
  • ABC之间的夹角是固定的,但我的意思是1*(B-A)和c'之间的夹角,其中c' = u*(C-A)+ (B-A) 可协商。
  • 还有一件事:这个等式只解决了 u 的向量通过 c',这意味着您可能希望将 c' 缩放为与 | 相同的长度。 C-A|。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多