2次元と3次元の簡単な幾何学#

平面における直線の方程式#

  1. あるベクトルaに対して平行な直線

  2. あるベクトルaに対して垂直な直線

という2つの方法がある

ベクトルaに平行な直線#

Pを通って、ベクトルa(0)に平行な直線をlとすれば、点Xl上にあることは、ベクトルPXaに並行であること、すなわち

PX=ta

となるような実数tが存在することと同等である。

P,Xの位置ベクトルをそれぞれp,xとすれば、PX=ta

xp=ta

あるいは

x=p+ta

と書き直すことができる。tがあらゆる実数値をとれば、Xl上のあらゆる位置を取る。

x=p+ta を、tを媒介変数とする直線lベクトル方程式 といい、al方向ベクトル という。

通常のように ベクトルを成分表示して a=(a,b),p=(x0,y0),x=(x,y) とすれば x=p+ta

(x,y)=(x0,y0)+t(a,b)

すなわち

x=x0+ta,y=y0+tb

と表される。 これはべクトル方程式を座標を用いて書き表したものである。

なおa0 ではないから、 a,b の少なくとも一方は 0 ではない。

Hide code cell source
import numpy as np
import matplotlib.pyplot as plt

a = np.array([2, 1])
p = np.array([0, 1])
t = 2
x = p + t * a

fig, ax = plt.subplots(figsize=[4.5, 2.5], dpi=100)
o = [0, 0]
ax.arrow(*o, *a, color="darkorange")
ax.text(*a, "a", color="darkorange")

ax.scatter(*p, color="steelblue")
ax.text(*p, "p ", color="steelblue", ha="right")
ax.scatter(*x, color="steelblue")
ax.text(*x, "x ", color="steelblue", ha="right")

ax.arrow(*p, *(x - p), color="steelblue")
pos = p + (x - p) / 2
ax.text(*pos, r"$x = \vec{p} + t \vec{a}$", color="steelblue", ha="right")
ax.set(title=fr"line with $t={t}$, $a={a}$, $p={p}$")
fig.show()
../../_images/33e1a0f724eeb85a03387b5963d81c939252d1ffbcfcfbdae13ae439f31212b6.png

tを消去した直線の方程式#

媒介変数tを消去した形にすることもできる

x=x0+tabを掛けて、y=y0+tbaを掛けて、両者を差し引けば

bxay=bx0+btaay0atb=bx0ay0

α=b,β=a,γ=ay0bx0として

αx+βy+γ=0

2点を通る直線#

2点 A,B (ただしAB)を通る直線のべクトル方程式は

x=a+t(ba)

あるいは

x=(1t)a+tb

で与えられる

a=(3,5),b=(5,3)を通る直線の方程式を求める。

x=(1t)a+tb

より

x=(1t)(35)+t(53)
# 与えられた点
x1, y1 = 3, 5
x2, y2 = -5, -3

# 傾きmを計算
m = (y2 - y1) / (x2 - x1)

# 傾きを使用して点傾き形式の方程式を求める
# 点 (x1, y1) = (3, 5) を使用
m, y1 - m*x1
(1.0, 2.0)

ベクトルaに垂直な直線#

平面上の点Pを通り、0でないベクトルaに垂直な直線lを考える。

Xが直線l上にあるためには、ベクトルPXa垂直であることが必要かつ十分である。

PX=xpであるから、このことは

a(xp)=0 または ax=ap

a=(a,b),p=(x0,y0),x=(x,y) とおけば、

a(xx0)+b(yy0)=0 または ax+by=ax0+by0

と書かれる。ax0+by0は定数なのでcとおけば

ax+by=c

となる。

a=(a,b)のような直線に垂直なベクトルは 法ベクトル という。

空間における直線の方程式#

任意の点Aの位置ベクトルがベクトルa=OAとして定義される(Oは原点の座標)

P を 1 つの点とし, a0 でない 1 つのべクトルとする。 P を通って a に平行な直線 l のベクトル方程式は、 前と同様に

x=p+ta

によって与えられる。tを媒介変数、aを方向ベクトルという。

ベクトルを成分表示して a=(a,b,c),p=(x0,y0,z0),x=(x,y,z) とすれば、x=p+ta

x=x0+ta,y=y0+tb,z=z0+tc

と書くことができる

tの消去#

a,b,cのいずれも0でなければ

xx0a=yy0b=zz0c

としてtを消去できる。

そうでない場合、たとえばa=0,b0,c0の場合は

x=x0,yy0b=zz0c

とすればよい

空間における平面の方程式#

ベクトルaに垂直な平面#

所与の点P0でないベクトルaについて、Pをとおってaに垂直な1つの平面αが定められる

