Найти линию, пересекающую известную линию под прямым углом, учитывая точку - PullRequest
7 голосов
/ 09 июля 2011

Это базовая графическая геометрия и / или триг, и я чувствую себя глупо, когда спрашиваю об этом, но я не могу вспомнить, как это происходит.Итак:

  1. У меня есть линия, определяемая двумя точками (x1, y1) и (x2, y2).
  2. У меня есть третья точка (xp, yp), которая где-то лежитelse.

Я хочу вычислить точку (x ', y'), которая лежит где-то вдоль линии в # 1, так что при соединении с точкой из # 2 создается новый перпендикулярстрока на первую строку.enter image description here

Спасибо.

Ответы [ 5 ]

7 голосов
/ 09 июля 2011

Полезное эмпирическое правило в этом виде вычислительной геометрии заключается в том, что вы должны работать с векторами как можно дольше, переключаясь на декартовы координаты только в качестве крайней меры. Итак, давайте решим это с помощью векторной алгебры. Предположим, что ваша линия идет от p до p + r , а другая точка равна q .

Теперь любая точка на линии, включая точку, которую вы пытаетесь найти (назовите ее s ), может быть выражена как s = p + Λ r для скалярного параметра λ.

Теперь вектор от q до s должен быть перпендикулярен r . Поэтому

( q - ( p + λ r )) · r = 0

Где · является оператором точечного произведения . Разверните товар:

( q - p ) · r = λ ( r · r )

И разделить:

λ = ( q - p ) · r / r · r

Когда вы приступите к его реализации, вам нужно проверить, не r · r = 0, чтобы избежать деления на ноль.

6 голосов
/ 09 июля 2011

Вы можете найти эту точку, рассматривая сначала общую точку (x, y) вдоль линии от (x1, y1) до (x2, y2):

x = x1 + t*(x2 - x1)
y = y1 + t*(y2 - y1)

и вычисление (квадрат) расстояния от этой точки из (xp, yp)

E = (x - xp)**2 + (y - yp)**2

, что подстановка определения x и y дает

E = (x1 + t*(x2 - x1) - xp)**2 +
    (y1 + t*(y2 - y1) - yp)**2

затем, чтобы найти минимум этого расстояния, изменяющегося t, мы получаем E относительно t

dE/dt = 2*(x1 + t*(x2 - x1) - xp)*(x2 - x1) +
        2*(y1 + t*(y2 - y1) - yp)*(y2 - y1)

, что после некоторого вычисления дает

dE/dt = 2*((x1 - xp)*(x2 - x1) + (y1 - yp)*(y2 - y1) +
           t*((x2 - x1)**2 + (y1 - y2)**2))

ища, когда эта производная равна нулю, мы получаем явное уравнение для t

t = ((xp - x1)*(x2 - x1) + (yp - y1)*(y2 - y1)) /
    ((x2 - x1)**2 + (y2 - y1)**2)

, поэтому конечная точка может быть вычислена с использованием этого значения для t в определении (x, y).

Используя векторную запись, это точно та же формула, которую предложил Гарет ...

t = <p - p1, p2 - p1> / <p2 - p1, p2 - p1>

, где обозначение <a, b> представляет операцию точечного произведения ax*bx + ay*by.

Обратите внимание, что та же самая формула работает в n-мерном пространстве.

1 голос
/ 18 сентября 2018

Для всех тех бедных душ, которые ищут конкретный пример, используя векторы ... здесь я опираюсь на ответ Гарета.

У вас есть вектор от p до r (от 0,0 до 50, -50)и еще одна точка, q, которая находится в (50, 0).Прямоугольное пересечение q и вектора от p до r равно {x: 25. y: -25} и определяется следующим кодом.

const p = [0, 0];
const r = [50, -50];
const q = [50, 0];
const l = math.add(p, r);
const m = math.dot(math.subtract(q, p), r) / math.dot(r, r);

console.log('intersecting point',  math.multiply(l, m));
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/5.1.2/math.js"></script>
1 голос
/ 09 июля 2011

Строка ответа:

y=ax+b
where a=(x1-x2)/(y2-y1)
      b=yp-(x1-x2)*xp/(y2-y1)

Как был получен результат:

1) slope for the original line:   (y2-y1)/(x2-x1)

2) slope for the answer: -1/((y2-y1)/(x2-x1)) = (x1-x2)/(y2-y1)

3) Plug this into (xp,yp) we can have the result line.

Просто посчитайте ответ по строкам после этого (это слишком долго ... Я голоден).

0 голосов
/ 09 июля 2011

Вы можете решить наклон линии, соединяющей (x1, y1) и (x2, y2).Затем вы узнаете, что перпендикулярная линия имеет наклон, обратный отрицательному значению этого значения.

Чтобы найти y-пересечение, используйте наклон, чтобы увидеть, как далеко линия проходит в y от x=0 до x1.

b + (x1 - x0) * m = y1
b + (x1 -  0) * m = y1
b + (x1 * m)      = y1
b = y1 - x1 * m

Затем вы можете получить формулы для линии между вашими двумя точками и линией от (xp, yp) с указанным выше наклоном.Для заданного x они имеют равные y, поэтому вы можете решить для этого x, а затем вставить это в любую формулу для y.

m = slope_from_1_to_2  = (y2 - y1) / (x2 - x1)
n = slopePerpendicular = (-1) / m

b = intercept_for_1_to_2 = y1 - x1 * m
c = intercept_for_p      = yp - xp * n

Таким образом, уравнения для линий имеют видФорма y = mx + b

Точки 1 и 2:

y(x) = mx + b

Точка р:

y(x) = nx + c

Установить ихy равно, чтобы найти x '

mx' + b = nx' + c
(m-n)x' = c - b
     x' = (c - b) / (m - n)

И, таким образом, использовать любую формулу для вычисления y'

y' = mx' + b

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