3

ジオメトリのコードはしばらくするとうんざりしますが、このライブラリを完成させたいので、ここに行きます。

基本的に、1 つの線分 A を別の線分 B と交差しないように移動する最も効率的な方法は何ですか?

両方の線分は、始点 (x, y) と、線分がその点からどのように伸びるかを表すベクトル (eX, eY) で定義されます。線分がどのように記述されるかの例を以下に示します。

ここに画像の説明を入力

私が探している解決策は、線分が交差しない最も近い場所に移動される場所です (その範囲はまったく変更されません)。例:

ここに画像の説明を入力

この結果を得る最も効率的な方法は何ですか?

編集:人々は私が「移動」とは何を意味するのか尋ねてきました-つまり、線分の始点の(x、y)座標を変更することを意味します。これにより、セグメント全体が翻訳されます。

また、線分はデカルト平面上に存在し、任意の x/y 移動が許可されます。

4

2 に答える 2

4

これはどうでしょうか。4つのベクトルを見つけます。2つは赤い線の端点から黒い線に垂直になり、2つは赤い線から黒い線の端点に垂直になります。これらのベクトルの最短を取り、それに沿って赤い線を移動します。

于 2012-04-14T20:17:15.730 に答える
0

Since you don't specify in which dimension you are free to move, I will assume that any are fine.

I assume your red line is characterized by a starting point (x,y), and a vector from there to the endpoint (eX,eY). Any point on the line is thus [0,1]*(eX,eY)+(x,y).

Lets find the point where lines cross. That's where a*(eX1,eY1)+(x1,y1) = (eX2,eY2)+(x2,y2) with a in [0,1].

If this crossing exists, you can just move the line so that it ends at this crosspoint, with a being the length you have to move.

(x1',y1') = (x1,y1) - a*(eX1,eY1)

This way, you move the starting point away until the crossing point you found before is the touching point of the two lines.

于 2012-04-14T20:15:34.123 に答える