プログラマーが使う高校数学(その2)

2026年02月23日
社員のつぶやき

皆さん、こんにちは。システム商品開発グループの入澤です。
今冬は日本海側で寒波が襲来して、北陸らしい雪景色の中で過ごしておりました。ここ最近は寒さが緩んで雪解けが進んでいます。

さて、ブログタイトルにもある通りプログラマーの仕事で頻繁に出くわす高校数学のお話をもう少し続けてみたいと思います。前回「直線」を取り上げたときに、グラフィクスに関わるなら手足のように扱えなければならないと書きました。今回はもう一歩進んで「三角形」と「円」を見てみます。義務教育から嫌というほど関わってきたこれらもプログラマーにとって「直線」と同じく向き合わなければならない対象です。とくにグラフィクスでは、点の集まり、多角形(クローズパス)、連続線分(オープンパス)などベクタ形式のパスを計算する上で三角形と円の性質を多く使います。

前提として、3つの頂点で与えられる三角形を考える場合がほとんどですから、 P 1 = ( x 1 , y 1 ) P 2 = ( x 2 , y 2 ) P 3 = ( x 3 , y 3 ) の座標を順番に与えておきます(今回も平面で考えます)。ここからまずは三角形の符号付き面積を計算してみましょう。三角形の頂点が時計回りか反時計回りかを判断できるので符号付きにします。方法はいくつもありますが、外積の性質(2つのベクトルの外積の成分はベクトルを平行移動して作る平行四辺形の面積に等しい)を使うと次の式が簡便です。

S 123 = 1 2 { ( x 2 x 1 ) ( y 3 y 1 ) ( x 3 x 1 ) ( y 2 y 1 ) }   ...   Eq.1

絶対値 | S 123 | を計算することで面積が得られ、ゼロと比べることで3つの頂点の関係性が分かります。

  • S 123 < 0 : 3つの頂点を P 1 P 2 P 3 で辿ると時計回りの順番になる(右手系)
  • S 123 = 0 : 3つの頂点が一直線上に並んでいる
  • S 123 > 0 : 3つの頂点は反時計回りの順番になる

少し具体的な応用を見てみると、多角形の符号付き面積、多角形の重心(幾何中心)、多角形の凸性判定などを計算するときに、多角形の頂点を辿りながら三角形のこの性質を上手く組み合わせて求めるのが常套手段です。

さて、Eq.1をよく見てみると行列式を使って次のようにも表せます。

S 123 = 1 2 | x 2 x 1 y 2 y 1 x 3 x 1 y 3 y 1 | = 1 2 | x 1 y 1 1 x 2 y 2 1 x 3 y 3 1 |   ...   Eq.2

2×2の行列式が行ベクトルで張られる平行四辺形の面積(3×3の行列式が行ベクトルで張られる平行六面体の体積)であるという幾何学的な意味から関係性をとらえることもできますし、行ベクトル(転置すれば列ベクトル)が線形独立か線形従属かを判定する式と見なすこともできます。まあ、わざわざ行列式で書いたのには訳がありまして、円が絡むときも登場するからです。

恰好の例として三角形の外心を計算してみましょう。3点を通る円弧が欲しいという直接的な用途以外に、空間分割の問題でもよく使います。頂点が与えられた三角形の外心を求める方法は面積と同じようにいくつもあって結果は一緒なのですが「外心=3辺の垂直二等分線が交わる点」から考えます。辺 P 1 P 2 の垂直二等分線は、ベクトル V 12 = ( x 2 x 1 , y 2 y 1 ) と、中点 M 12 = ( ( x 1 + x 2 ) / 2 , ( y 1 + y 2 ) / 2 ) を始点とする任意のベクトル U 12 = ( x ( x 1 + x 2 ) / 2 , y ( y 1 + y 2 ) / 2 ) が直交する条件から導けます。

V 12 U 12 = ( x 2 x 1 ) ( x x 1 + x 2 2 ) + ( y 2 y 1 ) ( y y 1 + y 2 2 ) = 0

( y 2 y 1 ) y + ( x 2 x 1 ) x + 1 2 ( x 1 2 + y 1 2 x 2 2 y 2 2 ) = 0

( y 2 y 1 ) y + ( x 2 x 1 ) x + 1 2 ( d 1 2 d 2 2 ) = 0   ...   Eq.3

同様に辺 P 1 P 3 の垂直二等分線は次の通りです。

V 13 U 13 = ( x 3 x 1 ) ( x x 1 + x 3 2 ) + ( y 3 y 1 ) ( y y 1 + y 3 2 ) = 0

( y 3 y 1 ) y + ( x 3 x 1 ) x + 1 2 ( x 1 2 + y 1 2 x 3 2 y 3 2 ) = 0

( y 3 y 1 ) y + ( x 3 x 1 ) x + 1 2 ( d 1 2 d 3 2 ) = 0   ...   Eq.4

ただし、 d i 2 := x i 2 + y i 2 と置いています。Eq.3 と Eq.4 で与えられる直線(垂直二等分線)の交点が外心 P c = ( x c , y c ) になり、分母は一緒で A = ( y 2 y 1 ) ( x 3 x 1 ) ( y 3 y 1 ) ( x 2 x 1 ) として、

x c = ( y 2 y 1 ) ( d 3 2 d 1 2 ) ( y 3 y 1 ) ( d 2 2 d 1 2 ) 2 A

y c = ( x 3 x 1 ) ( d 2 2 d 1 2 ) ( x 2 x 1 ) ( d 3 2 d 1 2 ) 2 A

となります。ここで、共通の分母を見ると三角形の面積の4倍 2 A = 2 × 2 × S 123 = 4 S 123 になっていて、さらに式をよく観察すると分子も似た形をしていて行列式で書けそうです。

x c = 1 4 S 123 | y 2 y 1 d 2 2 d 1 2 y 3 y 1 d 3 2 d 1 2 | = 1 4 S 123 | y 1 d 1 2 1 y 2 d 2 2 1 y 3 d 3 2 1 |

y c = 1 4 S 123 | x 3 x 1 d 3 2 d 1 2 x 2 x 1 d 2 2 d 1 2 | = 1 4 S 123 | x 1 d 1 2 1 x 2 d 2 2 1 x 3 d 3 2 1 |

いきなり二乗値 d i 2 が出てきて面喰いそうですが、円の一般式 x 2 + y 2 + a x + b y + c = 0 から円周上の3点で連立方程式をたてて係数を求める手順であれば x i 2 + y i 2 の項が自然と行列に現れるのは想像できるかと思います。このように三角形や円が絡むグラフィクスの処理では、実質的に行列式の数値計算をする機会が多々あるのです。

では最後に、より次数の大きな行列式が登場する例を挙げてみます。3点 P 1 = ( x 1 , y 1 ) P 2 = ( x 2 , y 2 ) P 3 = ( x 3 , y 3 ) を通る円(3点を頂点に持つ三角形の外接円)に対して、もう一つの点 P 4 = ( x 4 , y 4 ) が円の内側、円の外側、もしくは円上にあるかを判定する式です。

D ( P 1 , P 2 , P 3 ; P 4 ) = 1 2 S 123 | x 1 y 1 d 1 2 1 x 2 y 2 d 2 2 1 x 3 y 3 d 3 2 1 x 4 y 4 d 4 2 1 |

全部を展開して書き下すと大量の項が現れるところ、行列式でとてもすっきりして見通しの良い式になっています。共円条件(4点が同一円周上にある)を判定するこの式に最初に出会ったとき美しさを感じたのを覚えています。

以上、長文にお付き合いいただきありがとうございました。
それでは「その3」でお会いしましょう。

月別アーカイブ