Построение графика функции

advertisement
Задание 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?
Download