1

開始点、進行方向、距離、および線分が与えられた場合、この進行方向に沿って、この線分から指定された距離だけ離れた最初の点を見つけます。

2 つのケースをカバーしましたが、最後の 1 つをカバーできませんでした。

最初のケース: ラインから離れる。始点が指定距離内であっても無視する。

2 番目のケース: ラインと交差します。三角形と三角形を使用して解決しました。最初は次のケースを考慮していませんでした。

3 番目のケース: ラインに向かっていますが、ラインと交差していません。これが正しく行われれば、2番目のケースも解決されると思います。

3 つのサブケース:

  1. 最小直線距離が指定された距離を超えています。それを無視します。

  2. 最小ライン距離は、指定された距離と同じです。すでにポイントを見つけました。

  3. 最小直線距離が指定された距離未満です。これは、見出しに沿って線セグメントの終点までの垂線が、必要な距離より短いことを意味します。これはまた、この垂直線の両側に、必要な距離の 2 本の線があることを意味します。1 つは見出しに対して垂直で、もう 1 つは同じ終点に最も近く、見出しに対して垂直ではありません。それらのポイントを見つけて、どちらが開始点に近いかを確認するだけです。

これは私が今日立ち往生しているところです。それを描くのは簡単でしたが、ベクトルの計算などを行うのは難しいものでした。

これは次のように言い換えることができます。

線分からP(t) = P0 + t*v離れているのは何時ですか?DL((x1,y1), (x2,y2))

v=(sin(heading), -cos(heading))私の場合。

4

4 に答える 4

0

こんにちは私が最終的に思いついた解決策。

  1. 光線は、線分から平行で指定された距離Dの線分と交差しますか?長方形を描き、線分に平行な辺を確認するだけです。

  2. 光線は、線分の各端点で半径Dの円と交差しますか?

  3. 合計単位時間を最小化して、線分からD離れた光線に沿った最初の点を見つけます。

考えられる境界の場合:開始点はD内にあり、線から離れていますか?このケースの処理方法はユーザー次第です。

于 2010-02-15T21:20:11.560 に答える
0

ありがとう、それはうまくいきます。私はこの方法でアルファを見つけました:

heading = 45.0*pi/180. #heading 45 degrees.
if x1 > x2: #line segment (x1,y1)<->(x2,y2)
    dx = x2 - x1
    dy = y2 - y1
else:
    dx = x1 - x2
    dy = y1 - y2

segmentHeading = atan2(dx, dy)

if heading > 0:
    alpha = segmentHeading + heading
else:
    alpha = -segmentHeading + heading

t = abs( (dStart - D) / -cos(alpha) ) #-cos in python, sin in C.
于 2010-02-02T20:57:44.363 に答える
0

ポイントとライン セグメント間の最小開始距離がライン セグメントに対して垂直である成功した結果:

http://img46.imageshack.us/i/success.png/

于 2010-02-05T20:35:09.777 に答える
0

あなたのソリューションが常に機能するとは限りません。反例を見つけました:

線分 = (0,0) -> (0,14)

開始点 = (19, 6) @ ヘディング -159.5 または 200.5 西/反時計回り

それは (2.952, 0.0) で線と交差するので、0.0 の距離内でどこに来るのか尋ねます。

私が得た結果は正しくありません。

http://img5.imageshack.us/i/failuref.png/

あなたのソリューションを使用してどれが機能し、どれが機能しないかをどのように判断できるかは、点と線分の間の最小開始距離が垂直線を作成するかどうかによって異なります。

次の投稿で別の写真を投稿できれば、成功例を載せます。

これらの画像を生成した Sage のコードを投稿したかったのですが、残念ながらコード タグは python を受け入れています。

于 2010-02-05T20:29:47.620 に答える