2012-07-30 100 views
0

假设一个左上角单元格为(0,0)的二维网格。选取任意两个点/坐标,并在每个坐标上绘制对角线和反对角线。它们可以在网格内部或外部相交。C中二维平面上对角线的交点相交#

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

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

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

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

enter image description here

+1

闻起来像功课吗? :) – 2012-07-30 18:15:34

+0

@Trikks:这不是作业。它正在努力解决这个问题。这是一个生产应用程序。 – 2012-07-30 18:38:09

回答

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

+1。在每个交叉点周围绘制200x200的小方格可能会更加明显。 – 2012-07-30 18:23:08

+0

谢谢。我的几何是生锈的。我不知道斜边和Abs(宽度 - 高度)之间的关系。这个校长有一个名字吗? – 2012-07-30 18:42:23

+1

@RaheelKhan:不,只是右上角和左下角的灰色三角形是90-45-45,所以他们的两条短边长度是相同的。所以剩余的矩形边界线段必须是长边和短边的差值。 – 2012-07-30 18:44:11

0

这只是数学。你有两条线,方程式

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) 

替代品kb = y1-k*x1,你会得到你需要计算碰撞的精确点的所有值。