Получить точку пересечения прямоугольника и линии - PullRequest
7 голосов
/ 07 марта 2011

Мне нужно получить точку пересечения прямоугольника и линии. У меня есть точка B внутри прямоугольника (центр прямоугольника) и точка A снаружи. И мне нужно найти точку C на одной из границ прямоугольника. Также я получаю ширину и высоту прямоугольника.

enter image description here

Все это будет WPF приложением, так что если будут какие-то встроенные функции, я буду очень рад.

Ответы [ 5 ]

3 голосов
/ 07 марта 2011

Не зная WPF или какой-либо из его функций, я бы так и сделал:

  1. Создайте временную точку D, которая создает прямой угол между B и C.
  2. Длина CD должна быть известна, так как B находится в центре прямоугольника. Следовательно, должно быть просто вычислить длину BD.
  3. Определите длину BC по sqrt ((BD) ^ 2 + (CD) ^ 2).
  4. Учитывая положение A, вы знаете, находится ли C до или после средней точки стороны прямоугольника. Следовательно, вы можете использовать длину BC, чтобы вычислить положение C на стороне.
3 голосов
/ 07 марта 2011

Это базовое математическое решение для пересечения линии с линией, ознакомьтесь с topcoder для учебника :

Пересечение Линия-Линия Один из самых общие задачи, которые вы найдете в геометрии проблемы пересечения линии. Несмотря на тот факт, что это так часто, много из кодеров все еще есть проблемы с этим. Первый вопрос: в какой форме мы дали наши строки, и в какой форме мы хотели бы их в? В идеале каждый наши линии будут в виде Ax + By = C, где A, B и C являются числа, которые определяют линию. Тем не менее, нам редко дают строки в этот формат, но мы можем легко генерировать такое уравнение из двух точки. Скажем, нам дают два разных точки, (x1, y1) и (x2, y2), и хочу найти A, B и C для уравнение выше. Мы можем сделать это путем настройка A = y2-y1 B = x1-x2 C = А * x1 + В * у1

2 голосов
/ 07 марта 2011

Решение для 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;
    }

Редактировать Найдено Ссылка на вопрос SO, откуда приходит ответ выше.

2 голосов
/ 07 марта 2011

С помощью 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))}}

(верхняя линия в качестве примера здесь).

А для Евгения этокак это выглядит на моем экране.Намного более читабельно.

prettier version of code

1 голос
/ 07 марта 2011

Если вы знаете размеры прямоугольника, что я предполагаю, что вы делаете "

  • rX ширина прямоугольника
  • rY высота прямоугольника
  • Ay Позиция Y's
  • Ax Позиция X's
  • By B's Y Position
  • Bx B's X Position
  • Cy C's Y Position
  • Cx C's X Position

Cy = By + rY / 2

Позиция C находится вверху прямоугольника, поэтому это позиция By + половина позиции rY

Тогда нам просто нужно вычислить Cx позицию.

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

Вы можете получить координаты X и Y для A и B, используя Point

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...