1

私は2つのポイントシリーズを持っています

A = [(18.405316791178798, -22.039859853332942),
 (18.372696520198463, -21.1145),
 (18.746540658574137, -20.1145),
 (18.698714698430614, -19.1145),
 (18.80081378263931, -18.1145),
 (18.838536172339943, -17.1145),
 (18.876258562040572, -16.1145),
 (18.967679510389303, -15.1145),
 (19.004907703822514, -14.1145),
 (19.042135897255729, -13.1145),
 (19.345372798084995, -12.1145),
 (19.391824245372803, -11.598937753853679),
 (19.435471418833544, -11.1145),
 (19.420235820376909, -10.1145),
 (19.423148861774159, -9.1145),
 (19.426061903171416, -8.1145),
 (19.452752569112423, -7.1145),
 (19.489649834463115, -6.1145),
 (19.444635952332344, -5.1145),
 (19.443635102001071, -5.0430597023976906),
 (19.430626347601358, -4.1145),
 (19.421676068414001, -3.1144999999999996),
 (19.362954522948439, -2.1144999999999996),
 (19.346848825989134, -1.1144999999999996),
 (19.359781116687397, -0.1144999999999996),
 (19.396797325132418, 0.69011368336827994)]

B=[(21.7744, -17.859620414326386),
 (22.7744, -17.858000854574556),
 (23.7744, -18.065164294951039),
 (24.7744, -18.051109497755608),
 (25.7744, -18.037054700560173),
 (26.7744, -18.022999903364742),
 (27.7744, -18.008945106169307),
 (28.7744, -18.014846881456318),
 (29.7744, -18.02764295838865),
 (30.7744, -18.098340990366935)]

それらの1つが1つの頭から延長される場合、それらが交差することは確かです.

今、私はそれらの「潜在的な」交差点を見つけたいと思っています。「すでに交差している」点シリーズの交点を見つけることができる関数を作成しました。

# find the intersection between two line segments
# if none, return None
# else, return sequence numbers in both rep1 and rep2 and the intersection
def _findIntersection(rep1, rep2):
    x_down = [elem[0] for elem in rep1]
    y_down = [elem[1] for elem in rep1]
    x_up = [elem[0] for elem in rep2]
    y_up = [elem[1] for elem in rep2]
    for m in xrange(len(x_down)-1):
        p0 = np.array([x_down[m], y_down[m]])
        p1 = np.array([x_down[m+1], y_down[m+1]])
        for n in xrange(len(x_up)-1):
            q0 = np.array([x_up[n], y_up[n]])
            q1 = np.array([x_up[n+1], y_up[n+1]])
            try: # to ignore the parallel cases
                params = np.linalg.solve(np.column_stack((p1-p0, q0-q1)), q0-p0)
                if np.all((params >= 0) & (params <= 1)):
                    return m, n, ((p0+params[0]*(p1-p0))[0], (p0+params[0]*(p1-p0))[1])
            except:
                pass

だから、私が必要としているのは、どのポイントシリーズのどの端を拡張する必要があるかを見つけることだと思います. これを知っている限り、単純に拡張して、既存の との交点を見つけることができます_findIntersection()

この問題では、2 つのポイント シリーズはほぼ両方とも直線であり、交点が 1 つだけ存在することを意味していると安全に想定できます。

私はPythonを使用していますが、一般的なソリューションも大歓迎です!

4

2 に答える 2

2

まず、各ポイント シリーズの回帰直線を取得します。線のそれぞれの点系列の終点を線自体に投影することにより、線を線分 s1 および s2 に変換します。

問題を線形代数で見ると、2 つの線分はベクトルです。それらが平行または共線でない限り、各ベクトルに特定の係数を掛けると、交点まで延長されます。したがって、係数 alpha と beta を となるように求める必要がありますalpha * s1 = beta * s2alpha * s1 + beta * (-s1) = 0つまり、個々の線分で既に行ったように、一次方程式を解きます。

知っておくべき3つのケースがあります。

  1. alpha と beta の両方の絶対値が 1 以下の場合、交点は両方の線分の内側にあります。
  2. 一方の絶対値が <=1 で、もう一方が >1 の場合、交点 i は 2 つの線分の 1 つ (s2 など) の内側にのみあります。その線分のベクトルに先ほど求めた係数をかけ、ベクトルの原点を足して交点を求めます。次に、他の線分 (この場合は s1) のどの端点が交点に近いかを判断できます。近い方から延長されます。
  3. 両方の絶対値が 1 より大きい場合は、単純に s1 に (アルファ / ベータ) を掛けて交点を見つけ、それに s1[0] を加算します。交点が見つかったら、各線分で交点に最も近い端点を見つけるだけです。これらは、ポイント シリーズを拡張する必要がある 2 つのエンドポイントです。
于 2013-11-10T14:17:24.490 に答える