PPPUC++#17

15. Graphing Functions and Data

"The best is the enemy of the good." - Voltaire
いろんな分野でグラフ化が必要

  • 実験などの場合:データ
  • 数学的モデルを使う場合:関数

この章ではそういったグラフィックスを扱います。
対象は1変数関数、ファイルからのデータ入力

15.1 Introduction

  • 本格的なソフトウェアシステムに比べたら非常に原始的ですが、、、
    • 出力品質を競ってるわけじゃなくて、システムの理解のしやすさを最優先しているわけです
  • 設計技術、プログラミング技術、基本的な数学ツールなど >>> 特定のグラフィックス機能
    • というわけで、グラフィックスに気をとられて、より根源的かつ長期的な価値のある、本当の技術を見落とさないでねー、とのこと

15.2 Graphing simple functions

  • まずは
    • ..... どんなのかけるか書いてみよー
  • 放物線と水平線と傾いた線の例
    • この章のテーマはグラフ。よって水平線とか今までのようなLineであらわすんじゃなくもちろん「関数」で
double one(double) {return 1;}
      • なるほど
    • 引数名の省略に注意! ってやつですね
  • あとは 傾き 1/2の直線とか
double slope(double x) {return x/2;}
  • あとは放物線
double square(double x) {return x*x;}
      • いかんさすがにアクビ出てきた ^^;
  • Function classに食わせてグラフを作ります。Windowへの表示は例によってattachにて
  • ラベルというか凡例をTextで追加するサンプルとか
  • Functionのコンストラクタ , 7つも引数あってあほか、バグの温床じゃ。なんだけど、必要なんだよーあとで説明するよーとか
    • そうかこの期に及んでまだデフォルトやってなかったんだっけ
      • もう少しの我慢
  • ラベル付けと着ましょう。グラフもコードも自己完結で
    • Textです
  • 座標軸も必須です
    • Axisで
  • もっとかっこよく、、、というのは間違い。そう "The best is the enemy of the good."
    • 引き際を知ろう

15.3 Function

  • 単純。必要回数だけ Fctの関数ポインタを呼び出してy座標をゲットする実装です
  • パラメータを後からゲットすることは出来ないし、関数を変更することもできないけどExerciseでやるみたい
15.3.1 Default arguments
  • やっと来たです
  • さっき文句言ってたFunctionのコンストラクタの最後の x_scale, y_scale, ほとんどの場合25なので、省略したい。
    • n_pointsも
  • というわけで宣言部で値を代入してしまうdefault arguments!
  • 何個もoverloaded function書けばでも同じI/Fできるけど、こっちのほが楽
    • しかもdefault!という意図がはっきりする
  • お約束なんだけど、デフォルト引数は最後の引数から連続してしかだめよ、と。
    • そりゃそうですよね。途中の引数を省略したことをどうやって知れと言うのか!
      • いや、 ,, てな感じでいいじゃん、と思うけど。。。。
  • 確かに上手く使えば便利なdefault。しかし微妙だなーと思ったら使わないほうが良いです。defaultは強制ではありません
15.3.2 More examples
  • もっともっと
    • 標準関数(cos, sin, exp etc..)だとかの Float -> Float な関数ならなんでもOKだし。
    • 合成しても良いし
  • log(0)が-∞なので0.000001とか(またMagicNum(ry)
  • 標準数学関数は cmathのインクルードにて
      • ていうかこの絵、けっこうカオス


*1

15.4 Axis

  • 座標軸の無いグラフっていかにもぁやしぃ
  • Axis!
    • 直線とノッチとラベルが責務
      • ちゃっかり labelと notchesはpublicだったりして、前の章でいってることと・・・
      • まあ確かに全I/F作るのはめんどい
  • 各要素はコンストラクタでさっさと生成してしまう方針
      • 実装微妙. caseでX軸とY軸分けして、コピペコード
      • これなら妙な第一引数で Orientation とかするより、メソッド分けちゃった方が個人的には好き
    • あと冗談のように case Axis::z: {error ("z axis not implemented"); } があってなんか挑戦状状態です。やです。やりません。

*1:この絵のタイムスタンプみたら04/27ってどんだけサボっとんじゃ僕…