生き抜くぜ21世紀

統計?機械学習?っぽいことを書く

将棋駒の寸法をしっかり計算したお

はじめに

ちょっといま趣味で将棋の画像認識のうんぬんかんぬんをやっていて、そのためにunityで将棋駒をつくったほうがいいっぽくなったんですね。そしたら意外と将棋駒の寸法をしっかり計算するのがむずいという学びを得たためここで私の作業を共有しようというエントリです。

将棋駒の寸法ルールを知る

将棋駒 寸法でググると、以下のサイトが出てきます。

駒博士のQ&A

どうも、将棋の駒界では

  • 底辺
  • 高さ
  • 底辺と横の辺がなす角度(底角とでもしましょうか)

の3つで定義されてるっぽいんですね。

しかしながら、この定義だと上の部分の角度が自由なので私のような美術センスなし人間はうまく3Dモデリングできないんですよ。

f:id:rskmoi:20180121103137p:plain

やっぱり駒の形が一意に決まる定義がほしいところです。

で、いろいろググっていると以下のサイトが見つかります。

www.i-tsu-tsu.co.jp

このサイトで、駒の角度の定義を知ることができました。

  • 頂角 144°
  • 中角(とでもしましょうか) 117°
  • 底角 81°

やっぱり中倉彰子先生は神

というわけで、将棋駒の寸法定義を上記2サイトを参考にまとめると、

  • 底辺の長さ
  • 底辺の長さと高さの比
  • 頂角 (144°が一般的)
  • 底角 (81°が一般的)

の4つの値があれば将棋駒の形が一意に決まることがわかりました。(※中角は五角形であることから導出できるので頂角と底角で十分)

定義から辺の長さや座標を計算する

この値を定義すれば駒の形が一意になるとわかったとはいえ、実際に各辺の長さや頂点の座標位置を計算するには結構がんばらなくてはなりません。

この記事にたどり着いた人はラッキーです。私ががんばっておきました。

f:id:rskmoi:20180121092953p:plain

上の図で言うところの

  • 角P
  • 角R
  • 底辺の長さc
  • 底辺と高さの比率μ

が既知の状態で残りの未知の値を求めようということになります。

あ、角は全部degreeでおねがいします

角Qを求める

鬼かんたんですね。

五角形の内角の和が540度であること、将棋駒は左右対称であることから

 \displaystyle ∠Q = \frac{540 - (∠P + 2∠R)}{2}

辺の長さa, bを求める

ちょっとめんどくさくなります。

まず、高さμcと辺の長さa,bの関係は

 \displaystyle μc = a \cos  (\frac{P}{2}) + b\sin (R)

ですね?次に、底辺cと辺の長さa,bの関係は、

 \displaystyle c = 2(a \sin (\frac{P}{2}) + b \cos (R))

となります。こいつらの連立方程式を解いてやればいいんですね。

両方の式に  \displaystyle b \cos (R)\sin(R) が現れるようにそれぞれ式変形すると

 \displaystyle μc \cos(R) = a \cos  (\frac{P}{2})\cos(R) + b\sin (R)\cos(R)

 \displaystyle \frac{c}{2}\sin(R) =  a \sin (\frac{P}{2})\sin(R) + b \cos (R)\sin(R)

上の式 - 下の式でbを消去して

 \displaystyle c(μ\cos(R) - \frac{\sin(R)}{2}) = a (\cos(\frac{P}{2})\cos(R) - \sin(\frac{P}{2}) \sin(R))

右辺はなんと加法定理の形になっているので(高校数学は神)

 \displaystyle c(μ\cos(R) - \frac{\sin(R)}{2}) = a cos(\frac{P}{2} + R)

 \displaystyle ∴ a = \frac {c(μ\cos(R) - \frac{\sin(R)}{2})}{cos(\frac{P}{2} + R)}

とすることでめでたくaをc,μ,P,Rで表せました。同様に

 \displaystyle b = \frac{c(\frac{\cos(\frac{P}{2})}{2}{ - μ\sin(\frac{P}{2})})}{\cos(\frac{P}{2} + R)}

各頂点の座標

点Pの座標を(0, 0)とすると、

 \displaystyle Q =  (± a \sin(\frac{P}{2}), -a\cos(\frac{P}{2})

 \displaystyle R =  (± \frac{c}{2}, -μc)

これで全部いけましたね。

こんな感じのオブジェクトができた(王将サイズ)

f:id:rskmoi:20180121103915j:plain

終わりに

とまあこんな感じで将棋駒のあれこれが計算できるわけです。

計算用スクリプトは近日中に公開するので、だれでも将棋駒の辺の長さを知ることができるようになります。ハッピーライフ。

それにしても高校数学はすごいですね。これで三角関数の加法定理なんか人生の役に立たないとか知った顔してのたまう高校生には「将棋の駒の寸法を計算するプログラムの可読性がめちゃくちゃあがるから役に立つんじゃオラ」と力強く主張できます。

それでは。(そろそろいい加減deeplearningの記事が書きたい)