Proc 59. Используя функции Leng и Area из заданий Proc56 и Proc58, описать функцию \(\text{Dist}(x_P, y_P, x_A, y_A, x_B, y_B)\) вещественного типа, находящую расстояние D(P, AB) от точки P до прямой AB по формуле

\[D(P, AB) = 2\cdot S_{PAB} / |AB|,\]

где \(S_{PAB}\) - площадь треугольника PAB. С помощью этой функции найти расстояния от точки P до прямых AB, AC, BC, если даны координаты точек P, A, B, C.

Решение на Python 3

import math
import numpy as np
import random

def Leng(xA, yA, xB, yB):
d = math.sqrt((xA - xB)**2 + (yA - yB)**2)
return d

def Perim(xA, yA, xB, yB, xC, yC):
d_AB = Leng(xA, yA, xB, yB)
d_AC = Leng(xA, yA, xC, yC)
d_BC = Leng(xB, yB, xC, yC)
return d_AB + d_AC + d_BC

def Area(xA, yA, xB, yB, xC, yC):
d_AB = Leng(xA, yA, xB, yB)
d_AC = Leng(xA, yA, xC, yC)
d_BC = Leng(xB, yB, xC, yC)
p = Perim(xA, yA, xB, yB, xC, yC) / 2
S = math.sqrt(p*(p-d_AB)*(p-d_AC)*(p-d_BC))
return S

def Dist(xP, yP, xA, yA, xB, yB):
S_PAB = Area(xA, yA, xB, yB, xP, yP)
d_AB = Leng(xA, yA, xB, yB)
d_P_AB = 2 * S_PAB / d_AB
return d_P_AB

x1,x2,x3,y1,y2,y3 = list(np.random.choice(range(-10, 11), 6))
##x1,x2,x3,y1,y2,y3 = [0,3,0,0,0,4]
while (x3-x1)*(y2-y1) == (y3-y1)*(x2-x1):
x1,x2,x3,y1,y2,y3 = list(np.random.choice(range(-10, 11), 6))
x4, y4 = random.sample(range(-10, 11), 2)

A_x = x1
A_y = y1
B_x = x2
B_y = y2
C_x = x3
C_y = y3
P_x = x4
P_y = y4

##A_x = 3
##A_y = 0
##B_x = 0
##B_y = 3
##P_x = 0
##P_y = 0

print("Точка A (x, y): ({0},{1})".format(A_x, A_y))
print("Точка B (x, y): ({0},{1})".format(B_x, B_y))
print("Точка P (x, y): ({0},{1})".format(P_x, P_y))
D = Dist(P_x, P_y, A_x, A_y, B_x, B_y)
print("Расстояние от P до AB: ", D)
print()

print("Точка A (x, y): ({0},{1})".format(A_x, A_y))
print("Точка C (x, y): ({0},{1})".format(C_x, C_y))
print("Точка P (x, y): ({0},{1})".format(P_x, P_y))
D = Dist(P_x, P_y, A_x, A_y, C_x, C_y)
print("Расстояние от P до AB: ", D)
print()

print("Точка B (x, y): ({0},{1})".format(B_x, B_y))
print("Точка C (x, y): ({0},{1})".format(C_x, C_y))
print("Точка P (x, y): ({0},{1})".format(P_x, P_y))
D = Dist(P_x, P_y, B_x, B_y, C_x, C_y)
print("Расстояние от P до BC: ", D)
print()