我需要得到矩形和线的交点。 我有矩形内的点B(矩形的中心),并有点A在外面。我需要在矩形边框上找到C点。 另外我得到矩形的宽度和高度。获取矩形和线的交点
这一切都将是WPF应用,因此,如果在功能的任何构建我会很高兴。
我需要得到矩形和线的交点。 我有矩形内的点B(矩形的中心),并有点A在外面。我需要在矩形边框上找到C点。 另外我得到矩形的宽度和高度。获取矩形和线的交点
这一切都将是WPF应用,因此,如果在功能的任何构建我会很高兴。
解C#,WPF:
/// <summary>
/// Get Intersection point
/// </summary>
/// <param name="a1">a1 is line1 start</param>
/// <param name="a2">a2 is line1 end</param>
/// <param name="b1">b1 is line2 start</param>
/// <param name="b2">b2 is line2 end</param>
/// <returns></returns>
public static Vector? Intersects(Vector a1, Vector a2, Vector b1, Vector b2)
{
Vector b = a2 - a1;
Vector d = b2 - b1;
var bDotDPerp = b.X * d.Y - b.Y * d.X;
// if b dot d == 0, it means the lines are parallel so have infinite intersection points
if (bDotDPerp == 0)
return null;
Vector c = b1 - a1;
var t = (c.X * d.Y - c.Y * d.X)/bDotDPerp;
if (t < 0 || t > 1)
{
return null;
}
var u = (c.X * b.Y - c.Y * b.X)/bDotDPerp;
if (u < 0 || u > 1)
{
return null;
}
return a1 + t * b;
}
编辑 实测值Link到SO问题,其中上面的答案的来源。
这是基本的数学求解交线,检查出TopCoder公司的tutorial:
交线一个最 常见的任务,你会发现几何问题 是线的交点。尽管 这个事实非常普遍,很多编码器仍然遇到问题。 第一个问题是,我们给出了哪些形式的 以及我们喜欢他们的 ?理想情况下,我们线路的每个 将采用 Ax + By = C的形式,其中A,B和C是定义线路的 数字。 但是,我们很少给出这种格式的 中的行,但是我们可以很容易地从 两个 点产生这样一个方程式。假设我们给出两个不同的 点,(x1,y1)和(x2,y2)以及 想要找到上面的 等式的A,B和C.我们可以通过 这么做设置A = Y2-Y1 B = X1-X2 C = A * X1 + B * Y1
这应该比我的方法快得多。 +1 – 2011-03-07 15:58:59
该公式毫无意义。 A,B和C应该都是点并且产生单个值。 – msarchet 2011-03-07 16:05:18
@msarchet:这只是算法的一部分,A,B和C在教程中的含义不同于问题中的含义。 – 2011-03-07 16:11:30
不知道WPF,或任何其功能,这是我会怎么做:
如果你知道矩形的尺寸,我假设你做”
rX
矩形宽度rY
矩形高度Ay
A的Y位置Ax
A的X位置By
B的Y位置Bx
B的X位置Cy
C'S Y位置Cx
C'S X位置Cy = By + rY/2
C位置是在矩形的顶部,所以它是通过位置+一半的位置
然后我们只需要计算Cx
的位置。
Cx = (Bx + ((Ax - Bx)/(Ay - By)) * Cy)
您可以通过使用Point
用斧头和y A的坐标,BX,由B的坐标,并假设得到X和Y Coordiantes A和B与宽度w和高度h的矩形的中心是在{0,0}的以下应根据用于四个线的交点构成的三角形
的解决方案的工作IntersectionRectangleLine[{ax_, ay_}, {bx_, by_}, h_, w_] :=
Module[{\[Mu]r, \[Mu]l, \[Mu]t, \[Mu]b},
{\[Mu]r, \[Mu]l, \[Mu]t, \[Mu]b} = {-((-2 ay bx + 2 ax by - ax w +
bx w)/((ay - by) h)), -((-2 ay bx + 2 ax by + ax w -
bx w)/((ay - by) h)), -((
2 ay bx - 2 ax by - ay h + by h)/((ax - bx) w)), -((
2 ay bx - 2 ax by + ay h - by h)/((ax - bx) w))};
Which[
-1 <= \[Mu]r <= 1, {0, w/2} + \[Mu]r {h/2, 0},
-1 <= \[Mu]l <= 1, {0, -w/2} + \[Mu]l {h/2, 0},
-1 <= \[Mu]t <= 1, {h/2, 0} + \[Mu]t {0, w/2},
-1 <= \[Mu]b <= 1, {-h/2, 0} + \[Mu]b {0, w/2}
]
]
这
In[114]:= Solve[Thread[\[Lambda] ({bx, by} - {ax, ay}) + {ax, ay} == {0, w/2} + \[Mu] {h/2, 0}], \[Mu], {\[Lambda]}]
Out[114]= {{\[Mu] -> -((-2 ay bx + 2 ax by - ax w + bx w)/((ay - by) h))}}
(顶行在此处为示例)。
对于Evgeny来说,这是它在我的屏幕上的外观。相当多的可读性。
矩形只是4行。应用线/线相交测试4次。 – 2011-03-07 15:58:59
可能重复的[如何找到线和矩形之间的交点?](http://stackoverflow.com/questions/1585525/how-to-find-the-intersection-point-between-a-line-和 - 矩形) – Gajus 2015-08-19 18:18:43