HTML5テクニカルノート 平面上の2直線の交点を外積により求める
平面における2直線の交点は、直線の方程式を連立して解くことができます。ただ、その場合は傾きによる場合分けをしなければなりません。ふたつの直線をベクトルとして外積で考えると、一般的に交点が導けます。 01 ふたつの線分が交わる場合ふたつの線分を考えたとき、交点との関係は3つの場合に分けられます。第1に、ふたつの線分が直接交わる場合です。下図001のふたつの線分ACとBDは、互いに点Pで交わります。このとき、APとCPの比は、三角形ABDとCBDの面積の比に等しくなります。 図001■ふたつの線分が交わる場合 なぜなら、三角形AEPとCFPはつぎの理由により相似で、それぞれの高さAEとCFの比がAPとCPの比に等しいからです。ふたつの高さは、三角形ABDとCBDの高さでもあります。 ∠AEP = ∠CFP = 90° 三角形の2辺をベクトルとして外積を求めると、その大きさは2辺からなる平行四辺形の面積に等しくなります。したがって、その半分が三角形の面積です。3次元空間のベクトルAとBの外積はA×Bで表され、つぎのような新たなベクトルとして得られます(表001)。ふたつのベクトルAからBに回したとき右ネジが進む方向に定められるため、外積には交換法則が成り立ちません。 表001■外積で求められるベクトル
図002■ベクトルの外積 3次元空間のベクトルAとBの位置座標を、それぞれ(ax, ay, az)および(bx, by, bz)とすると、外積はつぎの式で定められます。 A×B = (aybz - azby, azbx - axbz, axby - aybx) 2次元平面で考えると、z座標値(azとbz)はつねに0です。したがって、A×B = (0, 0, axby - aybx)となります。そこで、2次元平面のベクトルA(ax, ay)とB(bx, by)の外積は、このz座標値で表します。ベクトルAに対してBが右ネジの位置、つまり時計回りにあるとき値は正になります。 A×B =axby - aybx 02 ふたつの線分が交わらない場合ふたつの線分が直接交わらない場合は、互いに直線として交点を求めます。すると第2に、どちらかの線分上で交わる場合があります(図003)。このときも前項01(図001)と同じく、三角形ABDとCBDの面積つまり高さの比が、線分APとCPの比に等しくなります。 図003■他の線分上で直線が交わる場合 残る第3は、ふたつの直線が互いの線分の外で交わる場合です(図004)。前のふたつと比べると、少しわかりづらいかもしれません。けれど、三角形AEPとCFPが相似になることは変わりません。 ∠AEP = ∠CFP = 90° APとCPの比は、ふたつの三角形ABDとCBDそれぞれの高さであるAEとCFの比に等しくなります。 図004■ふたつの直線がの線分の外で交わる場合 03 ベクトルの外積から面積比を求める以上3つの場合のいずれも、ふたつの三角形ABDとCBDの面積比から、直線ACとBDの交点Pが求められることを示しました。つぎに、実際に外積を使って比率を導きます。 三角形ABDとCBDの面積は、ベクトルBDとそれぞれベクトルAB、ならびにBCとの外積を2で割れば求められます。 △ABD = BD×AB / 2 ただし、通常面積は外積の絶対値を用います。けれど、ここではあえてそのままの値を使います。下図005のふたつの場合は、いずれも同じ(右ネジの)向きのベクトルから外積を求めているため、符号が同じですので、比率はつねに正になります。 AP / AC = (BD×AB / 2) / {(BD×AB / 2) + (BD×BC / 2)} = BD×AB / (BD×AB + BD×BC)図005■ふたつの外積の符号が同じ場合 ところが3つ目の場合は、ふたつの外積BD×ABとBD×BCの符号が逆になります。けれど、これがあえて外積の絶対値をとらなかった理由です。下図006では、外積BD×ABは右ネジと逆の半時計回りですので、負の値になります。それはつまり、交点PがACと逆方向の外分点であることを示すのです。したがって、前掲の比率を求める式は、この場合もそのまま使えます。 AP / AC = BD×AB / (BD×AB + BD×BC) 図006■ふたつの外積の符号が異なる場合 ただし、ふたつの直線ACとBDが平行になると交点はできません(図007)。このとき、三角形ABDとCBDの面積は等しく、ふたつの外積BD×ABとBD×BCの符号が逆になるので、つぎの等式が成立ちます。つまり、上記AP / ACの比率は分母が0になるため求まりません。 BD×AB + BD×BC = 0 図007■ふたつの直線が平行な場合 したがって、点AとCの座標をそれぞれ(ax, ay)および(cx, cy)とし、ふたつのベクトルの外積BD×ABとBD×BCについてBD×AB + BD×BC≠0のとき、AP / AC(= BD×AB / (BD×AB + BD×BC))の比率をkとすると、交点P(x, y)の座標はつぎのとおりです。 x = ax + k×(cx - ax) 04 ふたつの線分が交わるかどうかを調べるさらに外積を使って、ふたつの線分が直接交わるかどうか調べてみましょう。それは、前述の第1の場合でした(図008)。互いに交わるということは、ひとつのベクトル(BD)から見て、もうひとつのベクトルの両端(AとC)が左右別の側に分かれることを意味します。 図008■ふたつの線分が交わる場合 そこで、ひとつのベクトルの始点(B)から他のベクトルの両端(AとC)へのふたつのベクトル(BAとBC)を、新たに考えます。初めのベクトル(BD)から見て、ふたつのベクトル(BAとBC)は互いに逆回りの位置です。つまり、それぞれのベクトルと初めのベクトルとの外積を求めれば、互いに符号が逆になります。なお、ふたつの数値の符号が逆になることは、その積が負になることで確かめられます。 (BD×BA)(BD×BC) < 0 もっとも、ひとつの線分(BD)が短くてもうひとつ(AC)に届かない前述第2の場合(図005左)がありえます。そこで、もうひとつのベクトル(AC)からも同じようにふたつのベクトルとの外積(AC×ABとAC×D)を求めて、その結果も符号が逆になったらふたつの線分は交わっているといえるのです。 05 サンプルコード本稿で解説した外積の実際の使い方については、「平面上の2直線の交点を外積で求めるサンプルコード」をお読みください。 作成者: 野中文雄 Copyright © 2001-2013 Fumio Nonaka. All rights reserved. |
||||||||||||||||