円板と多角形の共通部分の面積

問題. Circles - Intersection of a Circle and a Polygon

平面上の単純多角形  P と円板  C が与えられる.このとき, P \cap C の面積を求めよ.

単純多角形とは自己交差していない多角形で,  P P の頂点を反時計回りに訪れた頂点の列  (p_1, p_2, \ldots, p_n) で与えられ,  p_i の座標を  (x_i, y_i) で表す.
また,円板  C は中心  c で半径  r としたとき  C = \{ \|p - c\| \le r \mid p \in \mathbb{R}^{2} \} を満たす領域である.

制約 3 \le n \le 100,  1 \le r \le 100,  -100 \le x_i, y_i \le 100

解法

まず多角形の面積の求め方を考える.多角形  P の面積は原点  O P の隣接する2頂点  p_i, p_{i + 1} からなる三角形の符号付き面積の総和で計算できる.三角形  \triangle{O \, p_i \, p_{i + 1}} の符号付き面積はベクトル  p_i, p_{i + 1}外積の絶対値に等しく  \frac{x_i \cdot y_{i + 1} - y_i \cdot x_{i + 1}}{2} となる.このときの符号は  p_i から  p_{i + 1} へ反時計回りなら正,時計回りなら負となる.したがって,多角形  P の面積は
   \frac{1}{2} \left( \sum_{i = 1}^{n - 1} (x_i \cdot y_{i + 1} - y_{i} \cdot x_{i + 1}) + (x_n \cdot y_1 - y_n \cdot x_{1}) \right)
となる.

次に多角形と円板の共通部分  P \cap C の面積の求め方を考える.まず始めに議論を簡単にするために,円板の中心が原点になるように円板と多角形が平行移動されていると仮定する.このとき平行移動によって面積は変わらない.
共通部分  P \cap C の面積は上の多角形のみの場合と同様に各三角形  \triangle{O\, p_{i} \, p_{i + 1}} と円板  C の共通部分の符号付き面積を求めてその総和をとることによって求めることができる.三角形  \triangle{O \, p_{i} \, p_{i + 1}} と円板  C の共通部分は2点  p_i p_{i + 1} が円板の内外のどこにあるのかの位置関係によって下図のように場合分けされる.青色の領域は三角形の符号付き面積で,緑色の領域は扇形の符号付き面積である.
    f:id:tatanaideyo:20190801184815p:plain

扇形の半径をなす 2 つのベクトルを  p_i, p_{i + 1} としたとき中心角  \theta \tan \theta = \frac{|p_i \times p_{i + 1}|}{p_i \cdot p_{i + 1}} = \frac{|p_i| |p_{i + 1}| \sin \theta}{|p_i| |p_{i+1}| \cos \theta} という関係から atan2() 関数 を用いて  \theta = \text{atan2} (x_i \, y_{i + 1} - y_{i} \, x_{i + 1},\, x_i \, x_{i + 1} + y_i \, y_{i + 1}) で求まる.このとき, \theta の符号は  p_i から  p_{i + 1} へ反時計回りなら正で,時計回りなら負となるので上で述べた三角形の符号付き面積の符号と一致する.したがって,このときの扇形の符号付き面積は  \frac{1}{2} r^2 \theta となる.
後は端点を  p_i p_{i + 1} となる線分と円板の交点などを求めて上の図のように  p_i p_{i + 1} の位置関係によって場合分けを行い三角形の符号付き面積や扇形の符号付き面積を求めて総和をとれば答えが求まる.

計算時間 O(n)

なかなか手強かった.
平面上の面積を測る道具に プラニメータ というのがあるのを最近知ったので面積繋がりでメモ.時間があれば原理を調べたい.