2011-03-07 97 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