获取矩形和直线的交点

我需要获得矩形和直线的交点。 在矩形(矩形的中心)内有B点,在外面有A点。 我需要在一个矩形边框上找到C点。 我也得到了矩形的宽度和高度。

在此处输入图像描述

所有这些都将是WPF应用程序,所以如果任何构建function我将非常高兴。

这是基本的数学求解线 – 线交集,请查看topcoder以获得教程 :

线 – 线交点在几何问题中您将发现的最常见任务之一是线交叉。 尽管它很常见,但许多程序员仍然遇到麻烦。 第一个问题是,我们的线条是什么forms,我们喜欢它们的forms是什么? 理想情况下,我们的每一行都将采用Ax + By = C的forms,其中A,B和C是定义该行的数字。 但是,我们很少以这种格式给出线条,但我们可以从两点轻松生成这样的方程式。 假设我们给出两个不同的点,(x1,y1)和(x2,y2),并且想要找到上面等式的A,B和C. 我们可以通过设置A = y2-y1 B = x1-x2 C = A * x1 + B * y1来实现

在不知道WPF或其任何function的情况下,我就是这样做的:

  1. 创建一个临时点D,在B和C之间创建一个直角。
  2. 应该知道CD的长度,因为B位于矩形的中心。 因此,计算BD的长度应该很简单。
  3. 通过sqrt((BD)^ 2 +(CD)^ 2)确定BC的长度。
  4. 给定A的位置,您知道C是在矩形边的中点之前还是之后。 因此,您可以使用BC的长度来计算侧面C的位置。

使用ax和ay坐标为A和bx,坐标为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来说,这就是它在我的屏幕上的样子。 相当多可读性。

更漂亮的代码版本

针对C#,WPF的解决方案:

  ///  /// Get Intersection point ///  /// a1 is line1 start /// a2 is line1 end /// b1 is line2 start /// b2 is line2 end ///  public static Vector? Intersects(Vector a1, Vector a2, Vector b1, Vector b2) { Vector b = a2 - a1; Vector d = b2 - b1; var bDotDPerp = bX * dY - bY * dX; // 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 = (cX * dY - cY * dX) / bDotDPerp; if (t < 0 || t > 1) { return null; } var u = (cX * bY - cY * bX) / bDotDPerp; if (u < 0 || u > 1) { return null; } return a1 + t * b; } 

编辑发现链接到SO问题,上面的答案来自。

如果你知道矩形的尺寸,我假设你做“

  • rX矩形宽度
  • rY矩形高度
  • Ay A的Y位置
  • Ax A的X位置
  • By B的Y位置
  • Bx B的X位置
  • Cy C的Y位置
  • Cx C的X位置

Cy = By + rY / 2

C位置位于矩形的顶部,因此它是By位置+ rY位置的一半

然后我们只需要计算Cx位置。

Cx = (Bx + ((Ax - Bx) / (Ay - By)) * Cy)

您可以使用Point获取A和B的X和Y Coordiantes