- •Текстовый и графический режимы.
- •Графические координаты.
- •Переключение между текстовым и графическим режимами.
- •Установка цвета линии, типа линии и закраски.
- •Точки на экране
- •Линии и прямоугольники
- •Окружности, эллипсы, дуги.
- •Многоугольники
- •Вывод изображений в относительных координатах.
- •Работа с текстами в графическом режиме.
- •Графические окна.
- •Графики функций Задача 1.
- •Программы построения кривых на плоскости.
- •Задача 2.
- •Программы, использующие случайные числа и рекурсию Задача 3.
- •Задача 5.
- •Занимательная графика
- •Задача 8.
- •Трехмерные иллюзии.
- •Литература.
Трехмерные иллюзии.
Попробуем создать на экране монитора иллюзию вращения плоской кривой вокруг некоторой прямой в пространстве. Разберем несколько случаев.
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.