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