Иллюстрированный самоучитель по Visual Studio.Net



Класс графика - часть 3


Операцию выбора шага сетки, удовлетворяющую этим условиям, удобно выполнить в глобально определенной функции, не принадлежащей классу CGraph. Это дает возможность использовать функцию для нужд других алгоритмов и классов. Ниже приведена функция gScale, которая выполняет подбор шага сетки. Мы постепенно дадим содержимое всего файла Graph.срр, поэтому вы можете полностью убрать существующие коды заготовки. Начало файла имеет такой вид:

#include"StdAfx.h"

#include "graph.h"

//===== Доля окна, занимаемая графиком

#define SCAT,F,_X 0 . 6

#define SCALE_Y 0.6

//=== Внешняя функция нормировки мантисс шагов сетки

void gScale (double span, doubles step)

{

//== Переменная span определяет диапазон изменения

//== значаний одной из координат точек графика

//== Вычисляем порядок числа, описывающего диапазон

int power = int(floor(loglO(span)));

//===== Множитель (zoom factor)

double factor = pow(10, power);

//===== Мантисса диапазона (теперь 1 < span < 10)

span /= factor;

//===== Выбираем стандартный шаг сетки if (span<1.99)

step=.2;

else if (span<2.49)

step=.25;

else if (span<4.99)

step=.5;

else if (span<10.)

step= 1.;

//===== Возвращаем реальный шаг сетки (step*10~power)

step *= factor;

}

Результатом работы функции gScale является значение мантиссы дискретного шага сетки, которая наносится на график и оцифровывает оду из осей. Самым сложным местом в алгоритме разметки осей является метод CGraph:: Scale. Он по очереди работает для обеих осей и поэтому использует параметр с данными типа TData, описывающими конкретную ось. Особенностью алгоритма является реализация идеи, принадлежащей доценту СПбГТУ Александру Калимову и заключающейся в том, чтобы как можно дольше не переходить к экспоненциальной форме записи чисел. Обычно Калимов использует форму с фиксированной запятой в диапазоне 7 порядков изменения чисел (10~3+104), и это дает максимально удобный для восприятия формат, повышая читабельность графика:



Содержание  Назад  Вперед