空間の点Xがその平面上にあるためには、ベクトルPX=xpa垂直であることが必要かつ十分であるから、 平面αの方程式は

a(xp)=0 または ax=ap

となる。

a=(a,b,c),p=(x0,y0,z0),x=(x,y,z) とおけば

a(xx0)+b(yy0)+c(zz0)=0

となり、定数ax0+by0+cz0d とおけば

ax+by+cz=d

(3,1,2) を通り、 ベクトル (2,4,5) に垂直な平面の方程式を求めたいとする。

ax+by+cz=ax0+by0+cz0

なので

2x+4y5z=6+410

よって

2x+4y5z=12

垂直なベクトルをどう求めるか#

法線ベクトルを求める

3点を通る平面#

空間の平面は空間上の異なる3点で決まる。これらをP(p1,p2,p3),P(p1,p2,p3),P(p1,p2,p3)とすると

平面上の点X(x1,x2,x3)はパラメータs,tRを用いて

OX=OP+sPP+tPP

と書くことができる(平面のパラメータ表示)

Pを通りa,bR3の2方向に張られた平面Π

Π={OP+sa+tbs,tR}=OP+Ra+Rb

が考えられる。Π

OX=OP+sa+tb(s,tR)

と書ける点Xの全体である。

import matplotlib.pyplot as plt
import numpy as np

o = np.array([0, 0])
p = np.array([1, 1])
a = np.array([0, 2])
b = np.array([2, 0])
x = p + a + b

fig, ax = plt.subplots()
arrow_cfg = dict(width=0.01, color="black", length_includes_head=True)
ax.arrow(*o, *a, **arrow_cfg)
ax.arrow(*o, *b, **arrow_cfg)

ax.scatter(*x)
<matplotlib.collections.PathCollection at 0x7f4521f66170>
../../_images/cd3b80181a4fafbd1fd1e711812d3bb3b1ce60b28ed09ee8ad855ca690a44b56.png
import matplotlib.pyplot as plt
import numpy as np

o = np.array([0, 0])
p = np.array([1, 1])
a = np.array([0, 2])
b = np.array([2, 0])
x = p + a + b

fig, ax = plt.subplots()
arrow_cfg = dict(width=0.01, color="black", length_includes_head=True)
ax.arrow(*o, *a, **arrow_cfg)
ax.arrow(*o, *b, **arrow_cfg)

ax.scatter(*x)
<matplotlib.collections.PathCollection at 0x7f4521df9090>
../../_images/cd3b80181a4fafbd1fd1e711812d3bb3b1ce60b28ed09ee8ad855ca690a44b56.png
a=(a1,a2,a3)Tb=(b1,b2,b3)T

とすると

OX=OP+sa+tb{x1p1=sa1+tb1x2p2=sa2+tb2x3p3=sa3+tb3

となるので、この連立1次方程式を解く。

第1,2式を行列表記すると

[a1b1a2b2][st]=[x1p1x2p2]

なので

[st]=[a1b1a2b2]1[x1p1x2p2]

となるので、第2,3式に代入すれば、Δ12:=a1b2a2b10 の下に

[x2p2x3p3]=[a2b2a3b3][a1b1a2b2]1[x1p1x2p2]=1Δ12[a2b2a3b3][b2b1a2a1][x1p1x2p2]=1Δ12[0a1b2a2b1a3b2a2b3a1b3a3b1][x1p1x2p2]

この第2成分は

x3p3=a3b2a2b3Δ12(x1p1)+a1b3a3b1Δ12(x2p2)

となり、

Δ12(x3p3)=a3b2a2b3(x1p1)+a1b3a3b1(x2p2)

つまり

|a2b2a3b3|(x1p1)+|a3b3a1b1|(x2p2)|a1b1a2b2|(x3p3)=0

なので

[λ,μ,ν]=[|a2b2a3b3|,|a3b3a1b1|,|a1b1a2b2|]

をつかって

[λ,μ,ν][x1p1x2p2x3p3]=0

と表すことができる

ベクトル積で表す平面の方程式#

[λ,μ,ν][x1p1x2p2x3p3]=0

[λ,μ,ν]はベクトル積(外積)a×bであるため、

平面の方程式は、外積と内積を使って

(a×b)(xp)=0

と書くことができる

(法線ベクトルaを 外積 a×bで求める)

ベクトル積は以下のように(形式的に)書くことができる

a×b=|a1b1e1a2b2e2a3b3e3|=|abe|

そのため、(xp)との内積をとるということは、expで置き換えた行列に対する行列式

(a×b)(xp)=|abxp|

ということになる