第12章の練習問題はやらず。グラフィックス関係は解答例もない。第13章は、勉強になりそうな、練習問題2をやる。練習問題は、下記の通り。
角丸四角形を描画する。4つの直線と4つの弧で構成されるBOXクラスを定義する。
仕様としては、Rectangleに、rrという引数を追加することにした。このrrは、弧の半径だ。Rectangleの実装を真似て作ったのが、下記の解答例。P.436のdraw_line()関数は、基底クラスのShapeで仮想関数として定義されている関数なので、派生クラスごとに、同じ名前の関数を用意する必要がある。この部分が、最初わからず、少し苦労した。解答例は、下記の通り。
#include "Simple_window.h"
#include "Graph.h"struct Box : Shape {
Box(Point xy, int ww, int hh, int rr);
Box(Point x, Point y, int rr);
void draw_lines() const;int height() const { return h; }
int width() const { return w; }
private:
int h;
int w;
int r;
Point p;
};Box::Box(Point xy, int ww, int hh, int rr)
: w{ ww }, h{ hh }, r{ rr }, p{ xy }
{
if (h<=0 || w<=0 || r<=0) error("Bad Box: non-positive side");
if (h<=r*2 || w<=r*2) error("Bad Box: arc is too big");
}Box::Box(Point x, Point y, int rr)
: w{ y.x - x.x }, h{ y.y - x.y }, r{ rr }, p{ x }
{
if (h <= 0 || w <= 0 || r <= 0) error("Bad Box: non-positive side");
if (h <= r * 2 || w <= r * 2) error("Bad Box: arc is too big");
}void Box::draw_lines() const
{fl_line(p.x + r, p.y , p.x + w - r, p.y );
fl_line(p.x + r, p.y + h , p.x + w - r, p.y + h );
fl_line(p.x , p.y + r, p.x , p.y + h - r);
fl_line(p.x + w , p.y + r, p.x + w , p.y + h - r);
fl_arc(p.x, p.y, r+r, r+r, 90, 180);
fl_arc(p.x + w -r-r, p.y, r + r, r + r, 0, 90);
fl_arc(p.x, p.y + h - r - r, r + r, r + r, 180, 270);
fl_arc(p.x + w - r - r, p.y + h - r - r, r + r, r + r, 270, 360);
}int main()
{
using namespace Graph_lib;
Point tl(100, 100);
Simple_window win(tl, 600, 400, "Canvas");
Box b{ Point{100,100},100,100,10};win.attach(b);
win.wait_for_button();
}
コメント