有人知道我应该如何使用animationline来立即吸引我的轨道吗? [英] Does anybody know how should I use animatedline in order to draw me an orbit immediately?

查看:103
本文介绍了有人知道我应该如何使用animationline来立即吸引我的轨道吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是主要代码

%%%%%%%%%%%% 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');

我想做的是,当我运行脚本时,应该出现一个带有地球的图形,并且在用梯级kutta算法计算位置时,它应该实时上传轨道.但是现在该图仅在计算Rk算法后直到tspan结束并且该图的轨道已经上载而没有中间点的情况下才出现.我该怎么办?我在github上看到其他人使用了animationline和drawow. 我在想

What I wanna do is that when I run the script a figure with the Earth should appear, and while the positions are being caluclated by the runge kutta algorithm it should upload the orbit in real time. But now the figure appears only after the Rk algorithm is being calculated till the end of tspan and the orbit from the figure is already uploaded without intermediate points. What should I do? I've seen on github that others use animatedline and drawnow. I was thinking about

 orbit=animatedline;

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

但是我应该把这行准确地放在哪里?如果我将其放入rk循环中,它将不起作用,并且如果我将其放入

But where should I put this line exactly? if I put it in the rk loop it doesn't work and if I put it

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

它首先显示一个具有轨道的图形,但不显示中间点,然后显示一个与地球不同的图形,而轨道和地球应该在同一图形中.

it first displays a figure with the orbit but not by intermediate points and then a different figure with the Earth ,while the orbit and the Earth should be in the same figure.

推荐答案

您正在使用 animatedline 错误的方式.

You are using animatedline in a wrong way.

该行:

orbit = animatedline;

应放置在计算点和线的循环之前:

should be placed before the loop that calculates the points, and the lines:

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

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

should be placed within it, to add one (or several) points to the line on each iteration. But, a better approach, would be to first calculate all the orbit and then use a loop for the animation. This way you have more control over the rate of the animation. Here is a small example using your case:

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

替代选项

不要使用animated line,而是继续更新绘图中的数据.这是一个简单的锻炼方法:

Alternative option

Don't use animated line just keep updating the data in the plot. Here is a simple workout for this:

% 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

结果:

这篇关于有人知道我应该如何使用animationline来立即吸引我的轨道吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