C#中2d平面上对角线的线交点

时间:2012-07-30 18:11:00

标签: c# .net math 2d intersection

假设左上角单元格为(0,0)的2D网格。选择任意两个点/坐标,并在每个点上绘制对角线和反对角线。它们可能在网格内部或外部相交。

在附图中,红线是两点(300,200)和(700,800)的对角线。

如何找出对角线交点的坐标?另外,如果线的斜率为负,公式将如何不同?

我将在需要高度优化的算法中使用它,因此正确答案将是最快的计算方法。我不确定这是否可以在没有三角测量的情况下完成。

注意: 请记住,红线是真正的对角线/反对角线。换句话说,它们与矩形成45度角。这可能有助于或可能无助于选择比矢量计算更优化的公式。

enter image description here

2 个答案:

答案 0 :(得分:3)

D成为两个边长之间的差异。在你的图中,D=200。这是两个白色三角形(您的外部交叉点和矩形之间的斜边)的斜边长度。因此,这些三角形的边长为D/sqrt(2),因此外部交点的坐标与D/2的矩形角不同。

然后为你的图表,

(x1,y1) = 300-D/2, 200+D/2 = 200,300
(x2,y2) = 700+D/2, 800-D/2 = 800,700

您必须处理所有可能的方向(x1<x2x1>x2,...)但它们都与此对称。

答案 1 :(得分:0)

这只是数学。你有2行方程式

y1 = k1 * x1 + b1
y2 = k2 * x2 + b2
If they intersect then y1 == y2 and x1 = x2 so
k1 * x1 + b1 = k2 * x1 + b2
x1 = (b2 - b1) / (k1 - k2)

现在唯一的问题是如何找到k1,k2,b1,b2?简单!每行有2个点(来自graphics.DrawLine(x1,y1,x2,y2))。在这里使用它们。对于第一行:

y1 = k * x1 + b
y2 = k * x2 + b
b = y1 - k * x1
y2 = k * x2 + y1 - k * x1 = k * (x2-x1) + y1
so
k = (y2 - y1) / (x2 - x1)

k替换为b = y1-k*x1,您将获得计算确切碰撞点所需的所有值。