Soit la droite d'équation:
\begin{equation}
y = a * x + b
\end{equation}
avec comme coefficient directeur a = -2.5 et d'ordonnée à l'origine b = 5.0 (en bleu sur la figure). L'objectif est de trouver le coefficient directeur $a'$ de la droite perpendiculaire à celle-ci (en orange sur la figure).
Pour simplifier les calculs prenons la droite perpendiculaire avec la même ordonnée à l'origine:
\begin{equation}
y' = a' * x + b
\end{equation}
Soit les points $A=(0,b)$, $B=(x,y)$ et $C=(x,y')$. Alors les deux droites sont perpendiculaires si le produit scalaire suivant est égale à 0:
\begin{equation}
\vec{AB}*\vec{AC} = 0
\end{equation}
que l'on peut écrire comme
\begin{equation}
\left( \begin{array}{c}
x \\
y - b
\end{array}\right)
*
\left( \begin{array}{c}
x \\
y' - b
\end{array}\right)
=0
\end{equation}
en utilisant les équations (1) et (2):
\begin{equation}
\left( \begin{array}{c}
x \\
ax
\end{array}\right)
*
\left( \begin{array}{c}
x \\
a'x
\end{array}\right)
=0
\end{equation}
le produit scalaire donne:
\begin{equation}
x^2 + a * a' * x^2=0
\end{equation}
ou
\begin{equation}
a * a' * x^2= - x^2
\end{equation}
Finalement on trouve:
\begin{equation}
\boxed{a' = \frac{- 1}{a}}
\end{equation}
Dans notre exemple $a'= -1 / (- 2.5) = 0.4 $
Code python pour tracer les deux figures ci-dessus:
import numpy as np
import matplotlib.pyplot as plt
x_min,x_max = -10.0, 10.0
y_min,y_max = -10.0, 10.0
slope = - 2.5
intercept = 5.0
x = np.linspace(x_min, x_max, 100)
y = slope * x + intercept
fig = plt.figure()
ax = plt.gca()
ax.plot(x, y,linestyle='--')
slope_p = (-1.0 / slope)
y = slope_p * x + intercept
ax.plot(x, y,linestyle='--')
ax.set_aspect('equal')
ax.grid(True)
ax.spines['left'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['bottom'].set_position('zero')
ax.spines['top'].set_color('none')
plt.title('How to get the slope of \n the line perpendicular to another ?',fontsize=10)
plt.xlim(x_min,x_max)
plt.ylim(y_min,y_max)
plt.axvline(x=4.0,color='gray',linestyle='--')
plt.quiver([0.0,0.0],[intercept,intercept],[4.0,4.0],[slope * 4.0, slope_p * 4.0], angles='xy', scale_units='xy', scale=1)
plt.text(0.5,4.25, 'A', fontsize=14)
plt.text(3.0,-5.5, 'B', fontsize=14)
plt.text(4.5,7.55, 'C', fontsize=14)
plt.savefig("perpendicular_line_02.png",bbox_inches='tight')