$(x_1,y_1)$と$(x_2,y_2)$、$(x_3,y_3)$と$(x_4,y_4)$それぞれを通る直線を求め、それら2つの直線が交わる交点を求める。
点と直線の公式によると、$(x_1,y_1)$と$(x_2,y_2)$を通る直線は
\begin{eqnarray}
y-y_{1}&=&\frac{y_{2}-y_{1}}{x_{2}-x_{1}}\left(x-x_{1}\right)\\
y & =&\frac{y_{2}-y_{1}}{x_{2}-x_{1}}\left(x-x_{1}\right)+y_{1}\\
&=&\frac{y_{2}-y_{1}}{x_{2}-x_{1}}x+\left(y_{1}-\frac{y_{2}-y_{1}}{x_{2}-x_{1}}x_{1}\right)
\end{eqnarray}
同様に、$(x_3,y_3)$と$(x_4,y_4)$を通る直線は
\begin{eqnarray}
y=\frac{y_{4}-y_{3}}{x_{4}-x_{3}}x+\left(y_{3}-\frac{y_{4}-y_{3}}{x_{4}-x_{3}}x_{3}\right)
\end{eqnarray}
同様に2本の直線$y=ax+b$と$y=cx+d$は$a\neq c$のとき交点を一つ持つ。その座標は、連立方程式を求めると、
$x$に関しては
\begin{eqnarray}
ax+b&=&cx+d\\
\left(a-c\right)x&=&d-b\\
x&=&\frac{d-b}{a-c}
\end{eqnarray}
$y$に関しては
\begin{eqnarray}
y &=& a\frac{d-b}{a-c}+b\\
&=& \frac{a\left(d-b\right)+b\left(a-c\right)}{a-c}\\
&=& \frac{ad-ab+ab-bc}{a-c}\\
&=& \frac{ad-bc}{a-c}\\
\end{eqnarray}
従って、
\left(\frac{d-b}{a-c},\frac{ad-bc}{a-c}\right)
である。
例として、
\begin{eqnarray}
(x_1,y_1)&=&(4,11),\\
(x_2,y_2)&=&(2,7),\\
(x_3,y_3)&=&(3,11),\\
(x_4,y_4)&=&(1,1).
\end{eqnarray}
とし、以下のスクリプトにより交点を求める。
from numpy import *
p1 = array([4, 11])
p2 = array([2, 7])
p3 = array([3, 11])
p4 = array([1, 1])
def getIntersection(p1, p2, p3, p4):
a = (p2[1] - p1[1]) / (p2[0] - p1[0])
b = p1[1] - a * p1[0]
c = (p4[1] - p3[1]) / (p4[0] - p3[0])
d = p3[1] - c * p3[0]
print("a={:.2f}, b={:.2f}, c={:.2f}, d={:.2f}".format(a, b, c, d))
return (d-b)/(a-c), (a*d-b*c)/(a-c)
print("intersec. point is ({:.4f},{:.4f})".format(*getIntersection(p1,p2,p3,p4)))
結果:
a=2.00, b=3.00, c=5.00, d=-4.00
intersec. point is (2.3333,7.6667)
となり、$y=2x+3$と$y=5x-4$の交点は$(2.3333,7.6667)$であることが分かる。