2017-01-23 13 views
0

2本の2D線の交点を見つけるアルゴリズムが必要です。各行はの形式で、行の点と平行ベクトルのdx/dyの形式で表示されます。私は各行のパラメータ化を試みて、パラメータ化された変数を解くために方程式の系を解くことを試みました。私は線のパラメトリック方程式にプラグインしてx/yを得ることができました。何か案は?私はPythonでプログラミングしていますが、言語はそれほど重要ではありません。各行と平行なベクトルに点が与えられた2本の線の交点を見つける方法

+1

「私の試みは失敗しました」 - あなたの試みを見ることができる何らかの方法があれば?それは私たちにとって有益な情報でしょうか? :-) – paxdiablo

+0

「平行ベクトルのdx/dy」という意味はどういう意味ですか?線の傾き(平行な線が同じ傾きを持つため)、または線の方向ベクトルなどが与えられていることを意味しますか?そして、私たちはあなたの仕事の証拠を問題に見る必要があります。何も失敗したものを見ることができます。 –

+0

@paxdiablo - すごく塩味があります。しかし、もちろん。私はそれが長くて悪かったので、それを含めなかっただけです。私はx = x1 + t1 * dx1、y = y1 + t1 * dy1、x = x2 + t2 * dx2、y = y2 + t2 * dy2から始めました。方程式系Iを解いた後、t2 =(x2dy1-x1dy1-y1y2dx1)/(dy2dy1-dx1dy2)で終了する。 '(x1、y1)=(0,0)、(x2、y2)=(1,1)、(dx1、dy1)=(1,0)、(dx2、dy2) =(0、-1) 't2方程式の一番下に0があります。 –

答えて

2

あなたは基本的に以下の式を解決しなければならない:

X = X 0、 + DX ×トン
Y = Y 0、 + DY ×トン
X = X 0、 + DX B × U
Y B = Y 0、 + DY B × U

またはB:

X 0、 + DX × T = X 0、B + DX B × U
x, + dxa ×t = x 0、b + DX Bあなたには、いくつかの代数操作をすればuが

さて、あなたはそれを見つけるでしょう ×:

トン= DY B ×( -x 0 Bのx 0、を) Bを-dx ×(Y 0、 -y 0、)/ D B
U = DY ×(
-x 0 B X 0、)がを-dx ×/D( -Y 0、 B Y 0)。どこ
D =

DX × DY B -dx B × dyが今では(あなたが両方を計算する必要はありません)ので、tまたはuのいずれかを決定するための唯一の問題です上記の数式にプラグインします。式(分母)でdがゼロに等しい場合ので

def intersect(x0a,y0a,dxa,dya,x0b,y0b,dxb,dyb): 
    t = (dyb*(x0b-x0a)-dxb*(y0b-y0a))/(dxa*dyb-dxb*dya) 
    return (x0a+dxa*t,y0a+dya*t) 

、これは交差が(二行が平行である)が存在しないことを意味します。関数を変更して、たとえばNoneを返すか、そのような場合に例外を発生させることができます。

たとえば、ベクトル(1,0)のオフセットと方向(0,1)でテストすると、オフセット(0,2)および方向(1,1)を有するベクトルと、あなたはそれほど驚くべき結果を得られません。

$ python3 
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> def intersect(x0a,y0a,dxa,dya,x0b,y0b,dxb,dyb): 
...  t = (dyb*(x0b-x0a)-dxb*(y0b-y0a))/(dxa*dyb-dxb*dya) 
...  return (x0a+dxa*t,y0a+dya*t) 
... 
>>> intersect(1,0,0,1,0,2,1,1) 
(1.0, 3.0) 
+1

あなたの答えを10倍アップアップすることができたら、私はそうするでしょう。どうもありがとうございました。 –

関連する問題