Литмир - Электронная Библиотека
A
A

mpl.add(Point(150,200));

mpl.add(Point(250,250));

mpl.add(Point(300,200));

В результате выполнения этого фрагмента программы получим следующий результат:

Программирование. Принципы и практика использования C++ Исправленное издание - _144.png

Определение класса

Marked_polyline
имеет следующий вид:

struct Marked_polyline:Open_polyline {

  Marked_polyline(const string& m):mark(m)

  {

  if (m=="") mark = "*";

  }

  void draw_lines() const;

private:

  string mark;

};

Поскольку этот класс является наследником класса

Open_polyline
, можем свободно обрабатывать объекты класса
Point
, и все что нам для этого необходимо — иметь возможность ставить метки. В частности, функция
draw_lines()
примет следующий вид:

void Marked_polyline::draw_lines() const

{

  Open_polyline::draw_lines();

  for (int i=0; i<number_of_points(); ++i)

    draw_mark(point(i),mark[i%mark.size()]);

}

Вызов функции

Open_polyline::draw_lines()
рисует линии, так что остается просто расставить метки. Эти метки представляют собой строки символов, которые используются в определенном порядке: команда
mark[i%mark.size()]
выбирает символ, который должен быть использован следующим, циклически перебирая символы, хранящиеся в объекте класса
Marked_polyline
. Оператор
%
означает деление по модулю (взятие остатка). Для вывода буквы в заданной точке функция
draw_lines()
использует вспомогательную функцию меньшего размера
draw_mark()
.

void draw_mark(Point xy, char c)

{

  static const int dx = 4;

  static const int dy = 4;

  string m(1,c);

  fl_draw(m.c_str(),xy.x–dx,xy.y+dy);

}

Константы

dx
и
dy
используются для центрирования буквы относительно заданной точки. Объект
m
класса хранит единственный символ
c

13.15. Класс Marks

Иногда необходимо вывести метки отдельно от линий. Для этого предназначен класс

Marks
. Например, мы можем пометить четыре точки, использованные в предыдущих примерах, не соединяя их линиями.

Marks pp("x");

pp.add(Point(100,100));

pp.add(Point(150,200));

pp.add(Point(250,250));

pp.add(Point(300,200));

В итоге будет получено следующее изображение:

Программирование. Принципы и практика использования C++ Исправленное издание - _145.png

Очевидно, что класс

Marks
можно использовать для отображения дискретных данных, изображать которые с помощью ломаной было бы неуместно. В качестве примера можно привести пары (рост, вес), характеризующие группу людей.

Класс

Marks
— это разновидность класса
Marked_polyline
с невидимыми линиями.

struct Marks : Marked_polyline {

  Marks(const string& m) :Marked_polyline(m)

  {

    set_color(Color(Color::invisible));

  }

};

13.16. Класс Mark

Объект класса

Point
задает координаты в объекте класса
Window
. Иногда мы их отображаем, а иногда нет. Если возникает необходимость пометить отдельную точку, чтобы ее увидеть, мы можем изобразить ее в виде крестиков, как показано в разделе 13.2, или воспользоваться классом
Marks
. Это объяснение слегка многословно, поэтому рассмотрим простой объект класса
Marks
, инициализированный точкой и символом.

Например, мы могли бы пометить центры окружностей, изображенных в разделе 13.12, следующим образом:

Mark m1(Point(100,200),'x');

Mark m2(Point(150,200),'y');

Mark m3(Point(200,200),'z');

c1.set_color(Color::blue);

c2.set_color(Color::red);

c3.set_color(Color::green);

В итоге мы получили бы изображения, приведенные ниже.

Программирование. Принципы и практика использования C++ Исправленное издание - _146.png

Класс

Mark
— это разновидность класса
Marks
, в котором при создании объекта немедленно задается начальная (и, как правило, единственная) точка.

struct Mark : Marks {

  Mark(Point xy, char c) : Marks(string(1,c))

  {

    add(xy);

  }

};

Функция

string(1,c)
— это конструктор класса
string
, инициализирующий строку, содержащую единственный символ
c
.

184
{"b":"847443","o":1}