Mathematical Affine is Not Right
アフィン幾何学とはユークリッド幾何学から長さや角度を取り除いて一般化した幾何学である。長さを取り除くと、縦横高さの方向に伸ばしたり縮めたりできる。角度を取り除くと、任意の角度・回転軸で回転できる。一見、数学的には完璧に見える。
写像は、例えば、集合Aの各要素が集合Bの各要素に1対1に対応するようなときに全単射と呼ぶ。画像のドット1つ1つがアフィン変換されて2次元画像が変形する、などの類である。
3次元で言えば、何らかの変換行列で座標を変換することが対応する。
3次元の変換について考えると当然4次元の変換行列が出てくるので、説明は難しい。だから、2次元の変換に絞って考えよう。わかりやすい例は、PDFをベクトルで表現することである。つまり、フォントのアフィン変換を考えよう。
フォントは曲線データの集合である。さらに言えば、内側/外側のデータも必要だ。内側が塗りつぶされ、外側は塗りつぶされないのである。
さて、フォントは自由に変形できるだろうか?フォントはイタリック体にできるし、囲み文字にできるし、太字にできる。本当かな?フォントデータにもともとイタリック体がない場合、アフィン変換でイタリック体が作れる。実際、ウィンドウズはノーマル字体からイタリック体を作れる。しかし、それはノーマル字体の画像を描画してから、その画像をずらしてイタリック体にしている。macOSやiPhoneのswiftUIでもそうだ。画像として描画した後に変換するのはよくあることだ。囲み文字は2つの字体の合体だ。フォントデータにもともと太字がない場合、どうすると思う。なんと、上下左右に少しずつずらしながら、描画することで画像として太字になるのだ。少なくともウィンドウズやオフィスソフトではそのテクニックを用いている。曲線を任意の角度に変換することさえできないのだ。回転は画像にしか作用しない。縦書きで困るよね。
フォントの字体である多項式の集合から、画素に還元することなく、イタリック体などの変形を施した多項式に変換するということは、圏論でいうところの関手に当たる。圏Aの射fから圏Bの射gに映すのを関手Fとする。すると、g=F(f)と表される。2つの圏の直積では、対象とする変換(イタリック体)がそもそも線型独立では無いので、不適切というか写像できない。よって、2つの圏の冪を考える必要がある。つまり、カルテジアン閉圏である。いよいよ議論が煮詰まってきた。2つの圏の冪というが、圏Aも圏Bも2次元の四角い線型空間である(PDFだから)。圏Aの座標を(x, y)=(float, float)で表して、圏Bの座標を(x', y')=(float, float)で表した場合、冪だから、32bit×4=128bitの座標変換を1ドットずつ行う必要がある。メモリが足りないから不可能だ。圏論では変換できることを言っているが、実際の変換の対象は多項式ではなくて、画素1つ1つなのだ。仮に関手が本当に存在するなら、とっくに誰かがフォントの多項式を変換するプログラムを書いているだろう。Haskellは夢物語だ。Windowsの描画が画素の集合に対してなされるのは、この話を踏まえれば自然なことと受け止められる。macOSやiOSの描画はベクトルであるPDFに対してなされるが、技術的な困難さもあるので、実際、描画の途中で画素の集合に変換してから、さらに、その画像を変形する必要も出てくるだろう。
精確なアフィン変換が存在しないなら、世界はどうなるだろう?物体はどうやって回転するのだろう?グレースケールという方法がある。1つ1つのメモリセル(格子)に入るように値が調整される。そうなるとどうなる?近似的に問題ないかのように動けるだろう。ただ、近似なのでモノは少しずつ壊れていく。グレースケールだからエントロピーが必ず増大する。だから、情報=モノが損なわれていく。モノが損なわれていくなら新たにモノを作るしかない。完璧なモノは存在しない。ただし、この世界でノルムは1のままである。