Жасмин Бланшет

Книги → QT 4: программирование GUI на С++ → Двойная буферизация

Этим мы завершаем построение класса Plotter. Остается только рассмотреть несколько функций настроек графика PlotSettings.

265 PlotSettings::PlotSettings()

266 {

267 minX = 0.0;

268 maxX = 10.0;

269 numXTicks = 5;

270 minY = 0.0;

271 maxY = 10.0;

272 numYTicks = 5;

273 }

Конструктор PlotSettings инициализирует обе оси координат диапазоном от 0 до 10 с пятью отметками.

274 void PlotSettings::scroll(int dx, int dy)

275 {

276 double stepX = spanX() / numXTicks;

277 minX += dx * stepX;

278 maxX += dx * stepX;

279 double stepY = spanY() / numYTicks;

280 minY += dy * stepY;

281 maxY += dy *stepY;

282 }

Функция scroll() увеличивает (или уменьшает) minX, maxX, minY и maxY на интервал между двух отметок, помноженный на заданное число. Данная функция применяется для реализации скроллинга в функции Plotter::keyPressEvent().

283 void PlotSettings::adjust()

284 {

285 adjustAxis(minX, maxX, numXTicks);

286 adjustAxis(minY, maxY, numYTicks);

287 }

Функция adjust() вызывается из mouseReleaseEvent() для округления значений minX, maxX, minY и maxY, чтобы получить «удобные» значения, и определения количества меток на каждой оси. Закрытая фyнкция adjustAxis() выполняет эти действия отдельно для каждой оси.

288 void PlotSettings::adjustAxis(double &min, double &max, int &numTiсks)

289 {

290 const int MinTicks = 4;

291 double grossStep = (max - min) / MinTicks;

292 double step = pow(10.0, floor(log10(grossStep)));

293 if (5 * step < grossStep) {

294 step *= 5;

295 } else if (2* step < grossStep) {

296 step *= 2;

297 }

298 numTicks = int (ceil(max / step) - floor(min / step));

299 if (numTicks < MinTicks)

300 numTicks = MinTicks;

301 min = floor(min / step) * step;

302 max = ceil(max / step) * step;

303 }

Функция adjustAxis() преобразует свои параметры min и max в «удобные» числа и устанавливает свой параметр numTicks на количество меток, которое, по ее расчету, подходит для заданного диапазона [min, max]. Поскольку в функции adjustAxis() фактически требуется модифицировать переменные (minX, maxX, numXTicks и так далее), а не просто копировать их, для этих параметров не используется модификатор const. Большая часть программного кода в adjustAxis() предназначена просто для определения соответствующего значения интервала между двумя метками (переменная step — шаг). Для получения на оси удобных чисел мы должнытщательно выбирать этот шаг. Например, значение шага 3.8 привело бы к появлению на оси чисел, кратных 3.8, что затрудняет восприятие диаграммы человеком. Для осей с десятичной системой обозначения «удобными» значениями шага являются числа вида 10n, 2 • 10n или 5 • 10n.

Мы начинаем расчет с «крупного шага», то есть с определенного максимального значения шага. Затем мы находим число вида 10n, меньшее или равное крупному шагу. Мы его получаем путем взятия десятичного логарифма от крупного шага, затем округляем полученное значение до целого числа, после чего возводим 10 в степень, равную этому округленному значению. Например, если крупный шаг равен 236, мы вычисляем log 236 = 2.37291…; затем мы округляем это значение до 2 и получаем 102 = 100 в качестве кандидата на значениешага в форме числа 10n.

← предыдущая следующая →

Страницы раздела: 1 2 3 4 5 6 7 8 9 10 11 12 13

Публикация компанией Dropbox кода Zulip – средства общения для IT-разработчиков

20.11.2015
Одной из одобрительно встреченных программистами инициатив, реализующихся в рамках акции Hack Week, стала публикация исходного кода приложения Zulip – веб-приложения для общения между собой разработчиков в сфере IT-технологий.

Объединение ОС Android и Chrome

17.11.2015
Слухи об объединении двух крупнейших ОС компании Google, Android и Chrome, гуляют по Интернету уже более 5 лет, но до сих пор этого не случилось, хотя очевидно, что с течением времени эти ОС становятся всё более похожими: так, в последнее время появилось немало Android-устройств, к которым прилагаются клавиатуры, а Chrome OS «научилась» работать с сенсорными экранами.

Конференция Linux Piter 2015

15.11.2015
Уже почти через неделю в Санкт-Петербурге впервые в истории пройдёт конференция, посвящённая проблемам свободного программного обеспечения – Linux Piter 2015.