ストラウストラップのプログラミング入門(20) 第12章とドリル

ストラウストラップのプログラミング入門』を読む。今日は、第12章「表示モデル」まで。

この本では、12章から16章までの150ページ以上が、グラフィックスの話題に割かれています。何だか気合が入ってますね。(しかし、分母が1100ページ超であることを考えると、取り立てて多いわけではないかも)

どうしてこうなった、と思ったら、あらかじめ疑問は封じられていました。

グラフィックスに4つの章を割き、GUIに1つの章を割くのはなぜか。(中略)

  • グラフィックスは便利である。
  • グラフィックスは楽しい。
  • グラフィックスは読むとためになるコードの宝庫である。
  • グラフィックスは設計例の宝庫である。
  • グラフィックスは俗にオブジェクト指向プログラミングと呼ばれているものやそれをサポートする言語機能をうまく紹介する。
  • グラフィックスは(さらに続く)

…「俗にオブジェクト指向プログラミングと呼ばれているもの」なんて、また随分と迂遠な言い方をしたもんですねぇ。怖いわぁ…。

自分はアニメーションやGUIを見るのが好きなので、理由は「グラフィックスは楽しい」だけでも十分です。

環境構築

12章では、グラフィックスのライブラリであるFLTKhttp://fltk.org/)を使います。

結論をいうと、επιστημηさんが公開されている「おすなばセット」を使わせていただきました。ありがとうございます。

本の付録Dを参考にすれば、FLTK自体は問題なくインストールできました。しかし、著者が用意したFLTKのラッパークラスとヘッダーファイルについては、本文での説明が簡略化されています。Windowsだからmakeなんて入れてないし、Cygwinは使いたくないし…という不精もあいまって、ビルドと配置でハマってしまいました(ヘタレすぎる…)。

というわけで、手っ取り早そうなこちらを使わせていただきました。キャプチャ付きの分かりやすいインストールマニュアルのおかげで、一切迷わずにインストールできました。ありがたやー。

追記(2011/09/27): Graph.hで定義されているPolygonクラスの使用でエラーになる場合、「Graph_lib::Polygon」という記述にすればよいようです。これも上のマニュアルに書いてありました(助かりました)。手元では、RectangleとEllipseのエラーも、同じ方法で回避できました。

内容

12章は、ひたすらこんな感じでした。

  • ウィンドウを作る
  • 座標の概念を理解する(左上隅が基点!)
  • 線や図形を描く
  • 線や図形の色やスタイルを変える
  • sine曲線を引く
  • 文字を配置する
  • 画像を読み込む

一応、印象に残った箇所を2つメモします。

描画されるものと、コードの関係

12.7.6では、線を連結した長方形もどきのオブジェクト(Closed_polyline)と、真の長方形オブジェクト(Rectangle)を比較して、両者は違うという話が、さらっと説明されます。

このコードを論証するにあたり、Rectangleが画面上でたまたま長方形に見えるのではないことが重要となる。つまり、(幾何学で学んだ)長方形の基本的な約束が守られている。Rectangleが画面上で実際に長方形であり、そのままの状態を保つことに依存するコードが書かれている。

「オブジェクトの性質をコードでどう表現するか」という話題は、プログラミングで明らかに重要なので、この後もまた出てくるのではないかと期待していますが…さて…。

ウィンドウへのattachと、その後の属性変更の反映

図形は、そのインスタンスを生成して、ウィンドウのオブジェクトにattachすることで、画面に描画されます。

この時、attachした後に図形インスタンスの属性を変更しても、再attach(…という概念は存在しないのかもしれませんが、それに類する処理)を必要とせずに、変更後の状態が表示されるのが、GUIに疎い自分には、へーという感じでした。

追記(2011/10/02): これはGUIどうこうではなく、attach関数がウィンドウに対して図形オブジェクトを参照渡しで関連付けるために、(値渡しによる)図形への変更が、ウィンドウに反映されるのでした。14章の14.1.3で理解しました。

ドリル

ドリル回答は、本文12.7のコードとの差分が少ないので、リンクは省略します。