МОСКОВСКИЙ ИНСТИТУТ РАДИОТЕХНИКИ, ЭЛЕКТРОНИКИ И АВТОМАТИКИ
Курс «Алгоритмы машинной графики»
Лабораторная работа № 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;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.