python 如何找到两条线段的交点(如果存在)?[已关闭]

wdebmtf2  于 2022-11-21  发布在  Python
关注(0)|答案(1)|浏览(175)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
2小时前关门。
Improve this question
我有两条线段描述如下:

# Segment 1
((x1, y1), (x2, y2))

# Segment 2
((x1, y1), (x2, y2))

我需要一种方法来找到它们的交叉点,如果存在的话,不使用第三方模块。我知道人们以前问过这个问题,但我找到的每一个答案要么不总是有效,要么使用第三方模块。
到目前为止,我已经看到了这些问题和它们的“答案”:How do I compute the intersection point of two lines?How can I check if two segments intersect?打印机

k10s72fa

k10s72fa1#

这里有一个非常简单的算法,它使用了基本代数。还有更有效的方法来完成这个任务,如OP分享的问题所示,但对于不懂任何线性代数的人来说,它们不会有特别的帮助。
给定两条线段,您可以使用点斜率公式y - y1 = m (x - x1),使用它们的端点找出每条直线的方程式。
一旦你找到了每条直线的方程,将它们设置为相等,然后用代数方法求解x。一旦你找到了x,将其代入任一方程,得到y,你的交点就是(x, y)
最后,检查此交点是否位于 * 两个 * 线段上。
如果你不能解出x,这意味着两条直线不相交。一个简单的测试是在做剩下的工作之前,先检查两条直线的斜率是否相同。如果它们是平行的,并且永远不会相交,* 除非 * 它们的截距也是相同的,在这种情况下,两条直线将到处相交。
首先用纸和笔象征性地做代数运算,然后把交点的公式翻译成代码,再构建其他逻辑。
垂直线需要稍微不同的逻辑。如果两者都是垂直的,那么你需要检查线段是否共享相同的x值。如果它们共享相同的y值,那么检查是否有y坐标重叠。
如果只有一条线段是垂直的,那么求出非垂直线的方程,然后在垂直线的x坐标处求出它的值,这样就给予了可能的交点的y坐标。如果y值在垂直线的两个y坐标之间,并且x坐标在非垂直线段上,则线段相交。
这里有很多短路的机会,在实施过程中自己去找。
它可能有助于实现一个自定义类来表示您的段:

class Segment:
    def __init__(self, *, x1: float, x2: float, y1: float, y2: float) -> None:
        self.x1 = x1
        self.y1 = y1
        self.x2 = x2
        self.y2 = y2

    def __contains__(self, x: float) -> bool:
        """
        Check if `x` lies on this segment (implements the `in` operator, 
        allowing for expressions like `x in some_segment`)
        """
        pass

    def slope(self) -> float:
        try:
            return (self.y2 - self.y1) / (self.x2 - self.x1)
        except ZeroDivisionError:
            print("this segment is vertical!")
            return float("inf")

    def equation(self):
        """The equation for the line formed by this segment"""
        pass

    def intersects(self, other) -> bool:
        """Check if two Segment objects intersect each other"""
        pass

相关问题