考えたこと
もっと簡単な方法があるんだろうな,とは思いつつも,計算で解が出せるので解いてしまった.現在地$(x_{0}, y_{0})$を中心とする円で各辺に接するものの半径を求め,それらのうちの最小値が答えになる.
隣り合う頂点の座標を$(x_{1}, y_{1})$,$(x_{2}, y_{2})$とする.$x_{1}=x_{2}$なら$|x_{1} - x_{0}|$が辺までの距離になり,$y_{1}=y_{2}$なら$|y_{1} - y_{0}|$が辺までの距離になる.以下では,それ以外の場合を考える.
2点$(x_{1}, y_{1})$,$(x_{2}, y_{2})$を通る直線の方程式は
&y = ax + b \\
&
\begin{cases}
\, a = (y_{2} - y_{1}) / (x_{2} - x_{1}) \\
\, b = - a x_{1} + y_{1}
\end{cases}
\end{aligned}
$(x_{0}, y_{0})$を中心とする円が直線$l$と接するとき,その接点を$(x_{t}, y_{t})$とする.2点$(x_{0}, y_{0})$,$(x_{t}, y_{t})$を通る直線は,直線$l$と直交するので
&y = - x/a + c \\
&c = x_{0} / a + y_{0}
\end{aligned}
これを直線$l$の方程式と連立させると,接点$(x_{t}, y_{t})$が
x_{t} &= a(c - b) / (a^{2} + 1) \\
y_{t} &= - (c - b) / (a^{2} + 1) + c
\end{aligned}
よって,点$(x_{0}, y_{0})$から直線$l$までの距離は
\sqrt{(x_{t} - x_{0})^{2} + (y_{t} - y_{0})^{2}}
\end{aligned}
以上をすべての辺に対して計算し,その最小値を出力すれば良い.
別解
点と直線の距離の公式
点と直線の距離の公式を覚えていればそれが使える.ベクトル演算1
かなりラクになる.公式を覚えておく必要もない.現在地を$\boldsymbol{x}_{0} = (x_{0}, y_{0})$,2頂点を$\boldsymbol{x}_{1} = (x_{1}, y_{1})$,$\boldsymbol{x}_{2} = (x_{2}, y_{2})$とする.
\boldsymbol{r}_{0} &= \boldsymbol{x}_{0} - \boldsymbol{x}_{2} \\
\boldsymbol{r}_{1} &= \boldsymbol{x}_{1} - \boldsymbol{x}_{2}
\end{aligned}
点$\boldsymbol{x}_{0}$から辺に降ろした垂線の足の位置ベクトルは,辺への射影ベクトル
\biggl(\boldsymbol{r}_{0} \cdot \frac{\boldsymbol{r}_{1}}{\|\boldsymbol{r}_{1}\|}\biggr)
\frac{\boldsymbol{r}_{1}}{\|\boldsymbol{r}_{1}\|}
\end{aligned}
三平方の定理より,垂線の長さは
\sqrt{\|\boldsymbol{r}_{0}\|^{2}
- \biggl(\boldsymbol{r}_{0} \cdot \frac{\boldsymbol{r}_{1}}{\|\boldsymbol{r}_{1}\|}\biggr)^{2}}
\end{aligned}
ベクトル演算2
記号を上と同じように定める.また,$r_{0} = \|\boldsymbol{r}_{0}\|$,$r_{1} = \|\boldsymbol{r}_{1}\|$と表す.$\boldsymbol{r}_{0}$と$\boldsymbol{r}_{1}$のなす角を$\theta$とすれば,求める垂線の長さは$r_{0} \bigl| \sin\theta\bigr|$である.
$\sin\theta$は外積
\| \boldsymbol{r}_{0} \times \boldsymbol{r}_{1} \|
= r_{0} r_{1} |\sin\theta|
\end{aligned}
r_{0} \bigl| \sin\theta\bigr|
&= \frac{r_{0} r_{1} \bigl| \sin\theta\bigr| }{r_{1}} \\
&=\frac{\| \boldsymbol{r}_{0} \times \boldsymbol{r}_{1} \|}{\|\boldsymbol{r}_{1}\|}
\end{aligned}