Задание 11. Построение графика функции Цель задания 1. Знакомство с графическими компонентами Delphi. 2. Приобретение навыков рисования графиков. Постановка задачи Построить график функции u(t ) , полученной в лабораторной работе 9 при решении задачи Коши. График должен быть оформлен в соответствии с требованиями стандартов. Интерфейс программы может иметь вид, показанный на рис. 3.14. Рис. 3.14 Пример интерфейса приложения с графиком решения u(t ) задачи Коши из лабораторной работы 9 Рекомендации: Для построения графика используйте метод PolyLine, соединяющий отрезками дискретные значения функции u(t ) , рассчитанные в лабораторной работе 9. Для этого, во-первых, оформите решение задачи Коши – вычисление функции u(t ) – в виде Object Pascal функции, например, fun(t). Во-вторых, представьте результаты расчетов функции как массив элементов TPoint точек канвы, где для каждого элемента массива поле X будет масштабированным временем ti, а Y – масштабированным значением функции u(ti). Описание такого типа-массива (динамического массива) должно иметь вид: var u: Array of TPoint; Элементы этого массива целесообразно алгоритму: For i:=0 To High(u) Do With u[i] Do begin x:=Trunc(i*dt*kx)+x0; y:=Trunc(fun(i*dt)*ky)+y0; end; заполнять по следующему Здесь коэффициенты kx, ky – это масштабные множители, переводящие математические значения t и u в значения координат канвы, на которой будет рисоваться график, (x0,y0) – координаты начала рисования графика, dt – шаг по времени t . Выражения для kx, ky найдите самостоятельно, но не путем вычислительного эксперимента. Они должны завесить от количества узлов n сетки t , размеров канвы и максимально возможного значения функции u(t ) на интервале (0, T ). Поскольку значения координат рисования могут быть только целыми, то при всех их вычислениях используйте операцию целочисленного деления div и преобразования к целому типу стандартными функциями Trunc или Round. Для красивого расположения рисунка, оставляйте пустые поля вокруг него. Это легко сделать, если компонент рисования поместить на объекте TShape немного большего размера с цветом фона как у графика. Оси координат целесообразно рисовать после задания начальной точки (x0,y0). Координату x0 не следует устанавливать нулевой, поскольку слева от неё придется делать надписи для оси ординат. Теперь, например, ось абсцисс и надписи на ней, соответствующие рисунку 3.12, можно задать как With PaintBox1.Canvas Do begin MoveTo(x0,y0); LineTo(PaintBox1.Width,y0); // ось X Font.Name:='Symbol'; Font.Size:=10; Brush.Style:=bsClear; TextOut(x0 div 2,y0,'0'); TextOut((PaintBox1.Width-x0) div 2 + x0 – TextWidth('p') div 2, y0,'p'); TextOut(PaintBox1.Width-TextWidth('2p'),y0,'2p'); end; Имейте ввиду, что при решении задачи Коши на произвольном интервале времени могут возникать исключительные ситуации, поэтому не забывайте их обрабатывать в операторах try. То же самое касается и всех операций выделения памяти для объектов и переменных. Очищайте область рисования графика процедурой, описанной в примере 3.38. Нарисовать график можно и не так элегантно, как это делает метод PolyLine с массивом точек-записей, содержащим сразу обе координаты X и Y всей кривой. Данный метод требует выделять память, по существу, для двухмерного массива 2*(n+1) элементов. Если это неприемлемо, например, при очень больших n и, к тому же, если сетка t имеет равномерный шаг t , то можно обойтись без массива точек-записей. При этом, после каждого расчета функции fun(t) в точке i*dt, необходимо новое значение функции соединить отрезком прямой по методу LineTo с её старым значением, которое хранится в текущей позиции канвы. Для рисования графика таким способом необходимо установить начальную текущую позицию в точку (x0,y0) методом MoveTo. Интерфейс приложения можно дополнить строкой состояния – TStatusBar из закладки Win32 палитры компонент. Этот объект автоматически размещается внизу окна формы. Его основное свойство – SimpleText, которому и присваевается желаемая строка комментария. Контрольные вопросы для сдачи лабораторной работы: Чем различаются компоненты TImage, TPaintBox, TBitmap? Что такое Canvas и как с ней работать? Как написать текст на каком-либо графическом объекте? Какими способами можно построить кривую по заданным точкам? Какой вид будет иметь кривая y 0.4sin x , если при её рисовании не масштабировать функцию y ? Когда возникает событие OnPaint? Зачем нужен метод Repaint?