2

固定速度で移動するポイントと、終点が移動しているライン セグメントとの交点の時間とポイントをどのように判断すればよいでしょうか? 端点は独立して移動しますが、正の y 方向にのみ固定速度で移動します。

状況の写真:

交差点.png

したがって、時間 t にわたって、L1 は L2 に移動し、R1 は R2 に移動し、P1 は P2 に移動します。ある時点で、時刻 t での P の位置は、時刻 t で L と R によって形成される線分上のどこかにあるはずです。

私はmathematica で思いつくことができるすべての関係に固執し、それをtについて解いて答えを得ましたが、それを実装しようとするとうまくいかないようです(衝突は検出されませんでした。私はかなり新しいです) Mathematica を使っていて、自分が何をしているのかよくわからないので、経験豊富な人が、連立方程式を解こうとしている方法が根本的に間違っていることに気付いてくれることを願っています。読んでくれてありがとう!

ここで、U は時間 t における線分です。

  • Ly = L1y + (L2y - L1y) * t
  • Ry = R1y + (R2y - R1y) * t
  • Py = P1y + (P2y - P1y) * t
  • Px = P1x + (P2x - P1x) * t
  • Ux = L1x + (R1x - L1x) * m
  • Uy = Ly + (Ry - Ly) * m
  • m = (Px - L1x) / (R1x - L1x)

t について解くと、次のようになります。

  • Ux = Px
  • Uy = パイ

解決:

  • A = (P2x - P1x) * (L2y - L1y) - (P2x - P1x) * (R2y - R1y)
  • B = (P2x - P1x) * L1y + (P2x - P1x) * R1y - P1x * (L2y - L1y) + L1x * (L2y - L1y) + P1x * (R2y - R1y) - L1x * (R2y - R1y) + (P2y - P1y) * (R1x - L1x) - (R1x - L1x) * (L2y - L1y)
  • C = P1x * L1y - P1x * R1y - L1y * L1x + R1y * L1x + P1y * (R1x - L1x) - L1y * (R1x - L1x)

t = (-B + -sqrt(B^2 - 4AC)) / 2A

4

2 に答える 2

1

数値解:

l1 = {0.969, 0.594};
l2 = {0.892, 0.895};
r1 = {0.75880, 0.90366};
r2 = {0.22, 0.57};
p = {0.337+ 0.8764 t, 0.726 + 0.252 t};
s1 = l1 + ( l2 - l1) t;
s2 =  r1 + (r2 - r1) t;
lx = ( (1 + ci) s1 + (1 - ci) s2 )/2 ;
ciz = (ci /. 
   Solve[ Dot[ {px, 
      py}  - ( (1 + ci) {s1x, s1y} + (1 - ci) {s2x, s2y} )/
      2 , {s1x, s1y} - {s2x, s2y}] == 0, ci][[1]]);
cizt = Simplify[
   ciz /. { px -> p[[1]] , py -> p[[2]] , 
     s1x -> (l1 + ( l2 - l1) t)[[1]], 
     s1y -> (l1 + ( l2 - l1) t)[[2]] , 
     s2x -> (r1 + ( r2 - r1) t)[[1]], 
     s2y -> (r1 + ( r2 - r1) t)[[2]] }];
distance[t_] = 
  Simplify[Norm[lx - p]^2  /. ci -> cizt ,  Assumptions -> {Im[t] == 0} ];
Plot[distance[t], {t, 0, 1}]
possiblesolution = FindMinimum[distance[t], {t, 0, 1}]
If[ Chop[possiblesolution[[1]]] == 0, 
 tp = (t /. possiblesolution[[2]]); Print["possible hit at t=", tp]; 
 If[Abs[cizt /. possiblesolution[[2]]] > 1, 
 Print["missed off the end"], 
 Animate[Show[Graphics[{Point[{p /. t -> 0, p /. t -> 1} ]}], 
Graphics[{Line[{l1, r1} ]}], Graphics[{Line[{l2, r2} ]}], 
Graphics[{Dashed, Line[{s1, s2} /. t -> a]}], 
If[a < tp, Graphics[{Red, Line[{p /. t -> 0, p /. t -> a}]}], 
 Graphics[{Red, Line[{p /. t -> 0, p /. t -> a}], Blue, 
   Line[{p /. t -> tp, p /. t -> a}]}]]], {a, 0, 1}]]]

