直線の方程式

## 基本形
傾きが $m$ で、点$(0,n)$ を通る直線の方程式は、
$$\bf y=mx+n$$
で表される。（ $y$ 切片が $n$ ）
$m=0$ のとき、$y=n$ となり、これは$x$軸に平行な直線を表す。
$y$ 軸に平行な直線（$x=p$ の形の直線）はこの形では表現できない。
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384860/e1c286f6-2296-eaf0-a94e-6d6a14c1eb35.png"> <img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384860/038be867-dd07-5f6a-7d6f-021ce1520b14.png"> <img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384860/5217844d-0b9f-d236-8015-17266947e5d5.png">

## 一般形
直線の方程式 $y=mx+n$ の右辺を左辺に移項してして整理すれば、
$mx-y+n=0$ となり、これは $x,y$ に関する一般的な形の１次方程式 
$$\bf ax+by+c=0 \ (a\neq 0 \ または \ b\neq0)$$
の形をしている。これが直線の方程式の一般形。

この形ならば、$y$軸に平行な直線も表現できる。
この形の欠点は、１つの直線の表現が一意に定まらない、つまり、
$3x-2y-4=0$ と $x-\frac{2}{3}y-\frac{4}{3}=0$ は同じ直線を表す。

この方程式は$x$と$y$ に関する１次方程式であるので、$x$と$y$ の係数 $a$と$b$ が同時に $0$ になることはない。
すなわち、$a=0,b=0$ となることはない。

$a\neq0,b\neq0$ のとき、$ax+by+c=0$ は、
$$y=-\frac{a}{b}x-\frac{c}{b}$$
と書き換えられるので、これは傾きが $-\dfrac{a}{b}$、$y$ 切片が$-\dfrac{c}{b}$の直線を表す。

$a\neq0,b=0$ のとき、$ax+by+c=0$ は、
$$x=-\frac{c}{a}$$
となる。これは、$y$ 軸に平行な直線を表す。

$a=0,b\neq0$ のとき、$ax+by+c=0$ は、
$$y=-\frac{c}{b}$$
となる。これは、$x$ 軸に平行な直線を表す。

また、
**直線 $ax+by+c=0$ において、係数の組 $(a,b)$ はこの直線の法線ベクトルの１つを表す。**
（[直線のベクトル方程式](https://qiita.com/tydesign/items/4ca98c407302762c42b9)　参照）

**【例】方程式 $3x-2y-4=0$ の表す図形を書く**
この式を変形すると、
$$ y=\frac{3}{2}x-2$$
となる。これは傾きが $-\dfrac{3}{2}$、$y$ 切片が$-2$の直線を表す。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384860/1380b1ae-87bd-0177-60ce-9c976e91ea62.png">

## 1点と傾きが与えられた直線
点$(x_1,y_1)$ を通り、傾きが $m$ の直線は、$y$ 切片を $n$ とすると、直線の方程式の標準形、
$$y=mx+n$$
で表すことができる。この直線が、点$(x_1,y_1)$ を通るので、
$y_1=mx_1+n$ すなわち、$n=y_1-mx_1$
これを元の標準形の式に代入すると、
$y=mx+y_1-mx_1$ となり、$y_1$ を左辺に移項して、右辺を$m$でくくると、
$$\bf y-y_1=m(x-x_1)$$
となる。これが点$(x_1,y_1)$ を通り、傾きが $m$ の直線の方程式です。
![直線の方程式_05_1点と傾き.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384860/abd0e3b2-357e-1129-90d6-ee937e603f43.png)

## 2点を通る直線
![直線の方程式_06_2点を通る.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384860/c1f17d4c-1dfe-f511-ad03-c937c53ca9bb.png)
2点 $P_1(x_1,y_1)$、$P_2(x_2,y_2)$ を通る直線は、
$x_1\neq x_2$ のとき、
この直線の傾きは、$\dfrac{y_2-y_1}{x_2-x_1}$ で点 $(x_1,y_1)$ を通るので、
1点と傾きが与えられた直線の式 $y-y_1=m(x-x_1)$ により、
$$\bf y-y_1=\dfrac{y_2-y_1}{x_2-x_1}(x-x_1)$$
となる。これが2点 $(x_1,y_1)$、$(x_2,y_2)$ を通る直線の方程式です。
この式は、$x_1=x_2$ の場合、右辺の分母が $0$ になるので成立しない。
したがって、$y$ 軸に平行な直線を表現できない。

この式を変形して、
(1) 右辺と左辺を入れ替える
$\dfrac{y_2-y_1}{x_2-x_1}(x-x_1)=y-y_1$

(2) 両辺に $(x_2-x_1)$ を掛ける
$(x-x_1)(y_2-y_1)=(x_2-x_1)(y-y_1)$

(3) 展開する
$xy_2-xy_1-x_1y_2+x_1y_1=x_2y-x_2y_1-x_1y+x_1y_1$

(4) 両辺に $x_1y_1$ があるので消す。左辺を$x$、右辺を$y$でくくる
$(y_2-y_1)x-x_1y_2=(x_2-x_1)y-x_2y_1$ 

この式の右辺を左辺に移項すると、
$$\bf (y_2-y_1)x-(x_2-x_1)y-(x_1y_2-x_2y_1)=0$$
となる。これも2点 $(x_1,y_1)$、$(x_2,y_2)$ を通る直線の方程式です。
さらに符号を$+$に変えて、
$$\bf (y_2-y_1)x+(x_1-x_2)y+(x_2y_1-x_1y_2)=0$$
この式は、直線の方程式の一般形 $ax+by+c=0$ の形をしている。

## 2点から直線の方程式を求めるプログラム
直線の方程式をプログラムで扱う場合は、正規化すると便利。

```scheme
;; 2点から直線の方程式を求める ax + by + c = 0
;; 点p1,p2 から 直線の方程式の係数 a , b , c のリストを返す
;; 2点間の距離(len)で割って正規化する
;;     Args - p1, p2 : 点のリスト
(defun line:GetEquation (p1 p2 / x1 y1 x2 y2 l)
    (setq x1 (car p1) y1 (cadr p1)
          x2 (car p2) y2 (cadr p2)
          len (distance p1 p2) ;; p1-p2の距離
    )
    (if (> len 1.0e-08)
        (mapcar
            (function
                (lambda (x) (/ x len))
	    )
	    (list (- y2 y1) (- x1 x2) (- (* x2 y1) (* x1 y2)))
        )
    )
)

;; < Example >
(line:GetEquation '(2 3) '(10 -1))
;; -> (-0.447214 -0.894427 3.57771)
(line:GetEquation '(2 3) '(10 5))
;; -> (0.242536 -0.970143 2.42536)
(line:GetEquation '(6 -2) '(4 2))
;; -> (0.894427 0.447214 -4.47214)
(line:GetEquation '(2 0) '(2 -9))
;; -> (-1.0 0.0 2.0)
```