Найти точку на противоположном сайте другой точки - PullRequest
0 голосов
/ 13 сентября 2018

Учитывая две 2D точки (p1 и p2), мне нужно найти точку (p3), которая (с точки зрения p1) находится на другой стороне p2, и в то же время ей нужно иметь заданное расстояние до p2.

Это может выглядеть так с большим заданным расстоянием:

  ^
  |
  | p1      
  |         p2 
  |     
  |                         p3
<-|---------------------------->
  v

Или как с меньшим заданным расстоянием:

  ^
  |
  |
  |    p3
  |  p2   
  |p1
<-|---------------------------->
  v

Как я могу рассчитать этоpoint (p3)?

Мой язык выбора - JavaScript, но я не строго прошу об ответе JavaScript.Если вы можете объяснить это способом, который можно перевести в код, или если вы напишите псевдокод, это было бы просто замечательно.

Это была моя последняя попытка (очевидно, это не сработало):

calculate_point_on_other_side_of_p2(p1, p2, distance_p2_to_p3) {
    deltaX = p1.x-p2.x
    deltaY = p1.y-p2.y
    distance_p1_to_p2 = sqrt(deltaX*deltaX + deltaY*deltaY)
    if (deltaX < 0)
        p3.x = p2.x+distance_p2_to_p3 
    else
        p3.x = p1.x-distance_p2_to_p3

    if (deltaY < 0)
        p3.y = p2.y+distance_p2_to_p3
    else
        p3.y = p1.y-distance_p2_to_p3
    return p3
}

Ответы [ 4 ]

0 голосов
/ 13 сентября 2018

Это простая проблема, если вы понимаете, как работают 2D-векторы.

Рассчитать единичный вектор от p1 до p2:

(nx, ny) = ((p2x - p1x)*i + (p2y-p1y)*j)/sqrt((p2x-p1x)^2 + (p2y-p1y)^2)

Где i и j - единичные векторы в xи направления y соответственно.

Теперь вы можете рассчитать (p3x, p3y) на любом расстоянии d от p1:

(p3x, p3y) = (p1x, p1y) + (d*nx, d*ny)
0 голосов
/ 13 сентября 2018

Обратите внимание на знак минус, потому что дельты являются компонентами вектора от p2 до p1, но p2p3 является антиколлинеарным p2p1

calculate_point_on_other_side_of_p2(p1, p2, distance_p2_to_p3) {
    deltaX = p1.x-p2.x
    deltaY = p1.y-p2.y
    distance_p1_to_p2 = sqrt(deltaX*deltaX + deltaY*deltaY)
    scale = distance_p2_to_p3 / distance_p1_to_p2 
    p3.x = p2.x - deltaX * scale
    p3.y = p2.y - deltaY * scale
    return p3
}
0 голосов
/ 13 сентября 2018

Давайте предположим, что все три строки в строке.Тогда наклон составляет deltaY/deltaX.Если p3 на x от p2 по горизонтали, то на deltaY/deltaX * x от p2 по вертикали.distance_p2_to_p3^2 = x^2 + (deltaY/deltaX * x)^2, решить для x.Затем добавьте / вычтите x из p2.x и добавьте deltaY/deltaX * x из p2.y.

0 голосов
/ 13 сентября 2018

Одна версия правильного алгоритма будет выглядеть следующим образом (это даже не псевдокод, но должно объяснять, что делать):

  • определить расстояние между p1 и p2 (используйте пифаг)
  • разделите заданное расстояние (distance_p2_to_p3) на
  • для каждой из координат x и y, добавьте deltaX (соответственно deltaY), умноженное на это соотношение
...