2011-03-07 65 views
6

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

enter image description here

这一切都将是WPF应用,因此,如果在功能的任何构建我会很高兴。

+2

矩形只是4行。应用线/线相交测试4次。 – 2011-03-07 15:58:59

+0

可能重复的[如何找到线和矩形之间的交点?](http://stackoverflow.com/questions/1585525/how-to-find-the-intersection-point-between-a-line-和 - 矩形) – Gajus 2015-08-19 18:18:43

回答

2

解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问题,其中上面的答案的来源。

3

这是基本的数学求解交线,检查出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

这应该比我的方法快得多。 +1 – 2011-03-07 15:58:59

+1

该公式毫无意义。 A,B和C应该都是点并且产生单个值。 – msarchet 2011-03-07 16:05:18

+3

@msarchet:这只是算法的一部分,A,B和C在教程中的含义不同于问题中的含义。 – 2011-03-07 16:11:30

3

不知道WPF,或任何其功能,这是我会怎么做:

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

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

  • 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

2

用斧头和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来说,这是它在我的屏幕上的外观。相当多的可读性。

prettier version of code

+1

当我读到问题时,它被标记为Mathematica。此后已被删除。我猜Belisarius。我同意这不是一个Mathematica问题。 – 2011-03-07 16:33:58

+1

真是一团糟。这是什么语言? – Evgeny 2011-03-07 16:35:07

+0

对不起,如果一些标签的误解。对我来说mathematica是科学... – Evgeny 2011-03-07 16:36:19