私は特に大きなプロジェクトに参画したわけでもなく、かといってコンパや会合やOB
会合宿の出席率もそれほどよかったわけでもなく、「ただ単に 9 年間いただけ」という
男なので、後輩に対して激励するようなことは、そんなにないんだな。言っても説得力
ないし。敢えて言うなら、みなさん、長いこといましょう。そして根津研の会員になる
のです (笑) 。話がそれてきましたが、どんどんそれます。それついでに、昔話をしま
す。そもそもがこんなもん年寄りにかかせたら、昔話をするにきまっているのだ。年寄
りが昔話を始めると長いぞ。後悔してきた? もう遅いよ。しかし部報になんか載せる
なんて、7 年ぶりくらいかなあ。
そもそも私はコンピュータなんぞと全く縁のない田舎の百姓のせがれであり、となり
の一年上のお兄さんにだまされて小学校のころ PC8001 のマシン語うち込みをやらされた
のがせいぜいのコンピュータ体験であった。その後、高校出るまでなんにもなかった。
なにしろ、コンピュータほしいなどと言ったら親にぶっとばされるくらいべらぼうに高
かった時代だもんで。でも、一部の都会のお子様達は、秋葉原などから部品を調達して
ワンボードマイコンなどを組んでいらしたようだ。コレは私のそのまた二、三年上の世
代の方たちに多いようだ。やっぱ東京には秋葉原があるから偉い。日本橋はどんなもん
なのか知らないけど。それに比べるといまの子供達は幸せ。(以下略)
それがまあ、どういうわけか当大学に入学して、どっかサークルに入ろうと思ったわ
けね。S1-22 組の森君がコンピュータサークルを回るというので、ついていったわけだ。
305 まで来たら、PC8801mk2 (だっけか?) があって、プロフェッショナル麻雀が動いて
いた。遊んでいいというから、遊んでいたら、学館が閉まってしまった。コンピュータ
がいじれると面白いかなと思って、TSG に入ることにしたのだが、当の森君はどっかの
テニスサークルに入ったらしい。その森君とは今も時々中央食堂で会って挨拶するのだ
が、どういう身分で大学に残っているのだろう。機械系のはずだが、だれか知りません
か。珊瑚で卓を囲んで以来、交流がないのです。その時九連宝塔をツモしたのがいけな
かったのでしょうか。ちなみに珊瑚はしばらくしてつぶれたそうなので、若い人たちは
聞いたことすらないのでしょう。
つい関係ない自慢をしてしまいましたが、昔話に戻りましょう。その後私は BASIC 分
科会に参加したのですが、誰よりも早く来たにもかかわらず、はっと気がつくともう分
科会は終了しているという状況が頻発して、BASIC はそれほど身につきませんでした。
プロ麻のせいです。しかし、上中下学年にはすごい人がうじゃうじゃいて、駒祭の展示
には困らなかった模様です。私は部報の穴埋め原稿など打ち込むようになったので、
QWERTY のタイプだけはできるようになったのですが、コンピュータそのもののスキルは
ほぼ上昇しませんでした。まあ、世の中そんなもんです。
そして時は流れ、 DQII が発売され、いいかげんな生活を送っていた私も本郷に進学し、
駒場には情報棟がたちました。私のころの図学は実験的に MSP でフォートランをやらさ
れ、おまけにラインエディタしかなかったもんですが、今の標準環境は、X 端末 8 台に対
して Sparc10 が 1 台の割だそうですね。それももっとよくなるという話ですね。うちの学
科の共用計算機は全体で Sparc10 が 1 台と、Sparc2 が 2 台という環境です。いまの若い人
は (以下略) まあ、船舶には笹川良一シールのスパーク 10 が 20 台もほってあるというか
ら (未確認) 、きっとうちの学科が貧乏なだけでしょう。でももう私には関係ないけど。
また話が 10 光年くらいずれました。きっと CIA かフリーメーソンかはたまた宇宙忍者
バルタン星人の策動にちがいありません。話をもどします。
時が流れて私が本郷に進学するころ、EPSON の PC286V が安くなりました。当時一年下
の高村君が持っていて、部内最速のマシンとしてレイトレースの計算に威力を発揮して
いたのですが、これがすごくうらやましかったものです。私はいろいろ手をつくしてこ
の機械を購入しました。しばらくして PC286VE が発売されて悔しかったものですが、こ
の後似たような話を耳タコなくらい聞いたためか、最近はこのテの話を聞くと逆にうき
うきします。
さて、いろいろな縁があり、また貧乏にもなったため、無謀にも私はプログラムのバ
イトを始めることになりました。冷静に考えると無茶な話です。しばらくすると慣れで
なんとか C が使えるようになり、バイト料が出たので、当時としては超速のロジテック
の LHD40 を買いました。しばらくすると私はバイト料でさらに RAM-DISK をくっつけてい
ました。このサイクルを友人が地獄車と呼んでいたように思います。
プログラムの現場では、能力の高い人とそうでない人の差が激烈に出てました。でも
一方、天才的な人だとかったるくってやってられないような直しとかやっつけ仕事とか
があったりするのも現実だな。私レベルだと、たぶん初年度から家庭教師もしくは塾講
師のキャリアを積んでいたほうが、はるかにもうかったと思います。特に下宿生は、何
がしかの余剰可処分金銭をプールしておかないとつらいので、単位に支障がないかぎり
計画的に稼ぎましょう。私はいろんな意味で反省しています。特に、割のいい家庭教師
はコネでつかむものなので、ひとあたりなどの人格的要素は経済的にも馬鹿にならんと
いうことでしょうか。入学当時私はなんもしらんくせに結構生意気なヤツで、原理ねえ
ちゃんに口答えして遊んだりするような世間知らずだったので、家庭教師には向かなかっ
たでしょうが、長いこと大学にいたおかげですっかり丸くなったので、今なら自信あり
ます。でも受験技術は忘れました。ああ、あのころに戻りたい。そして楽に金を稼ぎた
い。
なんでこんなオヤジの説教のような話になるのでしょうか。やはり私も年をとったと
いうことでしょうか。三十路という言葉は嫌いなのでコンパの席では言わないように。
でもまだバンコラン少佐と同じ年だ。しかしトシちゃん 25 歳を超してしまったときに
は少しショックだった。
それはともかく。長い大学生活で身にしみた事があるので述べます。「やればなんと
かなる事も多いなあ」というごくあたりまえの人生訓です。オヤジ風に言うと、「なせ
ばなる。ナセルはアラブの大統領」 (二重誤り的オヤヂギャグ) そんでもって今、「し
まった」と思っていたりします。なんでかというと、今ちょっとやってみたい電子工作
があって、概念的にはなんてこたない作業なのだが、素人は知らないようなよい方法や
IC が世の中にはごろごろしているはずで、これが駒場時代だったら、そーゆーことに詳
しい人が 305 でごろごろしていたのに、もうみんな就職してしまったから。今の駒場に
も、スーパーな人は何人かいると思うのですが、顔がわからん。スーパーでなくていい
から、だれかハード、ソフトに詳しい人で、親切な駒場の人いたら、コンパの席で手を
上げて下さい。基本的には個人で細々とやるつもりですが。完全に私利私欲というか、
趣味のプロジェクトなので、気長にかまえています。(ちなみに、比較的素人でも予算
不足の研究室では無茶なレベルの電子工作をやらされることがあります。やりとげた人
はそれなりのスキルを得ているようです。しかし、逃げたりできなかったり高専出身者
と組んであまりの実力差に自己嫌悪になったりするケースもあるようです。最後の場合、
仕事自体は楽です。)
さて、だんだん何を書いているんだか支離滅裂になってきましたが、よくも悪くも
TSG のおかげで私の人生は変りました。多分、この世に TSG がなければ、今ごろはまった
く違った人生を送っていたでしょう。思いおこせば、TSG との縁は意外と深いような気
がします。私は小中高と、漫画、娯楽小説ばかりを読みふけるロクでなしな子供だった
のですが、たとえば、ゲームセンターあらしや、石原藤夫のコラムに本学の学生が登場
しなければ、そもそもこの大学を受ける気になっていたかどうか (わりとマジ) 。結構
そういう階層の子供達への宣伝になってたのだなあ。TSG は。ああもう大垣行が出てし
まう。私はこれから国へ帰ります。(明後日には帰りますが)
TSG ライフを適当に楽しんでください。それが長続きのコツです。ではまたコンパで
会いましょう。バイバーイ
(チャチャリラチャチャリラチャッチャチャチャ
チャッチャチャチャッチャチャ、ピャー)
p.s. 追いコンには、プラスの時代から使い続けていた「マックいーすよマン」というヤ ツがくるそうなので、わりと楽しみです。みんなも楽しみにしてね。
struct Complex{ //複素数を扱う構造体の定義
private: //私的メンバの定義
double real;
double imag;
public: //公的メンバの定義
//私的メンバに外から値を代入する関数
void SetComplex(double r,double i){
real = r ;
imag = i ;
}
//私的メンバの値を外へ返す関数
double GetReal(void){
return(real);
}
double GetImag(void){
return(imag);
}
};
//使用例
void main(void){
Complex z1 , z2 ;
double r , i ;
z1.SetComplex( 1.0 , 2.0 );
z2.SetComplex( 0.5 , 4.0 );
r = z1.GetReal() ;
i = z2.GetImag() ;
}
これは複素数を扱う構造体の定義の、ごく基本的なものです。メンバ変数 real と imag
は、構造体の外部から直接アクセスすることはできません。つまり z.real = 1.0 はで
きません。一方、メンバ関数 SetComplex() GetReal() GetImag() は、外部からアクセ
スできます。そして、これらの関数から real と imag はアクセスできます。なぜなら、
その関数は構造体の内部の関数で、 real, imag は内部からならアクセスできるからです。
メンバ関数内でのメンバ変数のアクセスの仕方に注目してください。メンバ変数の前に
いつも必ずあった「構造体名.」がありません。これは、その関数がその構造体のメン
バであることから、もはやいちいちメンバの前にその団体名である構造体名を付ける必
要はないと考えれば明らかです。またメンバ関数の呼び出しは、メンバ変数のときと全
く同じで
「関数 SetComplex() を用いて z1 に値を代入する」
と表現していた所ですがここでは
「関数 z1.SetComplex() を用いて z1 に値を代入する」
と表現しています。この違いは
「変数 (=オブジェクト) は関数の下にある」
という考え方から
「関数はオブジェクトの下にある」
という考え方への大転換なのです。これこそがオブジェクト指向の原点なのです。以後 のいろいろな例からその考え方が分かってくることでしょう。
class Student{
char name[20];
int Japanese;
int Math;
int English;
int Science;
int sum;
public:
void SetData(char* na , int ja , int ma , int en ,int sc){
strcpy(name,na);
Japanese=ja;
Math=ma;
English=en;
Science=sc;
}
void CalcSum(void){
sum = Japanese + Math + English + Science ;
}
void PrintData(void){
printf("名前:%20s\n",name);
printf("国語:%3d\n",Japanese);
printf("数学:%3d\n",Math);
printf("英語:%3d\n",English);
printf("理科:%3d\n",Science);
printf("------------\n");
printf("合計:%3d\n",sum);
}
};
//使用例
int main(void){
Student Nao;
Nao.SetData("Naoki",100,100,100,100);
Nao.CalcSum();
Nao.PrintData();
return(0);
}
これは、生徒の名前と 4 科目の成績を記憶して合計点を含めて表示するクラスです。
構造体とあまり違いが無いことが解りますね。クラスと構造体とのわずかな違いは実に
些細で、構造体のメンバの private / publicの指定が無いときは public になり、クラスメ
ンバのそれは指定が無いときは private になるということです。つまり
struct Address{ class Address{
char name[10]; char name[10];
char ID[10]; char ID[10];
}; };
struct の方のメンバは外部からアクセスできますが、class の方のそれはできませんと
いうことです。本当にただこれだけなのです。今後は専らクラスを使っていきますがそ
れは構造体と本質的には同じです。
int i = 0;
char name[20]="Chomoranma kun";
クラスには初期化を自動的にしてくれる関数があります。それがコンストラクターです。
class Student{
char name[20];
int Math;
int English;
int sum;
public:
Student(char* na , int ma , int en ){
strcpy(name,na);
Math=ma;
English=en;
sum = Math + English ;
}
void PrintData(void){
printf("名前:%20s\n",name);
printf("数学:%3d\n",Math);
printf("英語:%3d\n",English);
printf("------------\n");
printf("合計:%3d\n",sum);
}
};
//使用例
int main(void){
Student Nao("Naoki",100,100);
Nao.PrintData();
return(0);
}
main 関数内の Student Nao("Naoki",100,100); で Student 型クラスとして Nao が宣言
され同時に ("Naoki",100,100) のデータがコンストラクター
Student(char* na , int ma , int en )
に送られこの関数によってクラスのメンバに値がセットされます。
Student Chomo;
とかするとコンストラクターに渡すデータの型が違うというコンパイルエラーになります。
そこでコンストラクターにデフォルト代入が出来るようにします。
Student(char* na ="", int ma =50, int en =50)
こうすることによってクラスオブジェクト Chomo は "", 50 ,50 の値で初期化され、Nao は
"Naoki",100,100 で初期化されます。
さてさて、しどろもどろな解説で皆さんかなり気持ち悪くなってしまったのではない でしょうか。次回もこの調子でいくつもりですがよろしくお願いします。ところで次回 はいつになるのだろう。もしかして 4 月のサークルオリ号ですか。ううむ、このときは、 やっぱりもうすこしまともな文章で書かなくてはだめかな。修業しなくては。
追い出しコンパのある日は、前期合格者の比較的駒場の近い人たちが入学手続きをし によろこびいさんで駒場にやってくる日です。理系の人なら初めての駒場でしょう。きっ と道に迷ってふらふらしているはずです。TSG の勧誘にはもってこいです (自分でも 謎) 。とにかくビラ配り手伝ってね。サークルオリではたくさんの新入生が来てくれる ようにみんな頑張ろうね。
あっそうだ。このコンパは追い出しコンパだったんだっけ。なにか言わなくては。
ご卒業される先輩方、おめでとうございます。
これからのさらなるご活躍を期待しています。
TSG 95 年度部長 渡辺 尚貴
この度、JUNK HD を繋げて頂く事に成功しました (自分で接続したのではありません ^^;)。お手伝い頂いた方々への感謝を込めまして、その過程をご報告しようと思います。
(i) 事の起こり
そもそもの始まりは、駒場での研究室の引っ越しにありました。去年の暮れの事です。
新しく出来た 16 号館にいくつかの研究室が移り、大量の廃棄物が野球場の隣に積み上
げられました。見ると、フロッピードライブやディスプレイがごろごろしています。ソ
フトボールの授業を終えた私は、汚れてもいい格好をしていたのを幸い、同じクラスの
K_O_ 君と一緒にその山をひっくり返し始めました。裁断機にも掛けられていないレポー
トの束や、お酒の空瓶に混じって、OASYS や、木枠のラジオの様な 2、30 年前の電圧
計、9801/E などが捨てられていました。
20x30x40cm^3 位の、薄汚れた金属製の箱が目に留まりました。K_O_ 君によると、660M
の HDD ではないかとの事です。"これがあれば、DAYTONA が入れられる !" と、私は、喜々
として、そのHDDを305に持ち帰ったのでした(*1)。私は当時、HDD の性能なんてど
れも似た様なものだと信じて疑いませんでした。^^;
(*1) やはり捨てられていた台車に、ディスプレイやコンピュータの類を満載して押 して行くのは、なかなかに恥ずかしかったです。
(ii) 変換ボード入手
メーカーに電話したところ、件の HDD は、ESDI 規格のものだと判明しました。"当時 は 150 万円位したのですけれどねぇ・・。" という、担当の方の言葉に、"一体、何時 の HDD なのだろう" と一抹の不安を覚えながらも、沢田さんに ESDI SCSI 変換ボード を一緒に探しに行ってもらいました。どう見ても、ものを接続出来る場所が一ケ所しか ないのに、"ESDI 変換ボードらしきもの" として、売られている不思議なボードに出会っ たりもしましたが、万世橋の近くで、250M ESDI HDと組み合わされた ESDI 変換ボード を買う事が出来ました。その商品が "SCSI HD" と称されていたのは、果たして妥当なの かどうか、疑問が残るところではありますが。
(iii) 305にて
寺川さんの資料から、見付けた変換ボードは特定機種の HD にしか使えない事が分かり
ました。秋葉原の方々を見て回ったのですが、それ以外に変換ボードは見つからなかっ
たので、拾った HD は諦めて、ケースと電源だけを利用する事にしました。
ボードも HD も富士通製であった為か、TOWNS では使える事がすぐ安田君によって確認
されました。沢田さんにボードのディップスィッチをいろいろ変えてみて貰ったり (*2)、
富士通から資料を送ってもらったりもしたのですが、EPSON 機にはなかなか繋り
ませんでした。私が持っているのは 98 なので、PC 互換機で使えない分にはどうにもなり
ません。ケーキパーティーで、"どなたか ESDI HD を SCSI で使う方法、ご存じないです
か ?" と私が叫んでいたのをご記憶の方もいらっしゃるかと思います。
結局、私の家の SCSI I/F BOARD を 305 の EPSON 機に差し、ASPI55.SYS, SFDISK を使っ
て、認識させる事に成功しました。その時は、寺川さんと八重樫さんが手伝ってくれま
した。128M しか認識されなかった事と、アクセスするとフライパンで豆でも混ぜる様な
音がするのが気になりましたが、私は 10kg のドライブを抱いて家に帰りました。
(*2) その途中、HD の音量を大・中・小に調節 (?) する謎のスィッチを発見。^^;
(iv) SCSI HDD
一方で、私が "ジャンクのHDが使えない(;_;)" とわめいているのを見兼ねて、佐久 間さんが "638M" もある "SCSI HD" を下さる事になりました。何でも、"静かな動かない奴と、 うるさくて動く奴" とをお持ちで、 "動く奴" の方を頂けるのだそうです。私は、佐久 間さんの研究室にケースごとHDを持ち込み、ESDI HD, SCSI HD 共にケースにきれいに組 み込んだ上でケーブルとターミネータを秋葉原で探して頂きました。挙げ句の果てには 15kg にもなった HDD をバス停まで運んで頂いて、大喜びで帰途につきました。秋葉原行 には、岡田さんも一緒に行って下さいました。
(v)さて、家にて
勿論、私の目的はこれらの HD を家の Bp で使う事にあります。両 HD 共、動作確認済みで
したので、大船にのったつもりでこの原稿を書く事も引き受けてしまいました。ところ
が、"あれ ? れ ?" ESDI HDD だけ、家ではフォーマット出来ないのです。
取り敢えず、SCSI HD は無事、唸り声を上げながら私に "後 22kbite で G" の環境を提
供してくれています。電話を掛けて来た友達に "掃除機かけながら電話してるの?" と
言われたり、"この音、何 ?" "HD" "HD に何してるの ?" "え、普通に使ってるだけ・・。"
などという会話が交わされたりもするのですが、私は幸せです。
という訳で、一応のハッピーエンド (?) でこの記事を終わらせたいと思います。
初心者がうっかりジャンクにはまってしまった失敗談と御失笑を頂ければ、という思
いもありましたが、何よりも、お世話になった方々に感謝したい気持ちで筆を執りまし
た。本当にどうも有難うございました。この場をお借りして、お礼申し上げさせて頂き
ます。
ファイルを圧縮するプログラムには、MS-DOS 用としては、LHA、PKZIP、ZIP、GZIP、
ARJ、ZOO などがあります。他にもたくさんありますが、これらは圧縮アルゴリズムとい
うか、符号化のしかたがほとんど同じになっています。今日は、これらのプログラムの
似てるところや違うところについてちょこっと書こうと思います。
なお、あらかじめ C マガジンの LHA のところを読んでおいてください。(^^;
LHA は、バージョン 2.55 まではパトリシアというデータ構造を使っているそうです。 しかし、現在開発中のバージョン (2.6x) では使われていません。なぜなら、
次は、符号化のしかたですが、ZIP、GZIP は PKZIP とまったく同じようです。そして、 LHA より複雑になっているので、その分圧縮率がいいようです。また、ARJ は、unarj.c というプログラムのソースを見ると、LHA とほとんど同じだということがわかります。 ちなみに、ZOO は LHA と全く同じだそうです。ZOO で圧縮したファイルは、LHA 2.13 で圧 縮したものより常に 2 バイト大きいそうです。:-)
では、みんなが作りたいと思っている、高速に LZH の圧縮をするプログラムについて
ですが、LHA の倍以上のスピードになるのはあきらかです。なぜなら、PKZIP は LHA の倍
くらいのスピードなので、LHA はそれより符号が簡単なので、PKZIP より遅くなることは
ないからです。TSG では、作ろうと思っている人は 4 人ほどいるようです。ぼくも早
く作りたいなあと思っていますが、気力がありません。(^^;
みんなで競争してつくろうよ。:-)
■はじめに
埼玉と言えば川越、川越と言えばイモである。川越周辺のイモの歴史について語ると
き、南永井 (所沢) の吉田弥右衛門を忘れるわけにはいかない。
寛延 4 年 (1718 年)、吉田弥右衛門は、上総の椎津村 (現在の千葉県市原市) に
人をやり、サツマイモの種芋を購入すると同時に、栽培方法を学ばせた。そして、武蔵
野台地 (川越もこの一部) でイモの栽培を始めたのである。サツマイモは寒気に弱い。
上総のように温暖な地方ならばいざ知らず、武蔵野台地のような冬の寒さの厳しい地方
でのサツマイモの栽培は、相当困難であったに違いない。なお、このあたりの経緯は、
「所沢市史近世史料 II (昭和 58 年刊) に収録された古文書「吉田家文書」に詳しい。
……をっと、失礼。本日私が参上したのは、イモの話をするためではなかった。さっ そく本題に入ることとしよう。
■スキャン変換
高速なグラフィック表示を目指す志高き者であれば、描画ルーチンにコンパイラ付属
のライブラリや BIOS のような軟弱なものを使用することはあるまい。アセンブラを
使って、がりがりコーディングするのが正義である。
ところで、コンピューターの画像は、格子点に配置されたドットの集合によって表現
される。したがって、点、直線、円などの図形を表示しようとする場合、真の図形をそ
のまま表示することはできず、真の図形を近傍のドットで近似することが必要になる。
このような操作をスキャン変換という。
画面に直線を表示するとは、すなわち直線をスキャン変換するということにほかなら
ない。スキャンのアルゴリズムの善し悪しが、直線を表示する速度を大きく左右するこ
とは、明らかであろう。
■イモよりおいしいブレゼンハムの直線スキャンアルゴリズム
TownsMENU や MS-Windowns などで使われているウィンドウなどの図形は、ほとんどが水
平な直線、及び垂直な直線で構成されている。このような直線の表示は、スキャン変換
などとムズカシゲな言葉をもちださずとも簡単である。
しかし、少し凝ったグラフィックスをやろうとすれば、斜めの直線をさけて通るわけ
にはいかない。この斜めの線分は、イモとは関係ないが、なかなかの食わせものである。
斜めの直線をスキャン変換する場合、真先に思いつくのは、直線の式を利用すること
であろう。今や高崎山のサルでも知っていることであるが、直線は
Y=M*X+b
のような一次式で表される。X を直線の左端から右端まで一つずつ増加させ、対応する
Y の値を求めて整数に変換すれば、確かに直線を描くことはできる。
余談であるが、高崎山のサルも、やはりイモを嗜好するのであろうか ? もしそうな
ら、たいへん喜ばしいことである。
それはともかく、このアルゴリズムには、重大な欠点がある。それは、Y の値を計算
するために、繰り返し繰り返し繰り返し繰り返し繰り返し乗算を実行しなくてはならな
いことである。乗算命令の実行には多大な時間を要し、ソフトウェアの実行速度を大き
く低下させる要因となる。高速性を要求されないプログラムであればこのアルゴリズム
でも構わないのだが、フライトシミュレーターのようにリアルタイム性を要求される場
合は、現実的な方法とはいえない。
乗算を一切使わずに、加減算とシフト命令だけでスキャン変換を行うことができれば、 描画速度の大幅な向上が期待できる。だが、そんな都合のいいアルゴリズムがはたして あるのだろうか ? ある。それが『ブレゼンハムの直線スキャンアルゴリズム』である。 高速にグラフィックをやりたいと願うものにとって、ブレゼンハムの直線スキャンアル ゴリズムは、もう感謝感激イモヨダレというくらいのシロモノである。そこで、このブ レゼンハムの直線スキャンアルゴリズムとはいったいいかなるものなのか、解説してゆ くこととしよう。
なお、説明の都合上、以下では傾き M が 0 以上 1 以下で、原点を始点とする (b=0)
直線のみを考える。
原点を通らない直線は、平行移動して考えればよい。傾きが 1 を越える直線は、各 X
座標において描画される点の数が一定ではないため扱いにいが、X と Y を逆にして考え
れば済む。傾きが負の場合には、上下反転させることで、やはり傾きが 0 以上 1 以下の
直線に帰着させることができる。
また、Y 軸の向きは、通常の数学の問題を考えるときと同様に、上向きとする。
■ブレゼンハムの直線スキャンアルゴリズムと決定変数
X を順次インクリメントしながら、点をプロットしてゆく方法を考えよう。
いま考えている直線の傾きは 0 以上 1 以下であるから、各 X の値について必ず対応す
る点がただ一通りに定まる。ここで問題となるのは、Y の値である。ブレゼンハムの直
線スキャンアルゴリズムは、「ある点をプロットしたとき、次の点の Y 座標はどうなる
のか ?」を教えてくれる。
直線の傾きは 0 以上 1 以下であるから、Y 座標は
そのまま
または
1 増える
の 2 通りに限られる。この、「2 通りに限られる」という点に注目していただきたい。
直線を描くという漠然とした問題が、二者択一の単純な問題に帰着されたのである。ど
ちらの操作を取るべきかは、真の直線とスキャン変換されるドットとの距離で決まる。
当然、真の直線により近いドットを選択しなくてはならない。
よいイモができるかどうかの鍵を握っているのは苗の植え方であるが、正しい操作を
選択するための鍵を握っているのは決定変数と呼ばれるものであり、通常文字 d で表さ
れる。決定変数 d の正体は一体何なのか ? 答えを言ってしまえば
d=((真の Y の値 - 一つ前に打ったドットの Y 座標との差)-(一つ前に打ったドットの上にあるドットの Y 座標と差 - 真の Y の値)
である。直観的には、
d=(真の Y の値と、一つ前に打ったドットの Y 座標との差)-(真の Y の値と、一つ前に打ったドットの上にあるドットの Y 座標と差)
と思っていただいて構わない (厳密には少し違うが)。
d>0 のときは上のドットの方が近いため Y は 1 増え、d<0 のときは下ドットの方
が近いため Y はそのままである。このことは、容易に理解されよう。なお、d=0 のと
きは、便宜的に前者に該当するとする。
問題は、この d の値をどう求めるかである。d を求める方法がわかれば、ブレゼンハ
ムの直線スキャンアルゴリズムは、もう制覇したも同然である。
■決定変数 d の計算
直線の出発点の位置は、もともとイモの個数などと同様に整数で表現されるから、ス
キャン変換をするまでもない。
1 つ目の点を打つところから、我らがヒーロー決定変数 d の登場である。
直線の傾き M は 0 以上 1 以下であるから、Y の値は X=1 のとき 0 以上 1 未満である。
したがって Y=M であり
d=(Y-0)-(1-Y)=2*M-1
となる。d が正または 0 のときは Y を 1 つ増やし、 負のときは Y はそのままとする。X はもちろん 1 増やす。 こうして得られた (X, Y) に 2 つめの点をプロットする。