Как напечатать график функции в с visual studio
Используя данный пример, можно создавать собственные программы для построения графиков других функций. По желанию можно модернизировать работу программы по своему усмотрению.
Содержание
Поиск на других ресурсах:
Условие задачи
Задана формула функции двух переменных z = sin(x) + cos(y) . Разработать приложение, которое рисует график этой функции в отдельной форме.
Дополнительно реализовать поворот графика влево, вправо, вверх, вниз. Также нужно выводить оси OX , OY , OZ .
⇑
Математическая постановка задачи
Построение графика функции двух переменных есть математически решаемой задачей, в которой используются известные формулы вычисления.
График функции двух переменных z(x,y) строится в параллелепипеде с размерами (xx1, xx2) , (yy1, yy2) , (zz1, zz2) .
Для использования поворота системы в 3-мерном пространстве возникает понятие точки ( x0 , y0 , z0), относительно которой происходит поворот системы координат.
Также возникает понятие углов:
-
(альфа) – поворот системы относительно оси OZ ; (бета) – поворот системы относительно оси OX .
Сдвиг в точку ( x0 , y0 , z0 ) с учетом поворота на углы и описывается известными соотношениями
После перемножения матриц получаем формулу для вычисления:
По этой формуле будет происходить преобразование системы координат и масштабирование (рисунок 1).
Рис. 1. Сдвиг и поворот системы координат
Необходимо определиться, в какой плоскости монитора будут лежать оси координат OX , OY , OZ . Принимаем, что в плоскости монитора лежат оси OX и OY . А ось OZ перпендикулярна экрану.
Координаты расчетной точки (x, y) прижимаются к точке (0, 0) по формулам:
где A , a – коэффициенты перспективы, которые подбираются экспериментально в зависимости от функции.
⇑
Выполнение
1. Создание проекта как Windows Forms Application
Создать проект. Подробный пример создания проекта по шаблону Windows Forms Application описывается здесь . Автоматически создается главная форма приложения. Имя исходного модуля главной формы « Form1.cs «.
⇑
2. Создание формы Form1 .
Создать форму по образцу, как показано на рисунке 2.
Настроить следующие свойства компонент и формы:
- в форме Form1 свойство Text = « График функции двух переменных «;
- в форме Form1 свойство MaximizeBox = False ;
- в форме Form1 свойство StartPosition = « CenterScreen «;
- в компоненте button1 свойство Text = « Показать график функции … «.
⇑
3. Создание формы Form2 .
Создать новую форму. Подробный процесс создания новой формы описывается здесь .
Имена файлов формы « Form2.cs » и « Form2.Designer.cs «.
Разместить на форме четыре компонента типа Button. Автоматически создается четыре объекта с именами button1, button2, button3, button4.
Настроить свойства компонент и формы следующим образом:
- в форме Form2 свойство StartPosition = «CenterScreen»;
- в форме Form2 свойство Text = « График функции z = f(x,y) «;
- в компоненте button1 свойство Text = « ^ «;
- в компоненте button2 свойство Text = « v «;
- в компоненте button3 свойство Text = « < «;
- в компоненте button4 свойство Text = « > «.
Приблизительный вид формы Form2 изображен на рисунке 3.
4. Ввод внутренних переменных в форму Form2 .
Все внутренние переменные, использующиеся для организации вывода графика, размещаются в классе формы Form2. Поэтому, сначала надо активизировать модуль « Form2.pas ».
В модуль формы Form2 вводятся следующие внутренние переменные с классом видимости private:
- xx1, xx2, yy1, yy2 – соответствуют координатам точек, которые отображаются на экране монитора;
- массивы xx и yy предназначены для вывода плоскости из 4-х точек. Область определения функции z = f(x, y) разбивается на прямоугольники, на любом из которых функция экстраполируется ребрами четырехугольника.
В разделе public вводятся:
- переменные X_min , Y_min , X_max , Y_max вещественного типа, которые представляют реальные координаты параллелепипеда, в котором выводится график функции. Эти переменные заполняются из основной формы Form1 экспериментальным путем:
- переменные alfa, beta вещественного типа, которые отображают углы наблюдения за графиком функции. Заполняются из главной формы Form1;
- переменные x0, y0, z0 вещественного типа. Отображают величины из главной формулы вычисления (см. математическую постановку задачи);
- переменная A вещественного типа. Представляет коэффициент перспективы и подбирается экспериментально;
- переменная f_show логического типа используется для указания того, что нужно перерисовать график, в случае изменения положения углов alfa и beta.
После введения переменных в текст программы, фрагмент класса формы Form2 имеет вид:
Переменные, имеющие идентификатор доступа public, заполняются из формы Form1 .
⇑
5. Программирование внутренних методов в форме Form2 .
В текст класса Form2 вводятся три дополнительных метода:
- функция преобразования системы координат и масштабирования Zoom_XY() ;
- функция func() для которой выводится график;
- функция рисования графика Show_Graphic().
Листинг метода преобразования системы координат следующий:
Листинг метода func() следующий.
В этом методе вместо строки
можно сделать вставку собственной функции.
Непосредственный вывод графика функции реализован в методе Show_Graphic() . Листинг метода Show_Graphic() следующий.
Объясним некоторые фрагменты кода в методе Show_Graphic().
Область определения функции z = f(x,y) разбивается на прямоугольники, на любом из которых функция экстраполируется с ребрами четырехугольника. Построение четырехугольников на экране реализуется с помощью метода DrawLine().
После очистки канвы происходит рисование осей координат и методом DrawLine() выводятся фрагменты поверхности.
При рисовании поверхности, из метода Show_Graphic() вызывается метод Zoom_XY(), что осуществляет преобразование и масштабирование из реальных координат в экранные координаты.
⇑
6. Программирование события Paint формы Form2.
Обработчик события Form2_Paint() получает два параметра. Первый параметр типа System.Object , второй параметр типа PaintEventArgs .
Параметр типа PaintEventArgs содержит объект Graphics, необходимый для рисования на поверхности формы.
Листинг обработчика события Form2_Paint() следующий.
⇑
7. Программирование обработчиков событий клика на кнопках button1, button2, button3, button4.
Поворот графика происходит в момент, когда пользователь делает клик на одной из кнопок, размещенных на форме Form2 (элементы управления button1, button2, button3, button4).
Отображение графика зависит от внутренних переменных alfa и beta. Переменная alfa содержит угол поворота относительно оси OZ . Переменная beta содержит значение угла поворота вокруг оси OX .
Поэтому, в обработчиках событий происходит изменение значений alfa и beta на некоторую величину. По желанию, можно установить собственную величину изменения alfa и beta.
Листинг обработчиков событий приведен ниже.
В вышеприведенных обработчиках событий, событие Paint генерируется явно с помощью унаследованного метода Invalidate(). Этот метод делает перерисовывание всей клиентской области программным путем.
Метод Invalidate() имеет несколько перегруженных вариантов. Например, если нужно обновить заданный прямоугольник, то нужно создать такой код:
⇑
8. Программирование обработчиков событий MouseDown, MouseMove и MouseUp.
Для осуществления поворота графика с помощью мышки нужно запрограммировать соответствующие обработчики событий.
Если нажать клавишу мыши и удерживать ее нажатой над формой Form2, а потом отпустить, то генерируются такие события (рисунок 4):
- MouseDown – генерируется, если пользователь делает клик мышкой на форме Form2;
- MouseMove – генерируется, если пользователь перемещает мышку над формой Form2 (независимо, нажата ли одна из кнопок мышки);
- MouseUp – генерируется, если пользователь отпускает кнопку мышки после нажатия.
⇑
9. Листинг модуля « Form2.cs ».
Ниже приведен полный текст файла ” Form2.cs ”, который соответствует форме Form2.
⇑
10. Программирование события клика на кнопке button1 формы Form1 (вызов формы рисования графика функции).
При клике на кнопке button1 из формы Form1 может выводиться график функции.
Обработчик события клика на кнопке Button1 имеет вид.
11. Запуск программы.
После запуска программы на выполнение, форма графика функции изображена на рисунке 5.
БлогNot. Visual C++: построение графиков с интерпретацией введённой пользователем функции
Visual C++: построение графиков с интерпретацией введённой пользователем функции
В принципе, вся нужная информация есть вот здесь, сделаем по ней законченный проект.
Структура основной формы показана на рисунке, компоненты в panel1 перечислены по порядку в форме слева направо, что обеспечивает и нормальный порядок обхода полей по клавише табуляции.
основная форма приложения
Текстовым полям можно ограничить максимальный размер вводимой строки (свойство MaxLength ). Также panel1 расположена со свойством Dock=Top , а chart1 со свойством Dock=Fill . Это обеспечит нормальное взаимодействие компонент при изменении размеров окна. У самой формы выставлены Size и MinimumSize в значение 640; 400 - чтобы не "исчезали" кнопки при уменьшении окна.
Текстовым полям также даны значения по умолчанию, дробные части вещественных чисел при этом отделены точкой, а не запятой - будем так делать во всём проекте.
Как альтернатива, можно формировать вещественные значения полей динамически в зависимости от текущего разделителя (например, по событию Load формы 1):
В форму также добавлено глобальное свойство типа NumberFormatInfo
которое проинициализировано в её конструкторе:
Парсер тот же, что по ссылке выше. Вот полный код фрагмента:
Единственная новая по отношению к статье мелочь -
Если национальные стандарты предполагают, что дробная часть вещественного числа отделяется от целой запятой, а не точкой, вместо оператора
используйте конструкцию
Добавим в проект вторую форму, куда можно будет выводить таблицы данных из диаграммы. Для этого обратимся к меню Проект - Добавить новый элемент - Форма Windows Forms и назовём её Form2 . На вторую форму добавим DataGridView , поставим ему свойства Dock=Fill , ScrollBars=Vertical и подготовим 2 столбца для вывода значений X и Y:
вторая форма - вывод таблицы значений функции
У этой формы будет единственный публичный метод - принять пару значений (x,y) и добавить их в таблицу:
Такой код метода Do работает при установке свойства
так как при значении true в таблице есть "дополнительная" пустая строка, которая тоже участвует в нумерации.
А вызывать этот метод будет вторая кнопка tab с первой формы (функция button2_Click ), при этом, сначала создастся новый экземпляр Form2 , чтобы можно было сравнить несколько таблиц:
Чтобы это сработало, заинклудьте заголовки второй формы в начале кода Form1.h :
Разумеется, сам парсер тоже подлючён. Это весь проект, можно собирать. Вот пример работы программы:
пример работы программы
Выражения в парсере пишутся "не совсем на C++", загляните в файл parser.cpp и увидите это, ещё лучше, можете модифицировать код парсера под свои нужды. Ну и ещё много что можно улучшить, а я выложу проект в текущем "образовательном" состоянии.
P.S. Для совместимости с Visual Studio 2015 достаточно сделать вот такой главный файл проекта Lab4.cpp :
- округлять вводимые и вычисляемые значения до некого удобного количества знаков в дробной части;
- ограничить максимальное количество узлов сетки, например, некой константой maxCollectionSize . При "слишком большом" размере коллекции Dictionary приложение может зависнуть, а какой размер "слишком большой", знает только Studio;
- найти минимальное и максимальное значения функции, назначив их затем меткам оси Y, выполнить ту же работу и для оси X;
- следить, не получилось ли при расчёте "не-число" Y с помощью isnan(y) || isinf(y) ;
- следить, не добавляются ли повторно в коллекцию элементы с тем же ключом, с помощью ContainsKey и т.д.
Вот набросок чуть "улучшенного" проекта для Studio 2015:
P.P.S. Решение едва ли предназначено для консольных приложений из-за не слишком удобных преобразований между строками библиотеки .NET и "классическими" строками std::string или char * . Тем не менее, поизвращаться, конечно, можно, скажем, вот такой код главного модуля проекта годится для консольного приложения Visual Studio 2015:
Как видно из примера, нам пришлось дополнительно написать собственную функцию str_replace для замены строки char * на другую строку, чтобы обеспечить циклическую подстановку значений x в табулируемую функцию f(x) .
А вот архив с этим проектом Visual Studio 2015, с точностью до платформы (выбирается вверху из списков "Конфигурации решения", "Платформы решения") должно работать везде :) Конечно же, выражение для нужной функции от аргумента "x" малое и нужные пределы изменения аргумента вы можете не только задать константами, но и прочитать откуда-то (с той же консоли или из файла).
скриншот вывода консольного приложения
В принципе, вся нужная информация есть вот здесь, сделаем по ней законченный проект.
Структура основной формы показана на рисунке, компоненты в panel1 перечислены по порядку в форме слева направо, что обеспечивает и нормальный порядок обхода полей по клавише табуляции.
основная форма приложения
Текстовым полям можно ограничить максимальный размер вводимой строки (свойство MaxLength ). Также panel1 расположена со свойством Dock=Top , а chart1 со свойством Dock=Fill . Это обеспечит нормальное взаимодействие компонент при изменении размеров окна. У самой формы выставлены Size и MinimumSize в значение 640; 400 — чтобы не "исчезали" кнопки при уменьшении окна.
Текстовым полям также даны значения по умолчанию, дробные части вещественных чисел при этом отделены точкой, а не запятой — будем так делать во всём проекте.
Как альтернатива, можно формировать вещественные значения полей динамически в зависимости от текущего разделителя (например, по событию Load формы 1):
В форму также добавлено глобальное свойство типа NumberFormatInfo
которое проинициализировано в её конструкторе:
Парсер тот же, что по ссылке выше. Вот полный код фрагмента:
Единственная новая по отношению к статье мелочь —
Если национальные стандарты предполагают, что дробная часть вещественного числа отделяется от целой запятой, а не точкой, вместо оператора
используйте конструкцию
Добавим в проект вторую форму, куда можно будет выводить таблицы данных из диаграммы. Для этого обратимся к меню Проект — Добавить новый элемент — Форма Windows Forms и назовём её Form2 . На вторую форму добавим DataGridView , поставим ему свойства Dock=Fill , ScrollBars=Vertical и подготовим 2 столбца для вывода значений X и Y:
вторая форма — вывод таблицы значений функции
У этой формы будет единственный публичный метод — принять пару значений (x,y) и добавить их в таблицу:
Такой код метода Do работает при установке свойства
так как при значении true в таблице есть "дополнительная" пустая строка, которая тоже участвует в нумерации.
А вызывать этот метод будет вторая кнопка tab с первой формы (функция button2_Click ), при этом, сначала создастся новый экземпляр Form2 , чтобы можно было сравнить несколько таблиц:
Чтобы это сработало, заинклудьте заголовки второй формы в начале кода Form1.h :
Разумеется, сам парсер тоже подлючён. Это весь проект, можно собирать. Вот пример работы программы:
пример работы программы
Выражения в парсере пишутся "не совсем на C++", загляните в файл parser.cpp и увидите это, ещё лучше, можете модифицировать код парсера под свои нужды. Ну и ещё много что можно улучшить, а я выложу проект в текущем "образовательном" состоянии.
P.S. Для совместимости с Visual Studio 2015 достаточно сделать вот такой главный файл проекта Lab4.cpp :
- округлять вводимые и вычисляемые значения до некого удобного количества знаков в дробной части;
- ограничить максимальное количество узлов сетки, например, некой константой maxCollectionSize . При "слишком большом" размере коллекции Dictionary приложение может зависнуть, а какой размер "слишком большой", знает только Studio;
- найти минимальное и максимальное значения функции, назначив их затем меткам оси Y, выполнить ту же работу и для оси X;
- следить, не получилось ли при расчёте "не-число" Y с помощью isnan(y) || isinf(y) ;
- следить, не добавляются ли повторно в коллекцию элементы с тем же ключом, с помощью ContainsKey и т.д.
Вот набросок чуть "улучшенного" проекта для Studio 2015:
P.P.S. Решение едва ли предназначено для консольных приложений из-за не слишком удобных преобразований между строками библиотеки .NET и "классическими" строками std::string или char * . Тем не менее, поизвращаться, конечно, можно, скажем, вот такой код главного модуля проекта годится для консольного приложения Visual Studio 2015:
Как видно из примера, нам пришлось дополнительно написать собственную функцию str_replace для замены строки char * на другую строку, чтобы обеспечить циклическую подстановку значений x в табулируемую функцию f(x) .
А вот архив с этим проектом Visual Studio 2015, с точностью до платформы (выбирается вверху из списков "Конфигурации решения", "Платформы решения") должно работать везде 🙂 Конечно же, выражение для нужной функции от аргумента "x" малое и нужные пределы изменения аргумента вы можете не только задать константами, но и прочитать откуда-то (с той же консоли или из файла).
скриншот вывода консольного приложения
Построить график функции
Построить график функции
Здравствуйте, помогите пожалуйста! Построить график функции. Таблицу данных получить путём.
Построить график функции
Помогите построить график функции y=ax^2+6 используя ZedGraph.
Построить график функции у = Ln x
может кто решить задачку. Построить график функции у = Ln x спасибо.
Построить график функции
Построить график функции. Таблицу данных получить путём изменения параметра X с шагом h.
Как нарисовать график функции?
Как нарисовать график функции y=actg(bx+c) относительно трех переменных в VS ?
Вот тут есть пример. Сам пример я вставил ниже. Остается лишь понять и сделать под определенную функцию.
Компонента Chart (диаграмма) в Visual Studio довольно удобна, хотя для начинающих обычно сложно выбрать из множества её возможностей самые актуальные. К тому же, задокументировано-то всё лишь на MSDN.
Приведу несколько примеров, анализ которых поможет Вам быстро освоить основные приёмы работы с графиками и диаграммами в Visual C++. Все коды проверены в сборке Express 2010.
Пример 1. Добавим на форму компоненту Chart и выведем туда данные
Пример 2. Сделаем красивый Chart программно, можно по нажатию новой кнопки на той же форме
Создаем программно красивый Chart в проекте C++ Windows Forms
Пример 3. Вытащим данные из Chart в TextBox
Пример 4. Сделаем парсер выражений на основе чужого класса — это можно применить для создания полноценного "графопостроителя"
Добавим какой-нибудь не очень сложный парсер, например, класс parser.cpp от Chaos Master.
Кинем файлы parser.cpp и parser.h в папку с кодом (Имя_проекта/Имя_проекта, где находится Form1.h ). В меню скажем Проект — Существующий элемент и добавим файл .cpp (он д.б. в "Файлы исходного кода" Обозревателя решений)
Код выбранного нами парсера старый, так что нам придётся кое-что переделывать, например, строки char * в String ^ и обратно.
Добавим на форму компоненты textBox1 и label1 , напишем демо-код для применения парсера (вызывается по нажатию кнопки):
Возможно, понадобится изменить какие-то ещё мелочи, например, я в файле parser.cpp раскомментарил строку
и изменил в коде exp(1) на exp(1.) — иначе не компилировалось в Studio.
Также ясно, что в начале файла form1.h добавлена строка
Теперь в поле ввода можно писать любые допустимые парсером выражения с переменной x , например, cos(x)+1 , текущее значение переменной x из программы подставится в выражение и его результат динамически подсчитается.
На основе показанных кодов легко сделать, например, программу построения графиков с интерпретацией введённой пользователем функции. Скажем, если выражение для функции с аргументом, обозначенным x , вводится в текстовое поле textBox1 , код построения графика функции в пределах от 0 до 3.14 с шагом, равным 0.1 , будет таким:
P.S. В более новой Studio 2019 пришлось сделать ^f1 вместо f1 и, соответственно, везде f1-> вместо f1.
Заменить фиксированные пределы и шаг на вводимые из формы — элементарно. Вот что вышло для теста:
Пример построения графика на основе парсера функций
Пример 5. Применение разрывов
На форму проекта помещена chart1 со свойством Dock = Fill , построение происходит по загрузке формы.
разрывы по оси y на графике
Отсутствует компонент Chart
Отсутствует элемент Chart
Всем доброго дня.Подскажите пожалуйста, вот такой вопрос.Почему в 2010 Студии нет элемента Chart.
компонент Chart
Мне нужно вывести результаты тестов на один компонент Chart(правильные и неправильные ответы ).
Компонент Chart
Привет) У меня такой вопрос этом компонент может выводить такие числа как: 3,2 8,5 7,1 . В Edit.
Элемент управления диаграммы
Элемент управления Chart — это объект диаграммы, предоставляющий события. При добавлении диаграммы на лист Visual Studio создает объект Chart, который можно запрограммировать напрямую, не обращаясь к объектной модели Microsoft Office Excel.
Применимо к: Сведения в этом разделе применимы к — проектам уровня документа и к добавлению VSTO — в проектах для Excel. Дополнительные сведения см. в разделе доступность функций по типам приложений Office и проектов.
Создание элемента управления
вы можете добавлять Chart элементы управления в лист Microsoft Office Excel во время разработки или во время выполнения в проекте уровня документа.
Вы можете добавить элементы управления Chart на лист во время выполнения надстройки VSTO. Дополнительные сведения см. в разделе Практические руководства. Добавление элементов управления диаграммы на листы.
При закрытии листа динамически созданные объекты диаграммы не сохраняются на листе как элементы управления ведущего приложения. дополнительные сведения см. в разделе добавление элементов управления в Office документы во время выполнения.
Форматирование
Любое форматирование, которое можно применить к Chart, также можно применить к элементу управления Chart. Это такие элементы форматирования, как границы, шрифты, тип диаграммы, линии сетки, условные обозначения и метки данных.
Приводится пример рисования на канве графика функции одной переменной y = f(x).
Функция задается формулой
Условие задачи
Разработать приложение, в котором строится график функции
График функции должен выводиться в отдельной форме.
Математическая постановка задачи
Для построения любого графика функции y = f(x) нужно задать прямоугольную область экрана, в которой этот график функции будет выводиться.
Прямоугольная область экрана задается координатами крайних точек (рис. 1):
– ( x1 ; y1 ) – левый верхний угол экрана;
– ( x2 ; y2 ) – правый нижний угол экрана.
Рис. 1. Прямоугольная область экрана
При построении графиков функций на экране монитора нужно реализовать масштабирование прямоугольника с координатами ( x1 ; y1 ), ( x2 ; y2 ) в прямоугольник с координатами экрана ( xx1 ; yy1 ), ( xx2 ; yy2 ) как изображено на рисунке 2.
Рис. 2. Масштабирование координат
Масштабирование по осям OX и OY реализуется с помощью линейных зависимостей:
При вычислении вертикальных экранных координат необходимо с помощью знака учесть, что нумерация строк идет сверху вниз.
Решение
1. Загрузить Borland C++ Builder .
Создать проект как «VCL Form Application». Автоматически создается основная форма приложения с именем Form1.
2. Создание основной формы.
Разместить на форме компоненты таких типов:
- пять компонент типа TLabel . Создаются объекты с именами Label1 , Label2 , Label3 , Label4 , Label5 ;
- пять компонент типа TEdit . Создаются объекты с именами Edit1 , Edit2, Edit3, Edit4, Edit5;
- один компонент типа TButton. Создается объект с именем Button1.
Откорректировать позиции компонент на форме как показано на рисунке 3.
Рис. 3. Размещение компонент на форме Form1
3. Настройка формы.
Чтобы форма Form1 имела корректный вид, в Object Inspector нужно сделать следующее:
- из вкладки Action установить свойство Caption = « График функции одной переменной » (заголовок формы);
- из вкладки Visual установить свойство BorderStyle = «bsDialog» (рис. 4). В результате исчезнут кнопки управления формой;
- из вкладки Miscellaneous установить свойство Position = «poScreenCenter» (рис. 5). Это действие отобразит форму в центре экрана во время выполнения приложения.
Рис. 4. Свойство BorderStyle формы Form1
Рис. 5. Свойство Position
4. Настройка свойств и размеров компонент, размещенных на форме.
Нужно настроить следующие свойства компонентов:
- в компоненте Label1 свойство Caption = » К-во точек по горизонтали, n = «;
- в компоненте Label2 свойство Caption = « Левая граница, x1 = «;
- в компоненте Label3 свойство Caption = » Правая граница, x2 = «;
- в компоненте Label4 свойство Caption = « Верхняя граница, y1 = «;
- в компоненте Label5 свойство Caption = « Нижняя граница, y2 = «;
- в компоненте Button1 свойство Caption = » Вывести график … «.
Также нужно изменить размер и позицию компонента Button1 на форме. Приблизительный вид формы с размещенными компонентами изображен на рисунке 6.
Рис. 6. Общий вид формы Form1
5. Программирование события активизации формы Form1.
Во время запуска приложения на выполнение необходимо запрограммировать событие OnActivate активизации основной формы приложения.
Пример программирования события в C++ Builder описан здесь.
Листинг обработчика события OnActivate имеет следующий вид:
В обработчике события заполняются значения полей, которые являются координатами прямоугольной области, в которой выводится график. Прямоугольная область задается координатами левого верхнего угла ( x1 ; y1 ) и правого нижнего угла ( x2 ; y2 ).
6. Создание новой формы вывода графика функции.
Создать форму с именем «Form2» по образцу, как показано на рисунке 7. Пример создания новой формы в C++ Builder приведен здесь.
Форма Form2 описывается в файлах « Unit2.h » и « Unit2.cpp «.
Разместить на форме компоненты следующих типов:
– компонент типа TButton (кнопка). Автоматически создается объект с именем Button1;
– компонент типа TImage. Создается объект с именем Image1. В этом компоненте будет выводиться график функции sin(x) .
Рис. 7. Форма Form2 вывода графика функции sin(x)
С помощью Object Inspector осуществить настройку основных свойств компонент:
- в компоненте Button1 свойство Caption = «OK»;
- в компоненте Button1 свойство ModalResult = «mrOk». Это означает, что во время клика на кнопке Button1 форма будет закрываться с кодом возвращения mrOk.
С помощью Object Inspector осуществить настройку свойств формы Form2:
– из вкладки Action установить свойство Caption = « График функции sin(x) «;
– из вкладки Visual свойство BorderStyle = «bsDialog». Это означает, что окно формы примет вид диалогового окна;
– из вкладки Miscellaneous свойство Position = «poScreenCenter». В результате форма будет выводиться по центру экрана.
Также нужно откорректировать размеры и позиции компонентов Button1 и Image1.
В результате выполненных действий, форма Form2 будет иметь вид, как изображено на рисунке 8.
Рис. 8. Форма Form2
7. Программирование дополнительных функций масштабирования и вычисления sin(x) .
7.1. Ввод внутренних переменных в модуль формы Form2 .
Нужно ввести следующие внутренние переменные в текст файла « Unit2.h » (рис. 9).
Для этого выполняется следующая последовательность действий.
- Перейти в заголовочный файл « Unit2.h » (рис. 9).
- В разделе private класса TForm2 ввести четыре переменные:
Эти переменные соответствуют экранным координатам (см. рис. 2 б).
- В разделе public класса TForm2 ввести пять переменных:
Эти переменные отвечают фактическим координатам (рис. 2 а) прямоугольной области, в которой выводится график. Переменная n задает количество точек, которые будут соединены линиями. Чем больше значение n , тем более плавно выглядит график на экране.
Значение этих переменных заполняется из основной формы Form1. Поэтому они размещаются в разделе public.
Рис. 9. Вид файла модуля « Unit2.h «
Пока что листинг файла « Unit2.h » следующий:
7.2. Добавление функций преобразования и функции вычисления sin(x ) в класс TForm2.
В модуле формы Form2 нужно создать две функции преобразования фактических координат в экранные координаты. Функции имеют имена ZoomX() и ZoomY().
Также нужно добавить функцию вычисления sin(x) . Имя этой функции func() .
Сначала в файл «Unit2.h» добавляется описание функций. Описание добавляется в раздел public.
Фрагмент листинга файла «Unit2.h» будет иметь следующий вид:
Следующим шагом нужно перейти в файл « Unit2.cpp » (рис. 10). В этом файле описывается реализация класса TForm2 .
В конец файла добавляется следующий программный код:
В приведенном выше листинге функции ZoomX() и ZoomY() получают входными параметрами соответственно значения x и y, которые являются фактическими координатами. Затем осуществляется преобразование за формулами, которые приведены в математической постановке задачи.
Функция func() получает входным параметром значения в локальной переменной x . В теле функции вычисляется значение sin(x) . В это место можно вставить любую другую собственную функцию.
Рис. 10. Файл «Unit2.cpp» с введенными функциями ZoomX(), ZoomY() и func()
На данный момент листинг файла Unit2.cpp следующий:
Чтобы использовать функцию sin(x) , в файле (модуле) « Unit2.cpp » добавляется строка
В этой строке подключается библиотека стандартных математических функций. В этой библиотеке есть функция вычисления sin(x) .
8. Программирование события активизации формы Form2 .
График функции выводится в форме Form2 сразу после клика на кнопке « Вывести график… » формы Form1. Поэтому, целесообразно запрограммировать вывод графика в событии OnActivate формы Form2. Обработчик события реализован в файле «Unit2.cpp».
Листинг обработчика события OnActivate формы Form2 следующий:
В сокращенном виде файл « Unit2.cpp » имеет вид:
9. Программирование события клика на кнопке « Вывести график… » формы Form1 .
Последним этапом есть программирование события клика на кнопке вывода графика.
Для этого нужно выполнить следующие действия.
9.1. Подключение формы Form2 к форме Form1 .
Пример создания новой формы и вызова ее из основной формы программы подробно описывается здесь.
Чтобы подключить форму Form2 к форме Form1 нужно в верхней части файла «Unit1.cpp» добавить строку:
После этого методы класса TForm2 становятся доступными из формы Form1.
Пока что листинг файла «Unit2.cpp» следующий:
9.2. Программирование события клика на кнопке « Вывести график… « .
Обработчик события Button1Click() клика на кнопке « Вывести график… » следующий:
В обработчике формируются переменные n , x1 , x2 , y1 , y2 .
10. Запуск приложения на выполнение.
После этого можно запускать приложение на выполнение (рис. 11).
Рис. 11. Выполнение приложения, окно вывода графика функции
Читайте также: