両手の指を折って2進数を作る iOS アプリを組んだ。指は5本、それぞれ伸ばすか折るかの2状態しかない。だとすれば手の見た目は 2⁵ = 32通りで尽きる——そう考えて事前に全部書き出したのが、この記事の失敗の入口になる。
要点だけ置く。経緯の全体は本編に譲る。
要点
- 左手32枚・右手32枚・輪郭2枚の 合計66枚(約1MB) を事前生成した。実行時は1枚差し替えるだけで済む、という読みだった。
-
1本折ったときは破綻しなかった。5本折ると、指が立ったまま折れた断片が重なった。 このとき合計値は 1023、ビットも
1111111111で正しい。数の側からは破綻がまったく見えない。 - 原因は素材のほうだった。「人差し指の絵」に人差し指以外の手も描かれていた。元の絵が部品に分かれていないものは、合成でも分けられない。 1本のときに気づけなかったのは、親指の折れた絵がたまたま自分の伸びた位置を覆っていたから。
- 全部捨てて 実行時に重ねる方式へ。手のひら1枚+指10枚=11枚。伸びた指を先に、折れた指を後に描くと、折った指が手前に来る。画像の読み込みが 64個消えた。
- 右手の画像は要らなかった。
scaleX: -1で左手を反転すれば成立する。 - ただし 反転は重みまで反転させた。 右手の親指が512になっていても、AI側では「配列の順序が反転している」以上の意味を持たない。両手を広げて左から
512, 256 … 2, 1と並ぶよう定義側を直すまで、右手は嘘の数を返し続けた。 - タップ判定の中心は3回外した。決まったのは、発注側が指先に丸を置いた画像を渡してきて、その座標を読み取ったとき。「指紋が集約するところ」は座標ではないので、言葉では渡らなかった。
- 小指だけ反応しない。判定幅を他の指と同じ割合(0.083)で揃えていたが、小指は細いので実寸が足りない。押す側の指先の太さは、どの指を押すときも同じ。 0.120 に広げて解決(約45%)。
▶ 壊れた合成画像、鏡像の実物、判定点を3回外した過程まで、本編にまとめました: