整数演算だけで円を書く方法

高校時代に雑誌で読んで衝撃を受けたのを覚えています。今、自分で思い出しながら書いてみます。

前提条件として、円は八分円が書ければ対称関係から真円が描けます。そのため、ω=0 からπ/4までが描ければよいことになります。絶対座標だと説明が面倒なので、円の中心を原点(0,0)とし、相対座標を(x, y)とします。

ω=0なので、初期値は(R, 0)となります。ここは円上の点ですので、プロットします。第一象限の下側なので、これに隣接する点は、真上の(x, y-1)か、斜め左上の(x-1, y-1) しかありません。この二つの点のどちらを選択するかは、原点からの距離と半径との関係で決められます。すなわち、(y-1)^2+x^2-R^2 と (y-1)^2+(x-1)^2-R^2 の絶対値が小さい方を選べばよいことになります。

しかしながら当時のコンピュータは8ビットマシンで掛け算命令すらありません。このため、これらの関係を自乗を使わないで表記しなければなりません。

今、座標(x, y)における誤差g

g = x^2 + y^2 - R^2

がわかっているものと仮定します。ちなみに 初期状態 ω=0 における座標 (x, 0) の誤差は計算するまでもなく 0 です。

この時、真上に移動した時の誤差g1は以下のように現在のgを使って書くことができます。

g1 = x^2 + (y-1)^2-R^2 = x^2 + y^2 -2*y +1-R^2 = g - 2*y + 1

同様に斜め右上(x-1,y-1)に移動した時の誤差g2は以下のようにg1を使って書くことができます。

g2 = (x-1)^2 + (y-1)^2-R^2 = g1 - 2*x + 1

2倍の計算はシフトでできるので当時のZ-80でもできました。絶対値の小さい方をというのは難しいので、当時は必ず円の外側を選ぶなどの処理を書いていたと思います。それであれば正負の判断だけで終わるからです。

制約がある時代のプログラミングって、ものすごい工夫があって人のプログラムを読むのがすごい楽しかったですね。

written by iHatenaSync