Окт 16

Вывод временной диаграммы напряжения переменного электрического тока

Приложение U_T_Diagram демонстрирует использование страничной системы координат, создание логических перьев, рисование различных линий, создание логических шрифтов, вывод текста с применением разных шрифтов.
В программе решается задача формирования и вывода на экран временной диаграммы напряжения переменного электрического тока. Действующее значение напряжения — 220 В, частота — 50 Гц. Диаграмма строится для промежутка времени, в котором происходят ровно два периода колебаний.
На рис. 2.37 показано окно приложения Черно-белый рисунок трансформирует различные цвета в оттенки серого и поэтому не передает всей красоты созданной диаграммы. Например, линии координатной сетки на самом деле имеют зеленоватый цвет, а синусоида графика — малиновый цвет. Если вы хотите все-таки насладиться этой красотой, то придется ввести в компьютер прилагаемый ниже текст программы, откомпилировать и запустить ее.
Период синусоидальных колебаний Т связан с их частотой / соотношением Т= \/f, поэтому для частоты 50 Гц период составляет 0,02 с, или 20 мс. Также полезно вспомнить, что действующее значение напряжения переменного тока U связано с его амплитудным значением Um соотношением U = 0,707 х Um. Из этого следует, что амплитудное значение напряжения равно 311,17 В.
Для улучшения внешнего вида графика используются не только разные цвета линий, но и разная толщина. Линии координатной сетки рисуются толщиной 1 пиксел, оси X и У — толщиной 3 пиксела, а сама синусоида — толщиной 5 пикселов.
Прежде чем привести листинг программы, сделаем некоторые пояснения по поводу выбора и настройки координатной системы. Размышления над сутью решаемой задачи приводят нас к убеждению, что здесь можно обойтись без аффинных преобразований и, следовательно, нас вполне устроит страничная система координат.
Физическую область вывода (viewport) стоит привязать к клиентской области окна, размеры которой можно получить при помощи функции GetClientRect. Благодаря этому рисунок будет автоматически масштабироваться при изменении размеров основного окна приложения.
Теперь подумаем, как нам организовать логическую область вывода (window). Казалось бы, здесь удобно использовать логические единицы, присущие данной проблемной области, то есть по оси абсцисс — миллисекунды, а по оси ординат — вольты. Но если выбрать эти логические единицы, то возникнет очень неприятная проблема. Фактически, мы потеряем контроль над толщиной пера, используемого для прорисовки линий. Это раз. Кроме того, толщина пера окажется разной при рисовании по горизонтали и по вертикали, так как она будет определяться масштабными коэффициентами тх и ту1. Это два.
Причиной перечисленных неприятностей являются особенности реализации в Win32 API объекта логического пера. Дело в том, что в вызове функции CreatePen(penStyLe, nWidth, crColor) параметр nWidth задает толщину пера именно в логических единицах. Исключением является нулевое значение nWidth,определяющее перо толщиной 1 пиксел независимо от установленных координатных преобразований.