Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задачи_Делфи.docx
Скачиваний:
9
Добавлен:
14.08.2019
Размер:
1.17 Mб
Скачать

2.1.3. Рисование координатной сетки

для построения графиков

Постановка задачи. Нарисовать координатную сетку, как показано на рис. 10.

Реализация. Напишем процедуру setka (x0, y0, mx, my : integer) с входными параметрами x0, y0 – координаты начала системы координат; mx, my – шаги координатной сетки в пикселях.

Рис. 10. Координатная сетка

procedure setka(x0, y0, mx, my:integer);

// x0, y0 - координаты начала системы координат

var lx, ly:real; // метки (оцифровка) линий сетки

dlx, dly:real; // шаг меток (оцифровки) линий сетки

x,y:integer;

cross:integer; счетчик неоцифрованных линий

begin

dlx:=0.5; // шаг меток оси X

dly:=1.0; // шаг меток оси Y, метками будут: 1, 2, 3 и т. д.

with form1.Canvas do

begin

cross:=dcross;

MoveTo(x0,y0); LineTo(x0,y0-h); // ось X

MoveTo(x0,y0); LineTo(x0+w,y0); // ось Y

// засечки, сетка и оцифровка оси X

x:=x0+mx;

lx:=dlx;

repeat

MoveTo(x,y0-3);LineTo(x,y0+3); // засечка

cross:=cross-1;

if cross = 0 then // оцифровка

begin

TextOut(x-8,y0+5,FloatToStr(lx));

cross:=dcross;

end;

Pen.Style:=psDot;

MoveTo(x,y0-3);LineTo(x,y0-h); // линия сетки

Pen.Style:=psSolid;

lx:=lx+dlx;

x:=x+mx;

until (x>x0+w);

// засечки, сетка и оцифровка по оси Y

y:=y0-my;

ly:= dly;

repeat

MoveTo(x0-3,y);LineTo(x0+3,y); // засечка

TextOut(x0-20,y,FloatToStr(ly)); // оцифровка

Pen.Style:=psDot;

MoveTo(x0+3,y); LineTo(x0+w,y); // линия сетки

Pen.Style:=psSolid;

y:=y-my;

ly:=ly+dly;

until (y<y0-h);

end;

end;

Вернемся к способам вывода изображения на форму. Третий способ вывода изображения сразу же при запуске приложения заключается в следующем. Выберите событие формы OnPaint. Справа нажмите на стрелочку и выберите строку FormCreate. Тогда, если напишем в коде процедуры FormCreate вызов процедуры Setka, то рисунок появится на форме сразу после запуска проекта. Ниже приведен код процедуры FormCreate:

procedure TForm1.FormCreate(Sender: TObject);

begin

mx:=25;

my:=25;

dcross:=1; // помечать линии сетки X: 1 – каждую;

// 2 – через одну;

// 3 – через две;

h:=7*my;

w:=14*mx;

setka(30,200,mx,my);

end;

Задание 1. Измените переменную dlx так, чтобы метки по оси Х тоже были через 1.

Задание 2. Упростите процедуру setka(x0, y0, mx, my : integer) так, чтобы координатная сетка была пригодна для построения графиков элементарных функций (примерный вид приведен на рис. 11). Новую процедуру setka назовите koord_setka.

Рис. 11. Оси координат и сетка

2.1.4. Построение графиков элементарных функций

Для построения графиков рекомендуем использовать компонент TPaintbox (вкладка System). В этом случае нет необходимости задавать положение области на форме.

Для того чтобы построить оси координат, нужно задать положение начала математической системы координат и масштабы каждой из осей. Подчеркнем, что отсчет положения начала системы координат ведется в пикселях от левого верхнего угла компонента TPaintbox. Обозначим через u0 и v0 расстояния до начала системы координат по горизонтали и вертикали соответственно. Масштабы по оси абсцисс и по оси ординат обозначим mx и my, их тоже следует задавать в пикселях. Переменные u0, v0, mx, my включим в список глобальных переменных.

Теперь перейдем непосредственно к построению графика. Сначала нам нужно создать процедуру (назовем ее xytouv), которая преобразовывала бы математические координаты в экранные. Алгоритм преобразования прост: значение математической координаты (вещественное число) умножается на масштаб, округляется функцией round и прибавляется к значению u0 (положение начала координат). Это для оси абсцисс. Для оси ординат сложение следует заменить на вычитание, поскольку экранная координата отсчитывается «вниз».

Поместим эту процедуру в разделе implementation модуля Unit1. Здесь x, y – математические координаты точки графика, а u, v – ее экранные координаты. Так как процедура xytouv возвращает экранные координаты u и v, то перед переменными u, v следует написать var.

procedure xytouv(x,y:real; var u,v:integer);

begin

u:=u0+round(x*mx);

v:=v0-round(y*my);

end;

Напишем функцию f(x), с помощью которой задается математическая формула функции. Для примера будем строить график функции y = 2sinx.

Function f (x : real) : real;

begin

f:=2*sin(x);

end;

Затем выберем отрезок на оси абсцисс, на котором будет изображен график функции. Для линейний и квадратичной функций это может быть симметричный отрезок, например [−10; 10]. Для логарифмической функции необходимо выбирать отрезок в положительной части оси абсцисс, например, [0.01; 10]. Для функций синуса и косинуса можно взять любой отрезок, например [−; ]. В нашем примере пусть будет отрезок [−2; 2]. Границы выбранного отрезка будут входными параметрами xmin и xmax для процедуры Graphic.

Будем менять переменную х на отрезке [xmin; xmax] с некоторым шагом dx, который подбираем экспериментально. Начинайте со значения, например, dx = 0,01. Для вывода точки на Paintbox1 (или Form1) используем свойство Pixels канвы Canvas. Ниже приведен код процедуры Graphic.

procedure Graphic(xmin, xmax, dx : real);

{xmin, xmax – минимальное и максимальное значения x,

dx – «шаг» построения}

var x,y:real; u,v:integer;

begin

x:=xmin; {присваиваем x минимальное значение}

while x<xmax do

begin

y:=f(x); {вычисляем y }

{Преобразуем математические координаты в экранные}

xytouv(x,y,u,v);

{Ставим точку зеленого цвета с координатами u,v}

Form1.Paintbox1.Canvas.Pixels[u,v]:=clgreen;

x:=x+dx; {увеличиваем x}

end;

end;

Вызовем процедуру graphic в коде обработчика TForm1.Button1Click (кнопка «Построить»).

procedure TForm1.Button1Click(Sender: TObject);

begin

Graphic(-2*pi, 2*pi, 0.01);

end;

В итоге получим график, изображенный на рис. 12.

Рис. 12. График функции y= 2sinx на отрезке [–2; 2].

Задание. Расширьте возможности приложения. Через компонент TMainMenu задайте несколько функций. Для этого в код функции f вставьте оператор выбора case, в котором разным номерам будут соответствовать различные функции.