Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЧМ_2012 / Лекции / Численные_методы.pdf
Скачиваний:
392
Добавлен:
09.06.2015
Размер:
1.99 Mб
Скачать

89

5)Конус (Листинг 6.10): t=0:2*%pi/200:2*%pi; z= 0:0.1:10; [T,Z]=meshgrid(t,z);

X=Z.*cos(T);

Y=Z.*sin(T);

plot3d2(X,Y,Z, , 70, -100) // см рис. 6.8

Рис.6.8.Конус

4) Анимация в пространстве

Задача №3.

Сфера заданного радиуса скользит по плоскости. Нарисовать анимацию.

Листинг 6.11.

//заданный радиус r = 1.0;

//рисуем плоскость z = 1-x t = 0:0.5:12;

90

deff('[z]=surf(x,y)','z=1-x');

// функция рисования шара function[] = procedure_(i);

// константы подобраны эмпирически

deff("[x,y,z] = sph(alp,tet)",["x = r*cos(alp).*cos(tet) + i";.. "y = r*cos(alp).*sin(tet) + 5";..

"z = r*sin(alp) - i + 2.5"]);

[xx,yy,zz] = eval3dp(sph,linspace(-%pi/2,%pi/2,25),linspace(0,%pi*2,25)); plot3d(xx,yy,zz, 45, 70);

endfunction;

f = gcf();

f.pixmap = 'on'; //set the pixmap mode

// основной цикл анимации for i = 1:0.1:12

fplot3d(t,t,surf,45,70); procedure_(i); show_pixmap(); clf();

end

Смотрим очередной рисунок 6.9

Рис.6.9. Кадр из анимации

Ниже приведен текст программы, рисующей анимацию для крутящегося шара, скользящего по плоскости:

Листинг 6.12.

r = 1.0; //радиус шара

// угол наклона плоскости(от угла зависит скорость скатывания) b = 10;

91

b = b*%pi/180; k = tan(b);

t = 0:12:12;

deff('[z] = surf(x,y)','z = 1-k*x'); function[] = procedure_(i);

deff("[x,y,z] = sph(alp,tet)",["x = r*cos(alp).*cos(tet)+i+1.2";.. "y = k*r*cos(alp).*sin(tet)-k*i+3";..

"z = r*sin(alp)+10"]);

[x,y,z] = eval3dp(sph,linspace(-%pi/2,%pi/2,8),linspace(0-i,%pi-i,10)); [x1,y1,z1] = eval3dp(sph,linspace(-%pi/2,%pi/2,8),linspace(%pi-i,%pi*2-i,10)); plot3d(x,z,y,,,,[12,1,0]);

plot3d(x1,z1,y1,,,,[20,1,0]);

fplot3d(t,t,surf,65,80);

endfunction;

f = gcf();

f.pixmap = 'on'; //set the pixmap mode

for i = 1:0.05*(k+0.5):12 procedure_(i); show_pixmap(); clf();

end

Задача №4.

Куб скользит по плоскости.

Листинг 6.13.

// построение матриц куба для plot3d2 function ret = getcube

x = [1,1,1,1,0,0; 0,0,0,0,1,1; 0,0,0,0,1,1];

y = [1,1,0,0,0,0; 1,1,0,0,0,0; 0,0,1,1,1,1];

z = [1,0,0,1,1,0; 1,0,0,1,1,0; 1,0,0,1,1,0];

ret = tlist(["cb", "x", "y", "z"], x, y, z); endfunction;

//поворот куба вокруг осей x, y, z на углы a, b, c function ret = rot(cube, a, b, c)

//матрицы преобразования поворота в трехмерном пр-ве

A = [1,0,0,0;

0, cos(a), sin(a), 0; 0, -sin(a), cos(a), 0; 0, 0, 0, 1];

92

B = [cos(b), 0, -sin(b), 0; 0, 1, 0, 0;

sin(b), 0, cos(b), 0; 0,0,0,1];

C = [cos(c), sin(c), 0, 0; -sin(c), cos(c), 0, 0; 0, 0, 1, 0; 0, 0, 0, 1];

M = A*B*C; // общее преобразование

//Применяем преобразование для всех точек куба for i=1:length(cube.x) do

U = [cube.x(i), cube.y(i), cube.z(i), 1] * M; cube.x(i) = U(1);

cube.y(i) = U(2); cube.z(i) = U(3);

end

ret = cube; endfunction

//смещение куба вдоль осей

function ret = mov(cube, x, y, z) for i=1:length(cube.x) do

cube.x(i) = cube.x(i)+x; cube.y(i) = cube.y(i)+y; cube.z(i) = cube.z(i)+z;

end

ret = cube; endfunction

//рисование плоскости function drawPlane

x = [6, 6; 0, 0]; y = [-1, 2;

-1, 2]; z = [0,0;

1,1];

plot3d2(x, y, z); endfunction

//рисование куба function drawCube(cube)

plot3d2(cube.x,cube.y,cube.z); endfunction

f = gcf(); clf();

f.pixmap = "on";

// подготовка куба - поворот и смещение вверх из (0,0,0) к плоскости cube = mov(rot(getcube(), 0, atan(1/6), 0), 0, 0, 1);

realtimeinit(.1);

93

for x = 0:0.1:4 do realtime(x*10); clear_pixmap(); clf(); square(0,-1,6,2);

// перемещение куба

cube = mov(cube, .1, 0, -0.0166667); drawCube(cube);

drawPlane; show_pixmap(); end;

// Смотрим на рис.6.10

Рис.6.10. Кадр из анимации