Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Графика в Pascal.doc
Скачиваний:
33
Добавлен:
10.06.2015
Размер:
990.21 Кб
Скачать

Трехмерные иллюзии.

Попробуем создать на экране монитора иллюзию вращения плоской кривой вокруг некоторой прямой в пространстве. Разберем несколько случаев.

1. Уравнение кривой задано параметрически, т.е. системой:

- где - параметр. Вращать кривую будем вокруг оси OY.

Чтобы "заставить" кривую вращаться, достаточно постепенно изменять абсциссу x от максимального значения до минимального и обратно. Для этого уравнение (1) заменим уравнением:

- где значение t прямо пропорционально углу поворота вокруг оси OY. В качестве примера рассмотрим вращение "удлиненной циклоиды", которая задается системой:

- где a и b – коэффициенты, определяющие размеры циклоиды.

Program Examp_35;

Uses crt, graph;

Var

x,y,p,t:Real;

f:Integer;

Procedure Graphinterface;

Var

driver, mode, error:Integer;

s:String;

Begin

driver:=detect;

s:='';

Initgraph(driver,mode,s);

error:=GraphResult;

if error<>GrOk then

begin

writeln(GraphErrorMsg(Error));

Halt(error)

end

end;

Begin

Graphinterface;

Setcolor(14);

SetBkColor(9);

t:=0;

Repeat

t:=t+0.05;

for f:=93 downto -93 do

begin

x:=(2*f-40*sin(f/10))*cos(t)+320;

y:=-20+40*cos(f/10)+170;

putpixel(round(x),round(y),14);

end;

Clearviewport;

Until keypressed;

CloseGraph;

End.

2. Рассмотрим теперь вращение кривой вокруг оси OX. Нетрудно догадаться, что в этом случае мы оставим уравнение (1) без изменений, а уравнение (2) заменим уравнением:

В качестве примера рассмотрим кривую, которая называется "Локон Марии Аньези" и задается системой:

- где а – радиус окружности, которую огибает эта кривая.

Program Examp_36;

Uses crt, graph;

Var

gd, gm:Integer;

f,i:Integer;

x,y,t:Real;

Procedure Graphinterface;

Var

driver, mode, error:Integer;

s:String;

Begin

driver:=detect;

s:='';

Initgraph(driver,mode,s);

error:=GraphResult;

if error<>GrOk then

begin

writeln(GraphErrorMsg(Error));

Halt(error)

end

end;

Begin

Graphinterface;

SetBkColor(1);

Repeat

t:=t+0.05;

for f:=1 to 600 do

begin

x:=100*cos(f/200)/sin(f/200)+320;

y:=-100*sin(f/200)*sin(f/200)*cos(t)+170;

putpixel(round(x),round(y),14);

end;

Clearviewport;

Until keypressed;

CloseGraph;

End.

3. Пусть теперь уравнение кривой задано в полярных координатах, т.е. имеет вид p=p(φ), где φ – угол, принимающий значения из некоторого промежутка. Такое уравнение можно записать в параметрическом виде:

Поскольку вращать кривую вокруг осей координат мы умеем, попробуем "заставить" кривую вращаться вокруг начала координат. Для этого уравнение (3) преобразуем в уравнение:

x=p(φ)·cos(φ+t)              (3').

Приведем пример программы для создания иллюзии вращения "трилистника" или "трехлепестковой розы", имеющей уравнение

p=aּcos3φ, где а – радиус окружности, в которую вписана данная кривая.

Program Examp_37;

Uses crt, graph;

Var

x,y,p,t:Real;

f:Integer;

Procedure Graphinterface;

Var

driver, mode, error:Integer;

s:String;

Begin

driver:=detect;

s:='';

Initgraph(driver,mode,s);

error:=GraphResult;

if error<>GrOk then

begin

writeln(GraphErrorMsg(Error));

Halt(error)

end

end;

Begin

Graphinterface;

Setcolor(14);

SetBkColor(9);

t:=0;

Repeat

t:=t+0.05;

for f:=0 to 628 do

begin

p:=120*cos(0.3*f);

x:=p*cos(f/10+t)+320;

y:=p*sin(f/10)+170;

putpixel(round(x),round(y),14);

end;

Delay(100);

Clearviewport;

Until keypressed;

CloseGraph;

End.

4. Приведем пример кривой, заданной уравнением вида

f(x,y)=0 (5).

Рассмотрим гиперболу, каноническое уравнение которой имеет вид:

Заменой y=btg данное уравнение приводим к системе:

Используя (*), легко составить программы вращения гиперболы вокруг осей координат или точки их пересечения (см. 1, 2 и 3). Но мы лучше рассмотрим еще один способ создания иллюзии перемещения кривой в пространстве. Будем "удалять" и "приближать" кривую. Для этого надо каждое из уравнений (1) и (2) заменить уравнениями (1') и (2').

Program Examp_38;

Uses crt, graph;

Var

x,y,t:Real;

f:Integer;

Procedure Graphinterface;

Var

driver, mode, error:Integer;

s:String;

Begin

driver:=detect;

s:='';

Initgraph(driver,mode,s);

error:=GraphResult;

if error<>GrOk then

begin

writeln(GraphErrorMsg(Error));

Halt(error)

end

end;

Begin

Graphinterface;

Setcolor(14);

SetBkColor(9);

t:=0;

Repeat

t:=t+0.05;

for f:=0 to 628 do

begin

x:=80*cos(t)/cos(f/10)+320;

y:=-30*sin(f/10)/cos(f/10)*cos(t)+170;

putpixel(round(x),round(y),14);

end;

Delay(10);

Clearviewport;

Until keypressed;

CloseGraph;

End.