距離関数を見ると、最小値が 7 次多項式の根であることがわかります。ロバストであるためには、すべての実根を調べる必要があります。

編集 -- Mr Wizard のソリューションに基づくより良いバージョン。交差点がポイント間の無限の線だけでなく、セグメント上にあることを確認することで、少し改善しました。この例では、ランダムな問題が生成され、有効な解を含む問題が見つかった後に停止します。


solutions = {}
While[Length[solutions] == 0,
 {l1, l2, r1, r2, p1, p2} = RandomReal[{0, 1}, 2] &  /@ Range[6];
 p = p1 + (p2 - p1) t  ;
 s1 = l1 + ( l2 - l1) t;
 s2 =  r1 + (r2 - r1) t;
 realsols = 
  Solve[ { 0 < t < 1 ,  Det[ { s1 - s2 , p - s2}]  == 0 ,Dot[ p - s2  , p - s1 ] < 0 } ];
 If[Length[realsols] > 0, solutions = Sort[ (t /. realsols)]; 
  tp = solutions[[1]]];] 
Animate[Show[
  Graphics[{Point[{p1, p2} ]}],
  Graphics[{Green, Line[{l1, r1} ]}],
  Graphics[{Orange, Line[{l2, r2} ]}],
  Graphics[{Dashed, Line[{s1, s2} /. t -> a]}],
  If[a < tp,
   Graphics[{Red, Line[{p1, p /. t -> a}]}],
   Graphics[{
     Red, Line[{p1, p /. t -> a}],
     Blue, Line[{p /. t -> tp, p /. t -> a}]}
    ]]], {a, 0, 1}]

ちなみに、Solve[] にすべての解を見つけさせてから有効な解を選択させる方が、制約を解くよりもはるかに高速です。


(Do [ realsols = 
    Solve[ { Det[ { s1 - s2 , p - s2}]  == 0 , 0 < t < 1, 
      Dot[ p - s2  , p - s1 ] < 0 } ] , {10} ]; realsols)  // Timing
(Do [realsols = 
    Select[ Solve[ {  Det[ { s1 - s2 , p - s2}]  == 0   , 
       0 < t < 1}  ] , 
     Dot[ p - s2  , p - s1 ] < 0 /. #  & ]   , {100} ]; 
  realsols) // Timing
(Do [realsols = 
    Select[ Solve[ {  Det[ { s1 - s2 , p - s2}]  == 0   } ] ,  0 <= t <= 1  &&    Dot[ p - s2  , p - s1 ]  < 0  /. #   & ]   , {100} ]; 
  realsols ) // Timing

ただし、最初のフォームの方がきれいです:-)

于 2012-10-02T21:01:26.930 に答える
0

点を定義する:

{L1, L2, R2, R1, P1, P2} =
   {{0.01`, 0.31`}, {0, 2.`}, {2.985`, 1.9`}, {2.995`, 0.95`},
    {1.7`, 1.82`}, {1.23`, 0.87`}};

関数を定義します。

L := L1 (1 - t) + L2 t
R := R1 (1 - t) + R2 t
P := P1 (1 - t) + P2 t

問題を視覚化する:

Manipulate[
 Block[{t = tt},
  Graphics[{
    {Red, Polygon[{L1, L2, R2, R1}]},
    {White, Thick, Line[{P1, P2}]},
    {Black, PointSize[Large], Point@{L, R, P}, Line[{L, R}]}
   }, Background -> Gray, PlotRangePadding -> 0.7]
 ],
 {tt, 0, 1}
]

Mathematica グラフィックス

を解いtて、解が可視化と一致することを観察します。

Reduce[{Det[{R - L, P - L}] == 0, 0 < t < 1}, t]

t == 0.525873

利益。

于 2012-10-04T13:04:39.530 に答える