Найти точку, где высота встречается с основанием (Python) - PullRequest
0 голосов
/ 19 марта 2019

Учитывая только координаты вершин острого треугольника, как я могу эффективно и быстро найти координаты точки, в которой высота от конкретной вершины встречается с противоположным основанием?

Было бы невероятно полезным решение, использующее только математику, numpy или scipy.

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Необходимая точка - это ортогональная проекция точки вершины (скажем, вершины C) на линию, содержащую противоположную сторону (скажем, AB).

enter image description here

Чтобы найти точку проекции, получите векторы для AB и AC

 AB = (B - A)    //in coordinates ab.x = b.x-a.x, ab.y = b.y-a.y
 AC = (C - A)

и найдите параметр, используя скалярное произведение AB и AC

t =(AB * AC) / (AB * AB) 
t =((b.x-a.x)*(c.x-a.x) + (b.y-a.y)*(c.y-a.y)) / ((b.x-a.x)*(b.x-a.x) + (b.y-a.y)*(b.y-a.y))

Координаты проекционной точки

 P = A + AB * t
 p.x = a.x + (b.x-a.x) * t
 p.y = a.y + (b.y-a.y) * t

Вот и все

def orthoProjection(ax, ay, bx, by, cx, cy):
    abx = bx - ax
    aby = by - ay
    acx = cx - ax
    acy = cy - ay
    t = (abx * acx + aby * acy) / (abx * abx + aby * aby)
    px = ax + t * abx
    py = ay + t * aby
    return px, py

print(orthoProjection(0, 0, 4, 4, -1, 5))
>>(2.0, 2.0)
1 голос
/ 19 марта 2019

Рассмотрим треугольник с вершинами в точках A, B и C, и вы хотите найти, где высота, проходящая от вершины C, пересекает линию AB.

Итак, сначала вы можете определить уравнение для линии AB. У вас есть точки A и B (Ax, Ay; и Bx, By). Учитывая, что вы можете рассчитать slope_AB как (By-Ay)/(Bx-Ax).

Теперь формат линии - Y = MX+B, где M - только что вычисленный наклон, а B - точка пересечения Y, поэтому: Y_intercept_AB = Ay - slope_AB * Ax. Таким образом, уравнение для AB составляет Y = slope_AB*X + Y_intercept_AB.

ОК, так что теперь наклон высоты от C до места, где она пересекает линию AB (назовем эту точку D и линию CD высоты), является отрицательной обратной величиной наклона AB; так slope_CD = -(1/slope_AB).

Так что теперь, учитывая, что у вас есть одна точка (C) на линии CD и ее наклон, вы можете получить уравнение для CD так же, как вы делали для AB. Сначала найдите его Y-точку: Y_intercept_CD = Cy - slope_CD * Cx

Итак, уравнение для CD: Y = slope_CD * X + Y_intercept_CD.

Итак, теперь у вас есть уравнения для линии AB и строки CD:

Y = slope_AB * X + Y_intercept_AB
Y = slope_CD * X + Y_intercept_CD

И ваша проблема упрощена, чтобы найти, где эти линии пересекаются, то есть точка D.

Из приведенных выше уравнений, поскольку обе правые части равны Y, мы можем установить их равными друг другу:

slope_AB * X + Y_intercept_AB = slope_CD * X + Y_intercept_CD

и теперь это просто вопрос решения для X.

slope_AB * X - slope_CD*X = Y_intercept_CD - Y_intercept_AB 
(slope_AB - slope_CD)*X = Y_intercept_CD - Y_intercept_AB
X = (Y_intercept_CD - Y_intercept_AB)/(slope_AB - slope_CD)

Это даст вам значение X для D (Dx). Для значения Y используйте любое уравнение линии. Давайте использовать один для AB:

Dy = slope_AB * Dx + Y_intercept_AB

Собрав все воедино, предположим, что треугольник равен A=(-4, 2), B=(0, 6), C=(6, -4):

#Points A, B,C:
Ax = -4; Ay = 2
Bx =  0; By = 6
Cx =  6; Cy = -4

#Line AB:
slope_AB = (By - Ay)/(Bx - Ax)
Y_intercept_AB = Ay - slope_AB*Ax
print("AB: slope: %s, intercept: %s" % (slope_AB, Y_intercept_AB))

#Line CD:
slope_CD = -(1/slope_AB)
Y_intercept_CD = Cy - slope_CD*Cx
print("CD: slope: %s, intercept: %s" % (slope_CD, Y_intercept_CD))

#Find the intersection of the two lines AB & CD:
Dx = (Y_intercept_CD - Y_intercept_AB)/(slope_AB - slope_CD)
Dy = slope_AB*Dx + Y_intercept_AB
print("Intersection at (%s, %s)" % (Dx, Dy))

Печать:

AB: slope: 1.0, intercept: 6.0
CD: slope: -1.0, intercept: 2.0
Intersection at (-2.0, 4.0)

Еще одна вещь: это делит на ноль и завершится ошибкой, когда точки A и B имеют одинаковое значение X (потому что оно делится на Ax-Bx, что будет равно нулю); но это начало.

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