Упражнение 1

Создайте приложение, которое строит пикселями график функции y=3*Sin(x)*Cos(x/6).

Создайте форму, свойству Caption которой присвойте значение «График функции». В окне Инспектора объектов задайте для свойства Forml.ClientHeight (высота окна формы) значение 300, для свойства Forml.ClientWidht (ширина окна формы) задайте значение 500, для свойства Forml.Color задайте значение clWhite (белый).

Для создания процедуры обработчика события OnPaint (перерисовать изображение) выберите в окне Инспектора объектов объект Forml и на странице Events произведите двойной щелчок на пустом поле списка в событии OnPaint. После этого в окне Редактора кода будет сгенерирована заготовка процедуры обработчика события procedure TForml.FormPaint(Sender: TObject); Введите в текст процедуры вызов процедуры построения графика функции DrawGraph:

procedure TForml.FormPaint(Sender: TObject);
begin
DrawGraph; {вызов процедуры построения графика функции}
end:

Так как при программировании процедуры построения графика функции нам придется использовать для рисования Canvas (холст, канва), окрашивая пикселы канвы, изучите справочную информацию о свойствах Canvas и Pixels. Поскольку перед построением графика придется чертить прямые линии – оси координат и выводить текст на изображении, то следует также изучить справку Delphi о методах MoveTo, LineTo и TextOut.

В связи с тем, что при построении графика функции необходимо задавать целочисленные значения координат окрашиваемого пиксела, а результат вычисления функции является вещественным числом, следует ознакомиться со справочной информацией Delphi, касающейся функции Round, округляющей вещественные числа до ближайшего целого числа.

Откройте окно Редактора кода и введите текст процедуры построения графика функции:

procedure DrawGraph: // Построение графика функции
var
xl,x2: real; {границы изменения аргумента функции}
yl,y2: real; {границы изменения значения функции}
х : real; {аргумент функции}
у : real; {значение функции в точке х}
dx : real; {приращение аргумента}
l,b : integer; {левый нижний угол области вывода графика}
w,h: integer; {ширина и высота области вывода графика}
mx,my: real; {масштаб по осям X и Y}
хО,уО: integer; {точка — начало координат}
Function f(x:real):real; {функция, график которой надо построить}
begin
f:= 3*Sin(x)*Cos(x/6);
end;
begin {область вывода графика на форме}
1:=10; {X — координата левого верхнего угла}
b:=Forml.С1ientHeight-20; (У — координата левого верхнего угла}
h:=Forml.ClientHeight-40; // высота
w:=Forml.Width-40; // ширина
х1:=0; // нижняя граница диапазона аргумента
х2:=25; // верхняя граница диапазона аргумента
dx:=0.01; // шаг аргумента
{определение максимального и минимального значений функции на отрезке [xl,x2] для масштабирования}
yl:=f(xl); {минимальное значение функции}
y2:=f(xl); {максимальное значение функции}
x:=xl;
{вычислять значения функции для значений х<=х2 и определить максимальное и минимальное значения для масштабирования}
repeat y:=f(x); if y
yl;=y; {если текущее значение у меньше минимального, то у1:=у}
if y>y2 then у2:=у; {если текущее значение у больше минимального, то у2:=у}
x:=x+dx; {перейти к следующему значению х}
until (x>=x2); {как только х>=х2. прекратить}
my:=h/abs(y2-yl); // масштаб по оси Y mx:=w/abs(x2-xl); // масштаб по оси X
{задать начало координат} х0:=1;
yO:=b-Abs(Round(yl*my));
with Forml.Canvas do {рисование графика}
begin
{начертить оси координат} MoveTo(I ,b);
LineTo(I,.b-h); {ось x} MoveTo(xO,yO);
LineTo(xO+w.yO); {ось у} Text0ut(l+5,b-h,FloatToStrF(y2,ffGeneral,6,3));
{вывести максимальное значение}
TextOut(xO+w,yO,’x’); // подписать ось х TextOut(1+5,b,FloatToStrF(yl,ffGeneral,6,3));
{вывести минимальное значение}
Text0ut(l-7,b-h-5,’у’); // подписать ось у
{построение графика} x:=xl:
repeat {повторять рисовать точки}
y:=f(x); Forml. Canvas. Pixel s[xO+Round(x*mx),yO-Round(y*rny)]:=clRed;
{clRed — красный цвет рисования графика}
x:=x+dx;
until (x>=x2); {прекратить, как только х>=х2}
end;
end;

Изучите текст процедуры построения графика функции DrawGraph. Сохраните, откомпилируйте и запустите приложение на выполнение. Убедитесь, что в окне приложения производится построение графика заданной функции.

Если вы попытаетесь изменить размеры окна, то увидите, что график искажается, так как он не перерисовывается в соответствии с новыми размерами окна.

Для того чтобы перерисовывать изображение при изменении размеров формы, следует создать обработчик события On Resize, определяющий новые параметры клиентской области и вызывающий процедуру построения графика функции DrawGraph. Эта процедура может выглядеть следующим образом:

procedure TForml.FormResizeCSender: TObject);
begin
with Forml do Canvas. FillRect (Rect (0,0, ClientWicith, ClientHeight)):
{заполнение прямоугольника канвы, указанного параметром Rect, где ClientWidth.ClientHeight -ширина и высота клиентской области в пикселах}
DrawGraph; end;

Сохраните измененное приложение, откомпилируйте его и проверьте его работу. Убедитесь, что в окне приложения выполняется построение графика заданной функции, причем при изменении размеров окна происходит корректное перерисовывание графика в новом масштабе.

Добавить комментарий