Элементы виртуальной физической реальности на ряде примеров
Занятие №9
Задача №1. Воспроизвести визуально и программно колебания струны u(t,x) (t — время, x — пространственная координата) с закрепленными концами. На рис.1 приведено начальное положение струны.
Рис.1. Начальное положение струны
Решение соответствующего волнового уравнения (utt - a2uxx= 0, u(t,0) = u(t,L) = 0, u(0,x) = u0(x), ut(0,x) = 0) представим в виде ряда:
.
Решение. Создадим m-файл, моделирующий динамику струны:
global Cn numfun a L x0
hF=figure(¢NumberTitle¢,¢off¢,¢Name¢, …
¢The oscillations of string¢,¢Color¢,[0 1 0]);
hA=axes(¢Parent¢,hF,¢Units¢,¢pixels¢,¢Position¢,[25 25 500 325]);
r=2; L=5; h=1; x0=1; a=1;
numfun=30; numx=20; dx=L/numx;
Cn=2*h*L^2/(pi^2*x0*(L-x0));
axis([0,L,–h,h]); X=[];
for i=1:(numx+1)
xn=dx*(i-1); X=[X,xn];
end
for t=1:300
Y=zeros(1,numx+1);
for i=1:(numx+1)
x=X(i); Y(i)=u(t,x);
end
line(X,Y,¢Color¢,¢black¢,¢EraseMode¢,¢none¢,¢LineWidth¢,r);
pause(0.1);
line(X,Y,¢Color¢,¢white¢,¢EraseMode¢,¢none¢,¢LineWidth¢,r);
end
Создаем m-функцию, вычисляющую сумму ряда и соответственно форму струны u(t,x):
function Y=u(t,x)
global Cn numfun a L x0
s=0;
for n=1:numfun
m1=sin(pi*x0*n/L);
m2=sin(pi*x*n/L);
m3=cos(pi*a*t*n/L);
s=s+m1*m2*m3/(n*n);
end
Y=Cn*s;
Задача №2. Смоделировать визуально и программно часы с тремя стрелками в виде соответствующего MATLAB сценария.
Решение:
hF=figure(¢NumberTitle¢,¢off¢,¢Name¢, …
¢The Arrow Clock¢, ¢Color¢,[0 1 0]);
hA=axes(¢Parent¢,hF,¢Units¢,¢pixels¢,¢Position¢,[25 25 125 125]);
axis([-1,1,-1,1]);
r=3; x0=0; y0=0;
LS=0.9; LM=0.7; LH=0.5;
asec=-pi/30;
fis=0; fim=0; fih=0;
for t=1:300
Формируем секундную, минутную и часовую стрелки:
xs=x0+LS*cos(fis);
ys=y0-LS*sin(fis);
XS=[x0,xs]; YS=[y0,ys];
xm=x0+LM*cos(fim);
ym=y0-LM*sin(fim);
XM=[x0,xm]; YM=[y0,ym];
xh=x0+LH*cos(fih);
yh=y0-LH*sin(fih);
XH=[x0,xh]; YH=[y0,yh];
line(XS,YS,¢Color¢,¢black¢,¢EraseMode¢,¢none¢,¢LineWidth¢,1);
line(XM,YM,¢Color¢,¢black¢,¢EraseMode¢,¢none¢,¢LineWidth¢,2);
line(XH,YH,¢Color¢,¢black¢,¢EraseMode¢,¢none¢,¢LineWidth¢,3);
pause(0.1);
line(XS,YS,¢Color¢,¢white¢,¢EraseMode¢,¢none¢,¢LineWidth¢,1);
line(XM,YM,¢Color¢,¢white¢,¢EraseMode¢,¢none¢,¢LineWidth¢,2);
line(XH,YH,¢Color¢,¢white¢,¢EraseMode¢,¢none¢,¢LineWidth¢,3);
fis=fis-asec;
fim=fim-asec/12;
fih=fih-asec/144;
end
Задача №3. Смоделировать стереоэффект (оптическую иллюзию) на примере изображения тетраэдра, представленного в виде отрезков линий. Стереоэффект реализовать с помощью вращения вершин A, B, C по часовой стрелке, а вершины D — против часовой стрелки. На рис.2 приведен примерный эскиз изображения тетраэдра.
Рис.2. Стрелки у вершин тетраэдра указывают
направление вращения вершин
Решение.
Задаем рабочее окно:
hF=figure(¢NumberTitle¢,¢off¢,¢Name¢, …
¢Stereo Effect of Plain Images¢,¢Color¢,[0 1 0]);
hA=axes(¢Parent¢,hF,¢Units¢,¢pixels¢,¢Position¢,[25 25 325 325]);
axis([-1,1,-1,1]);
r=3; LS=0.1; asec=-pi/30; fis=0;
Задаем вершины тетраэдра и их вращения:
x=[-0.5,0,0.6,0]; y=[-0.5,0.8,-0.4,0];
xb=-0.3; yb=-0.3;
for t=1:300
xs=LS*cos(fis); ys=LS*sin(fis);
xh=1.5*LS*cos(fis); yh=-1.5*LS*sin(fis);
XS=[x(1)+xs,x(2)++xs,x(3)+xs,x(1)+xs, …
x(4)+xh,x(2)+xs,x(3)+xs,x(4)+xh];
YS=[y(1)+ys,y(2)++ys,y(3)+ys,y(1)+ys, …
y(4)+yh,y(2)+ys,y(3)+ys,y(4)+yh];
line(XS,YS,¢Color¢,¢black¢,¢EraseMode¢,¢none¢,¢LineWidth¢,r);
pause(0.1);
line(XS,YS,¢Color¢,¢white¢,¢EraseMode¢,¢none¢,¢LineWidth¢,r);
fis=fis+asec;
end;