第13章練習問題2

  • 投稿日:
  • by
  • カテゴリ:

 第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();
}