はじめに
hkob の雑記録の第472回目(連続45日目)は、一昨日同僚と話をした8ビットコンピュータ時代のアルゴリズムの例として整数演算だけで円を描く話を書いてみます。このネタは毎年の東京理科大学の非常勤の授業でも話しているものです。
MZ-80B と PC-8801
私が最初に所有したマイコン(当時はパソコンではなくマイコンと言っていた)は、SHARP の MZ-80B でした。小学生の時に親戚が買ったベーシックマスターレベル2マークIIで遊びまくっていて、ようやく中学2年の時にねだりまくって買ってもらったものでした。しばらくすると私の周りでもマイコンを購入する友達も増えてきましたが、みんな NEC の PC-8801 を買っていました。この PC-8801 は 8 色のグラフィックも表示できるし、CIRCLE という命令で円を描くこともできました。
私もなんとかオプションのグラフィックカード(39,800円)を追加し、単色のグラフィックは出せるようになったものの、円を描くコマンドは用意されていませんでした。ただ、本体に付いてきたマニュアルにはサンプルプログラムとしてグラフィックで円を描くものが掲載されていました。意味はわからないものの、プログラムを同じようにタイプすると非常にゆっくりと一点ずつ描画しながら円が描画されました。中学生の自分にはプログラムの意味はわからないものの、SIN や COS といった文字列で座標を計算しているのだなと理解し、高校の参考書を買いに行ったことを覚えています。当然ながら CPU である Z-80 の APU には加減算をする機能しかなく、浮動小数点の計算はエミュレーション、三角関数もテーブル引きをしている程度でしょうから、遅いのは当たり前ですね。
その後、Z-80 の機械語を本体のマニュアルで学び、自由自在にプログラムが書けるようになったことから再度円を描くことに挑戦しました。実際には、雑誌に掲載されていた円を描くアルゴリズムを見て内容を理解して自分でも実装してみたということです。このアルゴリズムを理解した時に非常に感動したので、いまだに授業資料として解説しているところです。実際に理科大で使っている授業用のスライドがあるので、それを提示しながら解説してみたいと思います。
問題定義
最初は学生に対する問題定義です。理科大の授業では初日の最後にこの問題だけを提示して考えてきてもらっています。

ヒント1
理科大の授業ではここまでをヒントとして出しています。実は、PC-8801 の CIRCLE 命令も一瞬で円が出てくるわけではなく、上下左右の4箇所から両脇に広がる形で一度に8点ずつ描画していました。多分、このアルゴリズムが使われていたのだと思います。

ヒント1の続き
上にも書いたように三角関数や実数演算ができるなら簡単です。

ヒント2
ここからが種明かしです。次の日の授業ではここから解説します。結局二択の問題なんですね。

誤差の計算
実際の円の座標は小数点になるので、どちらの点を選択しても誤差が発生しています。この誤差がどちらが小さいかを計算すればいいことになります。8ビットCPUで平方根は計算できないので、距離の自乗で代替します。具体的な値が欲しいわけではなく、差の比較をしたいだけなので自乗でも問題ありません。

再帰計算を実施
ここで再起的計算が出てきます。現在の誤差がわかっている時に上と斜め上の誤差を差分で計算します。

具体的な再帰計算式
現在の e が A の時、実際に e1 の値を計算し、A を使って記載します。すると、ここで出てくる差分は y を 2 倍した値の減算と 1 の加算のみです。この計算自体は整数演算ですし、2倍は同じ値の加算で計算できるので、8ビットCPUでも問題なく計算できます。

実際の計算例
これが実際に計算した例です。e2の方が小さくなった時に斜め上に移動しています。ちゃんと円が描けていますね。

おわりに
今はもうこんな制約条件のもとでプログラムを作成しなければならないことはないでしょう。そういう意味ではコンピュータと共に育っていった我々は、本当に面白い時代を生きてきたんじゃないかなと思います。
https://hkob.notion.site/hkob-16dd8e4e98ab807cbe3cf3cc94cdfe0f?pvs=4hkob.notion.site