编辑:Git Repo样本文件 https://github.com/tpubben/lineIntersect
我试图根据一组交叉线计算x,y坐标中的线交点,这些交叉线穿过由多个线段组成的一条连续线。
连续线由元组列表表示如下,其中每个段以前一段的端点的x / y坐标开始:
lineA = [((x1, y1),(x2,y2)), ((x2,y2),(x3,y3))....]
交叉线以相同的方式表示,但每条线都是一条离散线(没有共享点):
lineB = [((x1, y1),(x2,y2))...]
我试图遍历连续线(lineA)并检查哪些交叉线与lineA的哪些段相交。
到目前为止,我已尝试过以下内容:
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')
答案 0 :(得分:-1)
你的代码看起来正在处理一组特定的数据(即我不知道“startsWith('N')”等是指什么)所以我只能抽象地回答这个问题。 / p>
尝试将代码拆分为执行一项特定任务的多个函数,而不是尝试执行所有操作的一个大函数。您会发现使用和排除故障更容易。
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]))
这是一般的想法。我得到了几何公式: