問題. 面の数
3次元ユークリッド空間中に 2 つの平面 と
がある。
実数列 と
が与えられる。平面
に頂点の内角が原点から見て反時計周り順にそれぞれ
となるように凸多角形を構成して、それら2 つの凸多角形を含む
個の頂点からなる凸多面体の面の数としてあり得るものを全列挙せよ。
制約: 、
解法.
凸多面体(凸多角形)の Minkowski-Weyl の定理から凸多面体には、有限点集合の凸包による表現と、線形不等式系としての表現の 2 つがある。この問題では後者の線形不等式系による表現を用いて考察をする。すなわち、凸多面体 に対して、ある行列
とベクトル
が存在して、
となる。ただし、
は線形不等式の数で凸多面体によって異なる。
まずは平面 にある凸多角形を考える。下の図では凸多角形とそれを表現する線形不等式系(平面なので直線)を描いている。直線の交点が頂点となり、頂点を結ぶ線分が辺である。凸多角形の辺を記述する直線に対して、その直線の法線ベクトルの向きが変わらないように平行移動しても内角は変わらない。右の辺の青色の頂点は直線を左に平行移動したとき赤色の頂点に、右に平行移動したとき緑色の頂点に移動して、それぞれ内角が変わらないことが確認できる。

次に、2 つの凸多角形を固定したときにできる凸多面体 の面がどのようになるのかを考える。
は3次元空間にあり構成方法から記述する線形不等式系の各線形不等式は平面となる。
と
にある凸多角形をそれぞれ
とする。
の任意の辺
を1つ考える。
を含む
の面を記述する
とは異なる平面のイメージは下図のようになる。今、
は赤色の頂点を結ぶ辺とする。候補となる平面と
との共通部分は直線となっており、その直線の法線ベクトルの向きが z 軸を無視して
の法線ベクトルの向きと等しくなる。そして、平面を外側から
の頂点のいづれかと交差するまで回転する(
が蝶番、平面がドアで、蝶番で固定されているドアを動かすイメージ)。このとき
上では直線が移動しているように見える。
平面が と初めて接触するとき
の頂点は高々 2 つである。これは入力として与えられる凸多角形のどの 3 頂点も同一直線上にないことから分かる。交点が 1 つの場合は図のように面は三角形となる。交点が 2 つの場合は四角形となり、
と
上にある 2 つの辺の法線ベクトルの向きは z 軸を無視して等しくなる。

と
のどの辺も上で構成した三角形または四角形が
の面に含まれている。また、2 つの凸多角形の配置を決めたときに、法線ベクトルの向きが等しくなる辺同士からなる面が四角形となり、それ以外は三角形となる。上部と下部を除いてすべての面が三角形となる凸多面体は片方の凸多角形を適当に回転すれば構成でき、そのときの面の数は
である(三角形の底辺を対応させると分かる)。
面が四角形となるような凸多面体を列挙するには、2 つの凸多角形の各辺のペアの法線ベクトルの向きが等しいと固定して、残りの辺で法線ベクトルの向きが等しくなるペアが何個あるか求めればよい。もし法線ベクトルの向きが等しい辺の組数が 個あれば面の数は
個となる。
実装するときの注意点として、各辺の法線ベクトルを求めるときに基準の法線ベクトルから順に加える回転角は内角ではなく「180° - 内角」を加える。
あと入力は倍精度浮動小数点数型に収まるが、入力時と法線ベクトルの角度を求めるときに加算する必要がありそのときに丸め誤差が生じる。ただし、 の ulp も小さいし加算回数も高々 50 なので適当に評価すればよい。
計算時間:
用語の定義をしっかりしようとすると量が倍になりそうなので結果説明が雰囲気だけになってしまった。実装が楽な幾何問題はうれしい。