有没有人知道我应该如何使用动画线来立即绘制我的轨道?

时间:2017-12-21 00:34:41

标签: matlab 3d matlab-figure orbital-mechanics

这是主要代码

%%%%%%%%%%%% Valori pentru Rcsc


%%%%Pozitiile si vitezele pe cele 3 axe

y0(1,1)=   743322.3616  ;                                     
y0(2,1)=   -6346021.219 ;                               
y0(3,1)=     -3394131.349 ;                                   
y0(4,1)=     5142.38067;        
y0(5,1)=   4487.44895   ;                    
y0(6,1)=     -7264.00872;                     
%%%% Timpul

tspan=[0 :864]; 

%%%% Masa(kg) si aria suprafetei satelitului (m^2)

m =    217 ;         %320;
A =   1.2;             %8;

%%%% Metoda Runge-Kutta de ordin 4

h=1;                                                                             
y = zeros(6, tspan(end)/h); 
y(:,1) = y0;

for i=1:(tspan(end)/h)    
    H=sqrt(y(1,i)^2+y(2,i)^2+y(3,i)^2);
    k_1 = proiectia(tspan(i), y(:,i), H, m, A, y(4:6, i));
    k1=double(k_1);
    k_2 = proiectia(tspan(i)+0.5*h, y(:,i)+0.5*h*k_1, H, m, A, y(4:6, i));
    k2=double(k_2);
    k_3 = proiectia((tspan(i)+0.5*h), (y(:,i)+0.5*h*k_2), H, m, A, y(4:6, i));
    k3=double(k_3);
    k_4 = proiectia((tspan(i)+h),(y(:,i)+k_3*h), H, m, A, y(4:6, i));
    k4=double(k_4);

    y(:,i+1) = double(y(:,i) + (1/6)*(k1+2*k2+2*k3+k4)*h);  

end


%%% Distanta satelitului
Rcsc = ((y(1,:).^2 + y(2,:).^2 + y(3,:).^2).^0.5);
n=50;
%plot(tspan,Rcsc)
 %% Textured 3D Earth example
%
% Ryan Gray
% 8 Sep 2004
% Revised 9 March 2006, 31 Jan 2006, 16 Oct 2013

%% Options

space_color = 'k';
npanels = 180;   % Number of globe panels around the equator deg/panel = 360/npanels
alpha   = 1; % globe transparency level, 1 = opaque, through 0 = invisible
GMST0 = []; % Don't set up rotatable globe (ECEF)
%GMST0 = 4.89496121282306; % Set up a rotatable globe at J2000.0

% Earth texture image
% Anything imread() will handle, but needs to be a 2:1 unprojected globe
% image.

image_file = 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Land_ocean_ice_2048.jpg/1024px-Land_ocean_ice_2048.jpg';

% Mean spherical earth

erad    = 6371008.7714; % equatorial radius (meters)
prad    = 6371008.7714; % polar radius (meters)
erot    = 7.2921158553e-5; % earth rotation rate (radians/sec)

%% Create figure

figure('Color', space_color);


hold on;
 orbit=animatedline;
addpoints(orbit,y(1,:),y(2,:),y(3,:));
drawnow

% Turn off the normal axes

set(gca, 'NextPlot','add', 'Visible','off');

axis equal;
axis auto;

% Set initial view

view(0,30);

axis vis3d;

%% Create wireframe globe

% Create a 3D meshgrid of the sphere points using the ellipsoid function

[x, y, z] = ellipsoid(0, 0, 0, erad, erad, prad, npanels);

globe = surf(x, y, -z, 'FaceColor', 'none', 'EdgeColor', 0.5*[1 1 1]);



%% Texturemap the globe

% Load Earth image for texture map

cdata = imread(image_file);

% Set image as color data (cdata) property, and set face color to indicate
% a texturemap, which Matlab expects to be in cdata. Turn off the mesh edges.

set(globe, 'FaceColor', 'texturemap', 'CData', cdata, 'FaceAlpha', alpha, 'EdgeColor', 'none');

我想要做的是,当我运行脚本时,应该出现一个带有地球的图形,并且当这些位置被runge kutta算法计算时,它应该实时上传轨道。但是现在只有在计算Rk算法直到tspan结束并且图中的轨道已经上传而没有中间点时才出现该图。我该怎么办?我在github上看到其他人使用animatedline和drawow。 我在考虑

 orbit=animatedline;

    addpoints(orbit,y(1,:),y(2,:),y(3,:));
    drawnow
    end

但我应该把这条线准确放在哪里?如果我把它放在rk循环中它不起作用,如果我把它

% Create figure
figure('Color', space_color);
%%
orbit=animatedline;
addpoints(orbit,y(1,:),y(2,:),y(3,:));
drawnow

它首先显示一个带有轨道但不是中间点的数字,然后显示与地球不同的数字,而轨道和地球应该在同一个数字中。

1 个答案:

答案 0 :(得分:0)

您以错误的方式使用animatedline

该行:

orbit = animatedline;

应放在计算点的循环之前,以及行:

addpoints(orbit,y(1,i),y(2,i),y(3,i));
drawnow

应该放在其中,在每次迭代时向该行添加一个(或几个)点。但是,更好的方法是首先计算所有轨道,然后使用循环来制作动画。这样您就可以更好地控制动画的速度。以下是使用您的案例的一个小例子:

orbit = animatedline;
for k = 1:size(y,2)
    addpoints(orbit,y(1,k),y(2,k),y(3,k));
    drawnow
end

替代选项

不要使用animated line只是不断更新图中的数据。这是一个简单的锻炼:

% create a sphere with earth map on it:
set(gcf,'Color','k')
earth = imread('earth.jpg');
[X,Y,Z] = sphere(50); 
warp(-X,Y,-Z,earth)
axis off
view(-46,17)

% set an animation of a simple orbit:
Nframes = 100; % number of steps in the orbit
% calculation of the orbit:
orb = linspace(-pi,pi,Nframes); 
x = cos(orb).*1.5;
y = sin(orb);
hold on
% plot the whole orbit invisible, just for setting the axes limits:
tmp = plot(x,y,'Color','none');
p = plot(x(1),y(1),'LineWidth',3,'Color','m'); % plot the first step
hold off
for k = 1:numel(orb)
    p.XData = x(1:k); % update the data of the plot
    p.YData = y(1:k);
    pause(0.05) % delay
end

结果:

earth orbit