Графика в Delphi: Методические указания к лабораторным работам по курсу «Информатика», страница 2

Карандаш используется при вызове методов рисования: LineTo, Arc, RectAngle и др. Для перемещения карандаша без рисования используется метод MoveTo (Переместить к)

2.1.3 Кисть

У холста есть свойство Brush - кисть, которое определяет, фон и заполнение фигур на холсте. Этот объект имеет в свою очередь следующие свойства:

1)  Color - цвет заполения;

2)  Style - шаблон заполнения (штриховка).

Имеются методы рисования заполненных фигур, при рисовании которых и используется Brush. Например, FillRect (закрашенный прямоугольник).

Программа "Кривые Лиссажу":

1)  При сложении двух гармонических сигналов в зависимости от отношения частот сигналов и сдвига фаз между ними наблюдаются кривые, которые называются кривые Лиссажу. Сигналы задаются:

x = A*Sin(F1*t + W1)

y = A*Sin(F2*t + W2)

2)  Создайте проект Lissagu;

3)  На форму поместите как на рис. 6 компоненты:

а) Image1;

б) SpinEdit1 (частота сигнала 1);

в) SpinEdit2 (фаза сигнала 1);

г) SpinEdit3 (частота сигнала 2);

д) SpinEdit4 (фаза сигнала 2); е) четыре метки Label1 (F1), Label2 (W1), Label3 (F2), Label4 (W2).

Рисунок 6 – Расположение компонентов

4)  В разделе private описания класса TForm1 поместите необходимые для построения фигур переменные:

  n : integer;     //число точек на периоде

  F1,              //частота сигнала 1

  F2,              //        сигнала 2

  W1,              //фаза сигнала 1

  W2 : real;       //     сигнала 2

  Xmin,            //min значение сигнала по OX

  Xmax,            //max                  по OX

  Ymin,            //min                  по OY

  Ymax : real;     //max                  по OY

  gXmin,           //min значение координаты по OX

  gXmax,           //max                     по OX

  gYmin,           //min                     по OY

  gYmax : integer; //max                     по OY

  h : real;        //шаг аргумента сигнала по оси OX

5)  В обработчике события OnActivate (Активизация) формы укажите следующие действия по инициализации переменных и начальном изображении фигур:

{границы аргументов функций}

  Xmin := - 1.2; 

  Xmax := - Xmin;

  Ymin := - 1.2; 

  Ymax := - Ymin;

{границы графических координат}

  gXmin := 0;           

  gXmax := Image1.Width;

  gYmin := 0;           

  gYmax := Image1.Height;

{шаг по оси OX}

  n := 200;

  h := 2 * Pi /n;

  DrawLissagu;

6)  Создайте две функции для получения сигналов:

//функция, определяющая гармонический сигнал 1

function TForm1.Signal1(t : real): real;

begin

  Result := sin(F1 * t) + W1;

end;

//функция, определяющая гармонический сигнал 2

function TForm1.Signal2(t : real): real;

begin

  Result := sin(F2 * t) + W2;

end;

7)  При рисовании приходится переходить от значений функции к координатам на экране. Для этого создайте следующие функции масштабирования:

//функция масштабирования по оси X

function TForm1.poX(x : real): integer;

begin

  Result := gXmin + Trunc((x - Xmin)*

    (gXmax - gXmin)/(Xmax - Xmin));

end;

//функция масштабирования по оси Y

function TForm1.poY(y : real): integer;

begin

  Result := gYmin + Trunc((y - Ymin)*

    (gYmax - gYmin)/(Ymax - Ymin));

end;

8)  Создайте процедуру для рисования фигур:

procedure TForm1.DrawLissagu;

var

  i : integer;

  t, x, y : real;

begin

{получаем значения частот и фаз}

  F1 := SpinEdit1.Value;

  W1 := SpinEdit2.Value / 100;

  F2 := SpinEdit3.Value;

  W2 := SpinEdit4.Value / 100;

  with Image1.Canvas do begin

{белый фон поля рисунка}

    Pen.Color := clWhite;

    Brush.Color := clWhite;

    Rectangle(0, 0, Width, Height);

{построение осей координат}

    Pen.Color := clBlack;

    Pen.Style := psDashDot;

    {ось OX}

    MoveTo(poX(Xmin), poY(0));

    LineTo(poX(Xmax), poY(0));

    {ось OY}

    MoveTo(poX(0), poY(Ymin));

    LineTo(poX(0), poY(Ymax));

{построение графика функций}

    Pen.Style := psSolid;

    t := 0;

    x := Signal1(t);

    y := Signal2(t);

    MoveTo(poX(x), poY(y));

    for i := 1 to n do begin

      t := t + h;

      x := Signal1(t);