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

83

Замечание 6.2.

Более полная информация о двумерных графиках вы можете найти в книге

Алексеев Е.Р., Чеснокова О.В. Пакет Scilab. Начало работы (ссылка на пособие дана во введении).

2) Анимация на плоскости

Задача №1.

По кривой, заданной функцией y = sin(x), скользит квадрат (брусок). Построить анимацию.

Листинг 6.4.

//настраиваем back-buffer (буферная анимация, т.е. все кадры сохраняются в буфере, затем // буфер прокручивается - начинается анимация)

f = gcf(); clf();

f.pixmap = "on";

//Точки кривой, по которой катится квадрат

maxL = %pi*8; // максимальная абсцисса xpCurve = [0:.1:maxL]; // по оси X ypCurve = sin(xpCurve); // и по оси Y

//настройка временных задержек для анимации realtimeinit(0.1); realtime(0);

//Квадрат едет вперед - x его абсцисса

for x=0:0.1:maxL do realtime(x*5); // задержка

clear_pixmap(); // очистка экрана clf(f);

//это ограничивающий объем square(0, -1, maxL, maxL);

//рисуем кривую plot2d(xpCurve, ypCurve);

//вычисляем ординату середины нижней стороны y = sin(x);

l = atan(cos(x)); // угол наклона касательной к кривой в точке

vx = cos(l); vy = sin(l); // вектор касательной, направленный вперед px = x-vx; py = y-vy; // "задняя" точка нижней стороны

vx = 2*vx; vy = 2*vy; // вектор нижней стороны

// подгонка, чтобы квадрат не провалился if (sin (px) > py | sin (px+vx) > py+vy) then

84

py = sin(px);

vy = sin(px+vx)-py;

end;

// рисуем квадрат

xpoly([px, px+vx, px+vx-vy, px-vy], [py, py+vy, py+vy+vx, py+vx], "lines", 1); show_pixmap(); // вывод буфера

end;

Задача №2.

По кривой, заданной функцией y = cos(x), перекатывается квадрат (брусок). Построить анимацию.

Листинг 6.5. f = gcf();

clf();

f.pixmap = "on";

// Кривая, по которой перекатывается квадрат maxL = %pi*4;

xpCurve = [0:.1:maxL]; ypCurve = cos(xpCurve);

realtimeinit(0.1); realtime(0);

x = 0; y = 1; // координаты угла, на котором катится квадрат w = -0.1; // скорость поворота относительно угла

l = 1.5; // начальный угол поворота t = 0; // время

while x < maxL do t = t +0.1; realtime(t*5); clear_pixmap(); clf(f);

square(0, -1, maxL, maxL); plot2d(xpCurve, ypCurve);

vx = cos(l); vy = sin(l); // вектор-сторона квадрата

if (cos(x+vx) > y+vy) then // произошел ли перекат на другой угол?

//меняем угол x = x+vx;

y = cos(x);

//строим ортогональный вектор-сторону tmp = -vy;

vy = vx; vx = tmp;

//корректируем величину угла поворота l = %pi/2+l;

end;

85

// упирается ли квадрат стороной

ch = [1/3, 1/2, 4/5]; // три эмпирически взятые точки проверки for d = ch do

// проваливается ли квадрат под кривую в этой точке? tmp = cos(x+d*vx) - d*vy;

if (tmp > y) then

// приподнимем квадрат и продвинем немного вперед delta = tmp - y;

y = tmp;

x = x+delta*vx/2;

end;

end

// корректируем угол поворота l = l+w;

xpoly([x, x+vx, x+vx-vy, x-vy], [y, y+vy, y+vy+vx, y+vx], "lines", 1); show_pixmap();

end;

3) Простейшие трёхмерные объекты

1) Сфера (Листинг 6.6):

u = linspace(-%pi/2,%pi/2,40); v = linspace(0,2*%pi,20);

X = cos(u)'*cos(v); // Вспоминаем сферическую систему координат

Y = cos(u)'*sin(v);

Z = sin(u)'*ones(v); // X,Y,Z должны быть одинакового размера plot3d2(X,Y,Z);

// Получаем сферу, заданную параметрически, радиуса 1;

Смотрим рис.6.4:

86

Рис.6.4. Сфера (шар)

2)Куб (Листинг 6.7):

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];

plot3d2(x,y,z); // куб строится по граням, грани из прямых, прямые из

// точек: [x(1), y(1), z(1)] – первая точка

Смотрим рис.6.5:

87

Рис.6.5.КУБ

3) Плоскость (Листинг 6.8): t=0:0.5:12;

deff('[z]=surf(x,y)','z = 1-x'); // рисуем плоскость с помощью внешней

// функции

fplot3d(t,t,surf,45,70); // см. рис.6.6

4) Карта ландшафта (Листинг 6.9):

Z = [ 0.0001 0.0013 0.0053 -0.0299 -0.1809 -0.2465 -0.1100 -0.0168 -0.0008 -

0.0000

 

 

 

 

 

 

 

 

 

 

 

0.0005

0.0089

0.0259

-0.3673

-1.8670

-2.4736

-1.0866

-0.1602

-0.0067

0.0000

0.0004

0.0214

 

0.1739

 

-0.3147

-4.0919

-6.4101

-2.7589

-0.2779

0.0131

0.0020

-0.0088

-0.0871

0.0364

1.8559

1.4995

-2.2171

-0.2729

0.8368

0.2016

0.0130

-0.0308

-0.4313

-1.7334

-0.1148

3.0731

0.4444

2.6145

2.4410

0.4877

0.0301

-0.0336

-0.4990

-2.3552

-2.1722

0.8856

-0.0531

2.6416

2.4064

0.4771

0.0294

-0.0137

-0.1967

-0.8083

0.2289

3.3983

3.1955

2.4338

1.2129

0.2108

0.0125

-0.0014 -0.0017 0.3189 2.7414 7.1622 7.1361

3.1242

0.6633

0.0674

0.0030

0.0002

0.0104

 

0.1733

 

1.0852

2.6741

2.6725

1.1119

0.1973

0.0152

0.0005

0.0000

0.0012

 

0.0183

 

0.1099

0.2684

0.2683

0.1107

0.0190

0.0014

0.0000];

surf(Z,'facecol','interp');

// см. рис.6.7

 

 

 

 

 

88

Рис.6.6.Плоскость

Рис.6.7.Ландшафт