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