同じ原点を共有する 3D 空間の多数のセグメントからバイナリ ツリーを作成しようとしています。2 つのセグメントをマージするとき、子ノードへの線の間に特定の角度が必要です。次の図は、私の問題を示しています。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 ポイントの 2 つの (非縮退の場合) 可能な位置が得られます (2 つ目は 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)
PS私の答えは2dケースです!
3D の場合: スカラー積のみ (ベクトルの長さ) を使用する方がおそらく簡単です。
Cos(Fi) = (PA * PB) / (|PA| * |PB|)
PがCに近い場合は角度が小さくなり、PがCから離れている場合は角度が大きくなり、二分探索に適しています。