Math 沿矢量使三角形变形以获得特定角度

Math 沿矢量使三角形变形以获得特定角度,math,3d,geometry,Math,3d,Geometry,我正在尝试从共享同一原点的三维空间中的许多片段创建一个二叉树。 当合并两个线段时,我希望线与子节点之间有一个特定的角度。 下图说明了我的问题。C显示父节点的位置,A和B显示子节点的位置。N是从C到A和C到B的向量的平均向量 在给定角度下,如何确定点p? 谢谢你的帮助 P = C + t * ((A + B)/2 - C) t is unknown parameter PA = A - P PA vector PB = B - P

我正在尝试从共享同一原点的三维空间中的许多片段创建一个二叉树。 当合并两个线段时,我希望线与子节点之间有一个特定的角度。 下图说明了我的问题。C显示父节点的位置,A和B显示子节点的位置。N是从C到A和C到B的向量的平均向量

在给定角度下,如何确定点p? 谢谢你的帮助

P = C + t * ((A + B)/2 - C)    t is unknown parameter
PA = A - P                     PA vector 
PB = B - P                     PB vector
Tan(Fi) = (PA x PB) / (PA * PB)    (cross product in the nominator, scalar product in the denominator)
Tan(Fi) * (PA.x*PB.x + PA.y*PB.y) = (PA.x*PB.y - PA.y*PB.x)
这是t的二次方程,求解后,我们将得到p点的两个可能位置(对于非退化情况)(第二个位于AB线的另一侧)

添加:

Let's ax = A.x  - A point X-coordinate and so on,
abcx = (ax+bx)/2-cx, abcy = (ay+by)/2-cy
pax = ax-cx - t*abcx, pay = ay-cy - t*abcy
pbx = bx-cx - t*abcx, pby = by-cy - t*abcy
ff = Tan(Fi) , then
ff*(pax*pbx+pay*pby)-pax*pby+pay*pbx=0
ff*((ax-cx - t*abcx)*(bx-cx - t*abcx)+(ay-cy - t*abcy)*(by-cy - t*abcy)) -
 - (ax-cx - t*abcx)*(by-cy - t*abcy) + (ay-cy - t*abcy)*(bx-cx - t*abcx) = 

 t^2 *(ff*(abcx^2+abcy^2)) + 
 t *  (-2*ff*(abcx^2+abcy^2) + abcx*(by-ay) + abcy*(ax-bx) ) +
      (ff*((ax-cx)*(bx-cx)+(ay-cy)*(by-cy)) - (ax-cx)*(by-cy)+(bx-cx)*(ay-cy)) =0     
这是带有系数的二次方程
AA*t^2+BB*t+CC=0

AA = ff*(abcx^2+abcy^2)
BB = -2*ff*(abcx^2+abcy^2) + abcx*(by-ay) + abcy*(ax-bx)
CC = ff*((ax-cx)*(bx-cx)+(ay-cy)*(by-cy)) - (ax-cx)*(by-cy)+(bx-cx)*(ay-cy) 
p.S.我的答案是2d案例

对于3d:仅使用标量积(矢量长度)可能更简单


另一种解决方案是在向量N上使用二元搜索,无论p是否接近C,角度都会变小,p是否远离C,角度都会变大,适用于二进制搜索。

我不确定我是否理解了这个问题,你的意思是输入点a、B、C、向量N和角度?是的,没错。A、 给出了B和C。N可以从AC和AB计算出来,我想要的是给定角度的位置P。难道不是PA x PB=mod(PA)*mod(PB)*sin(θ)?@Abhishek Bansal是的。但是我们不想计算向量长度(用平方根),所以使用标量和叉积来消除(减少)mod'sGot!不知道交叉积的mod也是PA.xPB.y-PA.yPB.xAh,Tg(Fi)让我想起了俄罗斯的旧时光。。。其他人都使用“tan”而不是“tg”。@Satara添加了一些计算如何对向量执行二进制搜索?你的意思是计算和检查沿N方向的角度,直到达到所需的角度?我认为这对于我的案例来说太慢了,因为它必须实时完成。是的,你必须假设点P,然后计算角度,如果角度大于所需角度,则向左(靠近点C),否则向右(远离点C),是的,它将比另一种方法更慢,但不会太慢,因为它仍然是一个日志复杂性。
Cos(Fi) = (PA * PB) / (|PA| * |PB|)