2

OK、ここに問題があります。一連の csv ファイルから読み出された複数の線分を比較して、2 つの線の交点を計算しようとしています。次のように、各線分の x、y 座標ペアをタプル内のタプルのリストに既に取得しています。

continuousLine = [((x1,y1),(x2,y2)), ...]
crossingLines = [((x1,y1),(x2,y2)), ...]

回線の問題

連続線に沿って交差する線を反復して、連続線に沿って各交差線が交差する場所を見つける方法を見つけようとしています。

基本的に私が欲しい(以下にリストされている疑似コード):

for segment in continuousLine:
    if segment in crossingLines intersect == True:
       return intersection
    else:
       move on to next crossing line segment and repeat test

私はコーディングに慣れていないため、他の人を助けることができないため、これについて助けを求めるのは嫌いですが、誰かが私と一緒にこれを解決できることを願っています.

イテレータを見つけたら、交点を計算するために機能すると思われる方法があります。

line1 = ()
line2 = ()
def line_intersection(line1, line2):
    xdiff = (line1[0][0] - line1[1][0], line2[0][0] - line2[1][0])
    ydiff = (line1[0][1] - line1[1][1], line2[0][1] - line2[1][1]) #Typo was here

    def det(a, b):
        return a[0] * b[1] - a[1] * b[0]

    div = det(xdiff, ydiff)
    if div == 0:
       raise Exception('lines do not intersect')

    d = (det(*line1), det(*line2))
    x = det(d, xdiff) / div
    y = det(d, ydiff) / div
    return x, y

print line_intersection((A, B), (C, D))
4

2 に答える 2

0

関数が例外を発生させる代わりにline_intersectionFalse を返すとします。div == 0

簡単な方法:

filter(None, [intersection(a, b) for a in continuousLine for b in crossingLines])

ただし、ネストされたループを使用すると、crossLines に多数のセグメントがある場合は遅くなります。

より効率的な方法:

パフォーマンスを改善するには、intervaltreeを試してみてください。これにより、テスト用の交差候補が得られます。あなたの場合、最初にcrossLinesで間隔ツリーを構築し、次にcontinuousLineをループしてそのツリー内の交差候補を見つけ、テストして最終結果を取得します。

于 2016-08-20T00:31:31.437 に答える
0

サンプル入力と期待される出力が提供されていないため、line_intersection()以下に示す関数のダミー バージョンを使用します。入力を出力してハードコーディングされた結果を返すだけですが、入力データを反復処理して実際の関数に渡す方法を示します。

出力から、何をしているのかが明確になるはずです。

def line_intersection(line1, line2):
    print('intersecting:')
    print('  ({}. {}), ({}, {})'.format(line1[0][0], line1[0][1],
                                        line1[1][0], line1[1][1]))
    print('  ({}. {}), ({}, {})'.format(line2[0][0], line2[0][1],
                                        line2[1][0], line2[1][1]))
    print('')
    return 100, 200

すべてのループは、find_intersections()見つかった連続する交差点を返し、そうでない組み合わせをスキップするという名前のジェネレーター関数に入れられています。

def find_intersections(continuous_line, crossing_lines):
    for cl_segment in continuous_line:
        for xl_segment in crossing_lines:
            try:
                x, y = line_intersection(cl_segment, xl_segment)
            except Exception:
                pass
            else:
                yield x, y

作成された入力データを使用した使用例を次に示します。

continuous_line = [((1,2),(3,4)), ((5,6),(7,8)), ((9,10),(11,12))]
crossing_lines = [((21,22),(23,24)), ((25,26),(27,28)), ((29,30),(31,32))]
intersections = [(x, y) for x, y in
                    find_intersections(continuous_line, crossing_lines)]
print('intersections found:')
print(intersections)

出力:

intersecting:
  (1. 2), (3, 4)
  (21. 22), (23, 24)

intersecting:
  (1. 2), (3, 4)
  (25. 26), (27, 28)

intersecting:
  (1. 2), (3, 4)
  (29. 30), (31, 32)

intersecting:
  (5. 6), (7, 8)
  (21. 22), (23, 24)

intersecting:
  (5. 6), (7, 8)
  (25. 26), (27, 28)

intersecting:
  (5. 6), (7, 8)
  (29. 30), (31, 32)

intersecting:
  (9. 10), (11, 12)
  (21. 22), (23, 24)

intersecting:
  (9. 10), (11, 12)
  (25. 26), (27, 28)

intersecting:
  (9. 10), (11, 12)
  (29. 30), (31, 32)

intersections found:
[(100, 200), (100, 200), (100, 200), (100, 200), (100, 200), (100, 200), (100,
200), (100, 200), (100, 200)]
于 2016-08-20T00:35:24.173 に答える