Изображения графика функции от двух переменных

Страницы работы

Содержание работы

МОСКОВСКИЙ ИНСТИТУТ РАДИОТЕХНИКИ, ЭЛЕКТРОНИКИ И АВТОМАТИКИ

Курс «Алгоритмы машинной графики»

Лабораторная работа № 10

ТЕМА: «Изображения графика функции от двух переменных»

Выполнил студент группы

ВЕ-1-99 Антонов А.А.

Руководитель: Криницкая Е.В.

Дата сдачи:_______________

МОСКВА

2001


Постановка задачи.

Изобразить график функции

(гиперболический параболоид).

Алгоритм.

1.  Задаем начальные значения переменных x и y.

2.  Вычисляем значение функции в данной точке (x; y).

3.  Переводим координаты x, y и z = F(x, y) в координаты экрана:

A = Round(X + Y * Sin(Pi/4))

B = Round(Y * Sin(Pi/4) - F(mx * X, my * Y) * mz)

Xэ = Xc + A

Yэ = Yc + B,

где Xc, Yc – координаты центра экрана, а mx, my, mz – масштаб по осям 0X, 0Y и 0Z соответственно.

4.  Если Horl[Xэ] > Yc – B, то ставим пиксель (Xэ, Yэ); Horl[Xэ] := Yc – B.

Horl – массив, содержащий наинизшее значение Y для каждого значения X.

5.  Если Horh[Xэ] < Yc – B, то ставим пиксель (Xэ, Yэ); Horh[Xэ] := Yc – B.

Horh – массив, содержащий наивысшее значение Y для каждого значения X.

6.  Увеличиваем y. Если y достигла максимального значения, то присваиваем y начальное значение и увеличиваем x, иначе повторяем с п.2.

7.  Если x достигла максимального значения, то алгоритм завершается иначе повторяем с п.2.

В результате получаем следующий график:


uses

  Graph;

const

  mx = 0.5;

  my = 0.5;

  mz = 0.5;

  Xc = 320;

  Yc = 240;

  XStep = 4;

function F(X, Y: Double): Double;

begin

  F := ((X * X) / 20 - (Y * Y) / 10) / 2;

end;

var

  Cos_A, Sin_A, Cos_B, Sin_B: Double;

procedure Convert(X, Y: Integer; var A, B: Integer);

begin

  A := Round(X + Y * Sin(Pi/4));

  B := Round(Y * Sin(Pi/4) - F(mx * X, my * Y) * mz);

end;

var

  GrD, GrM: Integer;

  lX, lY, hX, hY, X, Y, A, B: Integer;

  Horz: array[0..639] of record

    L, H: Integer;

  end;

begin

  for A := 0 to 639 do

    with Horz[A] do

      begin

        H := 0;

        L := 479;

      end;

  Cos_A := Cos(Pi/8);

  Sin_A := Sin(Pi/8);

  Cos_B := Cos_A;

  Sin_B := Sin_A;

  lX := -170;

  hX := 210;

  lY := -200;

  hY := 140;

  X := lX;

  DetectGraph(GrD, GrM);

  InitGraph(GrD, GrM, '');

  while X <= hX do

    begin

      Y := lY;

      while Y <= hY do

        begin

          Convert(X, Y, A, B);

          if Horz[Xc + A].L > Yc - B then

            begin

              PutPixel(Xc + A, Yc + B, White);

              Horz[Xc + A].L := Yc - B;

            end;

          if Horz[Xc + A].H < Yc - B then

            begin

              PutPixel(Xc + A, Yc + B, White);

              Horz[Xc + A].H := Yc - B;

            end;

          Inc(Y);

        end;

      Inc(X, XStep);

    end;

  ReadLn;

Похожие материалы

Информация о работе