Этот пример показывает, как анимировать поверхность. А именно, этот пример анимирует сферическую гармонику. Сферические гармоники являются сферическими версиями ряда Фурье и могут использоваться, чтобы смоделировать свободные колебания Земли.
Задайте набор точек на сферической сетке, чтобы вычислить гармонику.
theta = 0:pi/40:pi; % polar angle phi = 0:pi/20:2*pi; % azimuth angle [phi,theta] = meshgrid(phi,theta); % define the grid
Вычислите сферическую гармонику со степенью шесть, порядком одного и амплитудой 0,5 на поверхности сферы с радиусом, равным пять. Затем преобразуйте значения в Декартовы координаты.
degree = 6; order = 1; amplitude = 0.5; radius = 5; Ymn = legendre(degree,cos(theta(:,1))); Ymn = Ymn(order+1,:)'; yy = Ymn; for kk = 2: size(theta,1) yy = [yy Ymn]; end yy = yy.*cos(order*phi); order = max(max(abs(yy))); rho = radius + amplitude*yy/order; r = rho.*sin(theta); % convert to Cartesian coordinates x = r.*cos(phi); y = r.*sin(phi); z = rho.*cos(theta);
Используя функцию surf
, постройте сферическую гармонику на поверхности сферы.
figure s = surf(x,y,z); light % add a light lighting gouraud % preferred lighting for a curved surface axis equal off % set axis equal and remove axis view(40,30) % set viewpoint camzoom(1.5) % zoom into scene
Чтобы анимировать поверхность, используйте цикл for, чтобы изменить данные в вашем графике. Чтобы заменить поверхностные данные, установите XData
, YData
и свойства ZData
поверхности к новым значениям. Чтобы контролировать скорость анимации, используйте pause
после обновления поверхностных данных.
scale = [linspace(0,1,20) linspace(1,-1,40)]; % surface scaling (0 to 1 to -1) for ii = 1:length(scale) rho = radius + scale(ii)*amplitude*yy/order; r = rho.*sin(theta); x = r.*cos(phi); y = r.*sin(phi); z = rho.*cos(theta); s.XData = x; % replace surface x values s.YData = y; % replace surface y values s.ZData = z; % replace surface z values pause(0.05) % pause to control animation speed end