如何判断一条线是否穿过4个点的平面(2d)
How to determine if a line passes through a plane of 4 points (2d)
我目前正在尝试编写一个程序来确定一条线是否穿过 4 点正方形的区域,并且我正在寻找一个公式。我只找到了带有向量的 3 维平面的解决方案,并试图通过用笔和纸计算将它们应用到我的情况,但当需要第三个值时,我似乎总是陷入死胡同。
我认为最好的方法是计算直线到正方形的距离。如果它显然通过(它的一部分),那将是 0。但我似乎找不到 google 和堆栈溢出搜索的正确词,因为这似乎太基础了,以前没有人回答过。
如果有人有 link 或关于如何计算的建议,我将非常感激。
对于我的公式测试,我一直在使用这些简单的值:
行:
l = (0 , 0) + s * (10, 10)
广场的要点:
A (5, 5)
B (6, 5)
C (6, 6)
D (5, 6)
编辑:
使用我标记为答案的回复功能,我让它开始工作。我遇到的一个问题是获取函数的正确输入。变量 a、b 和 c。这就是我最终得到它们的方式:
var a = 1 / x2
var b = -(1 / y2)
var c = y1/y2 - x1/x2
这里有一个关于如何解决这个问题的想法。
首先,通过正方形的直线在坐标系中是什么意思?
直线 L 穿过正方形 ABCD 当且仅当 L 将 ABCD 上的对角线分开 (A&C或 B&D)。现在问题简化为检查两个给定点是否由给定线分隔。
设直线L的方程为ax + by + c = 0。定义一个函数f(x,y) = ax + by + c。如果 f(x1,y1) 和 f(x2,y2) 符号相反,则点 A=(x1,y1) 和 C=(x2,y2) 由线 L 分隔。此外,如果它们具有相同的符号,则表示点位于直线的同一侧。
这是上述想法的 Python 代码:
# Function to check if two points
# lie on the opposite side of the line
def pointsAreOnOppositeSideOfLine(a, b, c, x1, y1, x2, y2):
fx1 = 0 # Variable to store a * x1 + b * y1 - c
fx2 = 0 # Variable to store a * x2 + b * y2 - c
fx1 = a * x1 + b * y1 - c
fx2 = a * x2 + b * y2 - c
# If fx1 and fx2 have same sign
if ((fx1 * fx2) <= 0):
return True
return False
我目前正在尝试编写一个程序来确定一条线是否穿过 4 点正方形的区域,并且我正在寻找一个公式。我只找到了带有向量的 3 维平面的解决方案,并试图通过用笔和纸计算将它们应用到我的情况,但当需要第三个值时,我似乎总是陷入死胡同。
我认为最好的方法是计算直线到正方形的距离。如果它显然通过(它的一部分),那将是 0。但我似乎找不到 google 和堆栈溢出搜索的正确词,因为这似乎太基础了,以前没有人回答过。
如果有人有 link 或关于如何计算的建议,我将非常感激。
对于我的公式测试,我一直在使用这些简单的值:
行:
l = (0 , 0) + s * (10, 10)
广场的要点:
A (5, 5)
B (6, 5)
C (6, 6)
D (5, 6)
编辑: 使用我标记为答案的回复功能,我让它开始工作。我遇到的一个问题是获取函数的正确输入。变量 a、b 和 c。这就是我最终得到它们的方式:
var a = 1 / x2
var b = -(1 / y2)
var c = y1/y2 - x1/x2
这里有一个关于如何解决这个问题的想法。
首先,通过正方形的直线在坐标系中是什么意思?
直线 L 穿过正方形 ABCD 当且仅当 L 将 ABCD 上的对角线分开 (A&C或 B&D)。现在问题简化为检查两个给定点是否由给定线分隔。
设直线L的方程为ax + by + c = 0。定义一个函数f(x,y) = ax + by + c。如果 f(x1,y1) 和 f(x2,y2) 符号相反,则点 A=(x1,y1) 和 C=(x2,y2) 由线 L 分隔。此外,如果它们具有相同的符号,则表示点位于直线的同一侧。
这是上述想法的 Python 代码:
# Function to check if two points
# lie on the opposite side of the line
def pointsAreOnOppositeSideOfLine(a, b, c, x1, y1, x2, y2):
fx1 = 0 # Variable to store a * x1 + b * y1 - c
fx2 = 0 # Variable to store a * x2 + b * y2 - c
fx1 = a * x1 + b * y1 - c
fx2 = a * x2 + b * y2 - c
# If fx1 and fx2 have same sign
if ((fx1 * fx2) <= 0):
return True
return False