Вспомогательная функция
Напомним, что идеи, заложенные в алгоритме выработки цифровой метки на оси графика, принадлежат Александру Калимову, а сам алгоритм разрабатывался при его активном участии. Функция Make Label понадобилась нам в связи с тем, что переход к экспоненциальной форме числа требует некоторых усилий. Мы надеемся, что он будет происходить достаточно редко, так как алгоритм генерации цифровой метки использует методику "жизни без порядка в диапазоне семи порядков", описанную выше. Однако если все-таки диапазон изменения функции или даже координаты X выйдет за обозначенные пределы, то экспоненциальная форма неизбежна. При всем этом мы должны попытаться не делать метку слишком длинной.
Экспоненциальная форма создается нами так, чтобы она была более компактной. Если доверить эту работу функциям системы, то они припишут знак порядка и лидирующие нули, от которых необходимо избавиться. Но если ее укоротить слишком сильно, то невозможно будет различить две соседние метки. Поэтому при определении количества необходимых разрядов мантиссы анализируется шаг сетки вдоль текущей оси графика. Вся эта черновая работа и производится в теле функции MakeLabel:
CString CGraph::MakeLabel(bool bX, doubles v) { CString s = "0.0"; if (v == 0.) return s; //====== Сначала делаем грубую прикидку //====== Пробуем поместиться в 20 позиций s.Format("%20.10f",v); //====== Выясняем порядок шага сетки, //====== переворачивая его знак (трюк) int nDigits = int(ceil(-loglO(bХ?m_DataX.Step : m_DataY.Step))); //====== Если все изменения происходят до запятой, //====== то цифры после запятой нас не интересуют if (nDigits <= 0) nDigits = -1; else if (bХ) nDigits++; // Эстетическая добавка //====== Слева усекаем все s.TrimLeft (); //====== Справа оставляем минимум разрядов s = s.Left(s.Find(".") + nDigits + 1); int iPower = bX? m_DataX.Power: m_DataY.Power; (//====== Нужен ли порядок? if (iPower!= 0) { //=== Нужен, если не поместились в (10"-3, 10 А +4) CString add; add.Format("-e%+d",iPower); s += add; } return s; }
В настоящий момент можно запустить проект на выполнение. Вы должны увидеть распределение поля, изображенное на рис. 11.3.
Вид кривой определяется параметрами задачи, заданными нами по умолчанию. В рамках этой книги, носящей учебный характер, мы не собираемся разрабатывать достаточно серьезный инструмент для исследования решений краевых задач матфизики, однако, введя диалог по изменению параметров задачи, можем сделать нечто большее, чем просто учебный пример, иллюстрирующий использование динамических структур данных.
Рис. 11.3. Распределение поля для набора данных по умолчанию