この記事はMCC Advent Calendar 2016 15日目の記事です.ICPC向けの複素数演算による幾何ライブラリの実装について話します.
MCC Advent Calendar 2016 - Adventar
遅れてすいません...
背景
ICPCでは幾何の問題が出てきます.
ただし,ICPCでは電子的な事前準備の禁止と標準ライブラリしか使えない制約があります.
このため,標準ライブラリ縛りで幾何に必要な関数を一から実装する必要があります.
しかし,事前準備なしで幾何に必要な関数を実装するのは大変なことであり,多くのチームは紙媒体でライブラリを用意していると思います.
幾何に必要な関数を一から実装するとコード量も膨大になりがちです.
そこで,複素数演算を活用することで実装量を減らすことができます.
(ただし,2D限定です.あと,事実だけを淡々と書いていきます.)
ベクトル
2次元のベクトルを複素数と考えます.
そうすると,ベクトル との内積と外積は次の式で表される.
この手のテクニックは以下の記事とかで知りました.(他にも有益情報があります)
複素数と平面幾何 - 純粋関数型雑記帳
射影
点と点を結ぶ直線に対して,点の射影
より詳しい説明はこのサイトを見ると良さそう.
正射影ベクトルの公式の証明と使い方 | 高校数学の美しい物語
初めて知ったのは,notさんのツイートだった気がするけど,見つけられず...
線分の交差判定
点と点を結ぶ線分aと点と点を結ぶ線分bの交差判定 (線分の端点と線分では交差しないと判断)
直線の交点
点と点を結ぶ直線aと点と点を結ぶ直線bの交点
まとめ
とりあえず,いくつか書いてみました.
途中までしか書いていないので,おそらく加筆修正される予定です.