Учебник по Visual C++ .Net


Класс графика С помощью Studio.Net - часть 3


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

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), и это дает максимально удобный для восприятия формат, повышая читабельность графика:

void CGraph::Scale (TDatai data)

{

//===== С пустой последовательностью не работаем

if (m_Points.empty()) return;

//===== Готовимся искать экстремумы

data.Max = data.bX ? m_Points [0] .х : m_Points [0] .у;

data.Min = data.Max;

//===== Поиск экстремумов

for (UINT j=0; j<ra_Point5.size(); j++)

{

double d = data.bX ?

m_Points [ j] .x

: m_Points [ j] . y;

if (d < data.Min) data.Min = d;

if (d > data.Max) data.Max = d;

}

//===== Максимальная амплитуда двух экстремумов

double ext = max(fabs(data.Min),fabs(data.Max));

//===== Искусственно увеличиваем порядок экстремума

//===== на 3 единицы, так как мы хотим покрыть 7 порядков,

//===== не переходя к экспоненцеальной форме чисел

double power = ext > 0.? loglO(ext) +3. : 0.;

data.Power = int(floor(power/7.));




Начало  Назад  Вперед



Книжный магазин