需要找到在多个段上迭代的两个线段的交叉点

时间:2016-08-19 22:45:29

标签: python line-intersection

好的,这是问题所在。我试图通过比较从一系列csv文件中读出的多个线段来计算两条线的交集。我已经将每个线段的x,y坐标对分为元组内的元组列表,如下所示:

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

Line Problem

我试图找出如何沿着连续线和交叉线迭代以找出每条交叉线相交的连续线的位置。

基本上我想要(下面列出的伪代码):

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))

2 个答案:

答案 0 :(得分:0)

假设函数line_intersectiondiv == 0上返回False而不是提高exeption。

简单方法:

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

但是,使用嵌套循环时,在crossingLines中存在大量段时速度很慢。

更有效的方法:

要提高性能,请尝试intervaltree,这将为您提供相交的候选测试。在您的情况下,首先在crossingLines上构建一个间隔树,然后遍历continuousLine以在该树中查找相交候选者,并进行测试以获得最终结果。

答案 1 :(得分:0)

由于您还没有提供任何样本输入和预期输出,我将使用下面显示的boundary=""Z3shMls-AQ6eaHSwjw2jzfRcO6-fpHyDYVbHsfSFx9wigmAkmxnOpg5NG/RdsykXIj0xR3"" 函数的虚拟版本。它只是打印输入并返回硬编码结果 - 但它会告诉你如何迭代输入数据并将其传递给实际函数。

从输出中应该清楚它在做什么。

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web"){
        exclude module: "spring-boot-starter-tomcat"
    }
    compile("org.springframework.boot:spring-boot-starter-undertow:1.4.0.RELEASE")
    // Add newer undertow version after spring boot starter
    compile('io.undertow:undertow-core:1.3.19.Final')
}

所有循环都放在一个名为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