Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

{

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));

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

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

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);

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

< image l:href="#"/>

Класс

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

struct Mark : Marks {

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

{

add(xy);

}

};

Функция

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

Класс

Mark
всего лишь позволяет легко создать объект класса
Marks
с единственной точкой, помеченной единственным символом. Стоило ли тратить силы, чтобы определять такой класс? Или он является следствием “ложного стремления к усложнениям и недоразумениям”? Однозначного и логичного ответа на этот вопрос нет. Мы много думали над этим и в конце концов решили, что для пользователей этот класс был бы полезен, а определить его было совсем нетрудно.

Почему в качестве метки используется символ? Можно было бы нарисовать любую маленькую фигуру, но символы нагляднее и проще. Они часто позволяют отделить одно множество точек от другого. К тому же такие символы, как

x
,
o
,
+
и
*
, обладают центральной симметрией.

  • Читать дальше
  • 1
  • ...
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: