2016-08-22 30 views
0

EDIT: Git Repo для выборки файловhttps://github.com/tpubben/lineIntersectПопытка вычислить несколько пересечений линий с использованием списков кортежей питона

Я пытаюсь вычислить точки пересечения линии в х, у координаты на основе множества пересекающихся линий пересечения одна непрерывная линия, состоящая из нескольких сегментов.

Сплошная линия представляет список кортежей следующим образом, где каждый сегмент начинается с х/у координаты конечной точки предыдущего сегмента:

lineA = [((x1, y1),(x2,y2)), ((x2,y2),(x3,y3))....] 

Пересечение линии представлены таким же образом, однако каждый из них является дискретной линией (без общих точек):

lineB = [((x1, y1),(x2,y2))...] 

Я пытаюсь перебирать непрерывную линию (Linea) и проверить, какие пересекающие линии пересекаются с какими сегментами Linea.

Пример изображения того, что линия пересечения будет выглядеть здесь: Crossing lines

до сих пор я попытался следующие:

from __future__ import print_function 

def newSurveys(nintyin, injectorin): 
    # pull data out of pre-prepared CSV files 
    fh = open(nintyin) 
    fho = open(injectorin) 
    rlines = fho.readlines() 
    rlines90 = fh.readlines() 

    segA = [] 
    segB = [] 
    segA90 = [] 
    segB90 = [] 

    for item in rlines: 
     if not item.startswith('M'): 
      item = item.split(',') 
      segA.append((float(item[4]),float(item[5])))#easting northing 
      segB.append((float(item[4]),float(item[5])))#easting northing 

    segB.pop(0) 
    z = len(segA)-1 
    segA.pop(z) 

    for item in rlines90: 
     if not item.startswith('N'): 
      item = item.split(',') 
      segA90.append((float(item[1]),float(item[0])))#easting northing 
      segB90.append((float(item[3]),float(item[2])))#easting northing 

    activeWellSegs = [] 
    injector90Segs = [] 

    for a, b in zip(segA, segB): 
     activeWellSegs.append((a,b)) 

    for c, d in zip(segA90, segB90): 
     injector90Segs.append((c,d)) 


    if len(activeWellSegs) >= len(injector90Segs): 
     lineA = activeWellSegs 
     lineB = injector90Segs 
    else: 
     lineA = injector90Segs 
     lineB = activeWellSegs 


    for l1 in lineA:   
     for l2 in lineB: 
      ##### Use differential equation to calculate line intersections, 
      ##### taken from another user's post  
      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]) 

       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(l1, l2), file=lprint) 



    newSurveys('producer90.csv', 'injector.csv') 
+3

Вы пробовали это и ...? Каков реальный вопрос? У меня мало мотивации, чтобы генерировать тестовые данные, запускать свой код, а затем * угадывать *, каков ваш вопрос. В чем проблема с вашим кодом? Некоторые фактические данные теста с ожидаемым выходом были бы хороши. –

+0

Кроме того, вы действительно хотите, чтобы определение 'line_intersection' находилось внутри цикла таким образом? –

+0

Я довольно новичок в этом ... мой работодатель бросил меня в огонь так сказать, потому что у меня есть некоторый опыт работы с HTML и CSS (по-видимому, разметка языков == программирование). Я не знаю, хочу ли я, чтобы во вложенном цикле, по производительности, он был, вероятно, не оптимальным, но сырая производительность, вероятно, не имеет большого значения. Как я могу приложить файлы тестовых данных для вас, что является приемлемым? – haplessgeo

ответ

-1

Ваш код выглядит как он имеет дело с определенным набором данных (т. е. я понятия не имею, к чему относится «startsWith (« N ») и тому подобное), поэтому я могу ответить только на этот вопрос в реферате.

Попробуйте разделить код на несколько функций, которые выполняют одну конкретную задачу, а не одну большую функцию, которая пытается сделать все. Вам будет намного легче работать и устранять неполадки.

def getScalar(lineSegment): 
    return (lineSegment[1][0] - lineSegment[0][0], 
      lineSegment[1][1] - lineSegment[0][1]) 

def doTheyIntersect(lineA, lineB): 
    scalarA = getScalar(lineA) 
    scalarB = getScalar(lineB) 

    s = (-1.0 * scalarA[1] * (lineA[0][0] - lineB[0][0]) + scalarA[0] * (lineA[0][1] - lineB[0][1]))/(-1.0 * scalarB[0] * scalarA[1] + scalarA[0] * scalarB[1]) 
    t = (scalarB[0] * (lineA[0][1] - lineB[0][1]) - scalarB[1] * (lineA[0][0] - lineB[0][0]))/(-1.0 * scalarB[0] * scalarA[1] + scalarA[0] * scalarB[1]) 

    if 0.0 <= s <= 1.0 and 0.0 <= t <= 1.0: 
     return True 
    else: 
     return False 

lineA = [(x, y), (x1, y1), ...] 
lineB = [(x, y), (x1, y1), ...] 

for index, segment in enumerate(lineA): 
    if index + 1 < len(lineA): 
     for index2 in range(0, len(lineB), 2): 
      if doTheyIntersect((lineA[index], lineA[index + 1]), (lineB[index2], lineB[index2+1])): 
       print("lineB ({0}, {1}) intersects lineA at ({2}, {3})".format(str(lineB[index2]),str(lineB[index2+1]), str(lineA[index]), str(lineA[index + 1])) 

Это - общая идея. Я получил геометрические формулы из:

How do you detect where two line segments intersect?

+0

Спасибо, что вернулись ко мне. Я работаю над тем, что вы опубликовали, и я столкнулся с блокпостом. После исправления (замечательно немного) синтаксических ошибок, я получаю трассировку, которая говорит мне, что ваша функция getScalar не работает с кортежами. FYI, спасибо, что напомнил мне, чтобы разбить его на функции, гораздо легче читать. – haplessgeo

+0

Для функции getScalar необходимо иметь кортеж кортежей, переданный (например, ((1,2), (2,3))) с каждым кортежем, представляющим точку сегмента линии. Было также несколько других ошибок, которые я заметил: забыл положить скобки вокруг числителя для s и t, первое значение в формуле t должно быть scalarB [0], оператор if использует «> =» вместо «<=», , а в заявлении печати в конце используется неправильный синтаксис форматирования. Я исправлю их в оригинальном примере. – TripleD