【问题标题】:Matlab graph disappearing when adding linespec添加linespec时Matlab图形消失
【发布时间】:2017-01-13 08:03:46
【问题描述】:

所以我有这个行星模拟,我想在其中绘制行星的位置(所以当行星四处移动时,一条不间断的线跟随行星)并尝试使用许多不同的 linespec 变体。我相信问题可能是因为我先使用了“set(h..)”函数,然后在循环中绘制,但我不确定。

clc, close all, clear all

%% Constants
m_sun=1.9891*10^(30); % Sun mass KG
m_earth=5.972*10^(24); 
G=1.4879*10^(-34); %Gravitational constant %AU^3/(kg*day^2) %Because JPL Data..
n=36500; %1 year is 36.5 because 1 step is 10 days so this is 10 years.
dt=1; %Stepsize is by the DATA from JPL aut. set to 10 days (dt=1 aka 10 days)

%% Start pos. and velocity for Sun, Mercury, Venus, Earth and Moon
psol=[0 0 0];

%% Mercury
x_mercury=-1.433719457930228E-01; %AU
y_mercury=2.837093715285307E-01; %AU
z_mercury=3.633570612044031E-02; %AU

vx_mercury=-3.076848842366683E-02; %AU/Day
vy_mercury=-1.162353364156454E-02; %AU/Day
vz_mercury=1.872970822663991E-03;

v0_mercury=[vx_mercury vy_mercury vz_mercury];
p0_mercury=[x_mercury y_mercury z_mercury];
v_mercury=v0_mercury;
p_mercury=p0_mercury;

%% Venus
x_venus=4.673243997906552E-01; %AU
y_venus=5.508231287051383E-01; %AU
z_venus=-1.941467305848078E-02; %AU

vx_venus=-1.548526759260772E-02; %AU/Day
vy_venus=1.299852601837024E-02; %AU/Day
vz_venus=1.071832461568199E-03; %AU/Day

v0_venus=[vx_venus vy_venus vz_venus];
p0_venus=[x_venus y_venus z_venus];
v_venus=v0_venus;
p_venus=p0_venus;

%% Earth
x_jord=-1.796136519182077E-01; %AU
y_jord=9.667949205028737E-01; %AU
z_jord=-3.668730384613077E-05; %AU

vx_jord=-1.720038360546182E-02; %AU/Day
vy_jord=-3.211186215649903E-03; %AU/Day
vz_jord=7.927770738232715E-07; %AU/Day

v0_jord=[vx_jord vy_jord vz_jord];
p0_jord=[x_jord y_jord z_jord];
v_jord=v0_jord;
p_jord=p0_jord;

%% Moon 
x_moon=1.735515971173234E-03; %AU
y_moon=-1.954900859093033E-03; %AU
z_moon=9.023023109649464E-05; %AU

vx_moon=4.195999130374965E-04; %AU/Day
vy_moon=4.002519066694706E-04; %AU/Day
vz_moon=-4.849066257645466E-05; %AU/Day

v0_moon=[vx_moon vy_moon vz_moon];
p0_moon=[x_moon y_moon z_moon];
v_moon=v0_moon;
p_moon=p0_moon;


%% Calculations
hold on
h_sun = plot3(0,0,0,'y.','markersize',80);
h_mercury = plot3(1,1,1,'k.','markersize',35);
h_venus = plot3(2,2,2,'m.','markersize',45);
h_earth = plot3(3,3,3,'b.','markersize',55);
h_moon = plot3(4,4,4,'r.','markersize',25);

for step=1:n
      %% Mercury
      r_vekt_mercury=-p_mercury;
      r_mercury=sqrt(x_mercury^2 + y_mercury^2 + z_mercury^2); %Radius in AU
      a_mercury=((G*m_sun)/((r_mercury)^3))*r_vekt_mercury;
      v_mercury=a_mercury*dt+v_mercury;
      p_mercury=v_mercury*dt+p_mercury;

      %% Venus
      r_vekt_venus=-p_venus;
      r_venus=sqrt(x_venus^2 + y_venus^2 + z_venus^2); %Radius in AU
      a_venus=((G*m_sun)/((r_venus)^3))*r_vekt_venus;
      v_venus=a_venus*dt+v_venus;
      p_venus=v_venus*dt+p_venus;

      %% Jord
      r_vekt_jord=-p_jord;
      r_jord=sqrt(x_jord^2 + y_jord^2 + z_jord); %Radius in AU
      a_jord=((G*m_sun)/((r_jord)^3))*r_vekt_jord;
      v_jord=a_jord*dt+v_jord;
      p_jord=v_jord*dt+p_jord;

%     %% Moon
      %r_vekt_moon=psol-p_moon;
      r_vekt_moon_earth=p_jord-p_moon;
      r_moon=sqrt(x_moon^2 + y_moon^2 + z_moon^2); %Radius in AU
      a_moon=((G*m_earth)/((r_moon)^3))*r_vekt_moon_earth;
      v_moon=a_moon*dt+v_moon;
      p_moon=v_moon*dt+p_moon;

      set(h_sun,'XData',psol(1),'YData',psol(2),'ZData',psol(3));    
      set(h_mercury,'XData',p_mercury(1),'YData',p_mercury(2),'ZData',p_mercury(3));
      set(h_venus,'XData',p_venus(1),'YData',p_venus(2),'ZData',p_venus(3));
      set(h_earth,'XData',p_jord(1),'YData',p_jord(2),'ZData',p_jord(3));
      set(h_moon,'XData',p_moon(1),'YData',p_moon(2),'ZData',p_moon(3));
      xlabel('AU');
      ylabel('AU');
      zlabel('AU');
      axis([-2 2 -2 2 -2 2]);
      drawnow;
      hold off
  end

因此,如果您查看循环之前的内容,您会看到我提到的“set(...)”函数,循环末尾是绘图。如果我改变即@ h_mercury 从'k'。 'k' 行星完全消失。如果我将其更改为“-。”它也会消失。我尝试了无数种变化,要么行星消失了,要么给了我一个错误。我在 2d plot、3d plot、linespec 等中查看了@matlabs 网站的帮助部分,但仍然没有找到解决方案!

希望有人能尽快帮我解决这个问题!

谢谢

【问题讨论】:

    标签: matlab plot simulation


    【解决方案1】:

    您为每个行星绘制的图是单点线图 (plot3(0,0,0,'k.',...))。这意味着当您指定一个标记时,您的单点将配备一个标记,这就是您看到它的方式。目前,您正在使用点标记 ('k.')。如果删除点,则不再有标记,也没有线,因为没有两个点可以连接。

    您的set(...) 不是通过向其添加点而是通过移动您最初绘制的单个点来更新绘图。要查看会发生什么,请输入inspect(h_mercury),您会注意到它的XDataYDataZData 只包含一个点。

    如果你想用前面的点画线,你需要把它们添加到图中。至少有两种方式:

    • plot3(p_mercury(1),p_mercury(2),p_mercury(3),'k.')) 添加到您的循环中。这将在所有已经访问过的位置放置额外的绘图点。虽然这很简单,但不一定是最好的:不会有一条实线连接点,如果你做了很多步骤,这会增加很多点,从而使动画变慢。如果你想使用它,你还必须在循环结束时删除hold off 命令,否则plot3 会清除绘图。
    • 更好:在数组中记住轨迹并有两个图,一个用于当前位置(点标记),一个用于轨迹(线)。像这样:

    .

    h_mercury = plot3(1,1,1,'k.','markersize',35);
    h_mercury_trajectory = plot3(1,1,1,'k-');
    
    p_mercury_trajectory = zeros(3,n);
    for step = 1:n
        % your calculation of positions...
        p_mercury = ...
        p_mercury_trajectory(:,step) = p_mercury;
    
        % rest of the loop ...
    
        % update plots
        set(h_mercury,'XData',p_mercury(1),'YData',p_mercury(2),'ZData',p_mercury(3));
        set(h_mercury_trajectory,'XData',p_mercury_trajectory(1,1:step),'YData',p_mercury_trajectory(2,1:step),'ZData',p_mercury_trajectory(3,1:step));
    end
    

    这是开始后不久的样子:

    这就是你的想法吗?

    再修改:因为我真的很喜欢你的动画,所以我将太阳和行星转换成球体,光线来自中心(太阳)。我有点喜欢这个效果。这是它的样子:

    月球的轨道有点夸张吧?

    不管怎样,修​​改后的脚本在这里:https://nopaste.me/view/473add8f

    【讨论】:

    • 所以我尝试了您编写的代码,但它只添加了一条从太阳到行星的线(我只尝试使用 Mercury 来看看它的外观)跟随行星绕着像一座桥一样的东西行星到太阳。这是什么原因?至于你写的另一个解决方案,我会在循环结束之前在 set(...) 之后添加 plot3(...) 吗?
    • 我犯了一个小错误。我很抱歉。我编辑了我的解决方案并在这里进行了测试,它现在应该可以工作了。
    • 没错!我将尝试复制您创建的内容并将其添加到我所有的星球!如果您想进一步解释一下,我很想真正尝试了解您的代码的作用,而不仅仅是复制它!
    • 嗯,我不确定如何更好地解释它。基本上每个行星有两个图:一个线图绘制从开始到当前步骤的整个轨迹,即 3-D 中step 点之间的线。另外一个图只在行星的当前位置绘制一个标记,这是一个大的实心点。 set 命令分别用当前点 (p_mercury) 及其轨迹 (p_mercury_trajectory(:,1:step)) 更新标记图 (h_mercury) 和轨迹图 (h_mercury)。如果还有什么不清楚的,请进一步询问。
    • 我对动画做了一些修改,因为我真的很喜欢它。现在包括闪电,请参阅我的上次编辑。
    【解决方案2】:

    行格式

    当您将样式从 'k.' 更改为 'k' 时,您所坐的线正在消失,您正在绘制一个点(格式为来自 . 的点)所以如果您不绘制点标记,你没有可见的线!有关可用于绘制连续轨迹或移动点的代码,请参见下文。

    建议代码

    我完全省略了Set 命令,只是简单地重新绘制了每次迭代,见下文...

    % Previous code omitted
    % < ... >
    
    %% Calculations
    
    for step=1:n
    
        % < ... >
        % Code omitted for clarity, do calculations for each planet as in question
        % < ... >
    
        % Replace use of SET with continued use of PLOT3
    
        % Clear figure from previous plot and hold on
        figure(1)
        clf          % << Remove if you don't want the previous points to disappear
        hold on
    
        % Do all plotting
        h_sun = plot3(psol(1),psol(2),psol(3),'y.','markersize',80);
        h_mercury = plot3(p_mercury(1),p_mercury(2),p_mercury(3),'k.','markersize',35);
        h_venus = plot3(p_venus(1),p_venus(2),p_venus(3),'m.','markersize',45);
        h_earth = plot3(p_jord(1),p_jord(2),p_jord(3),'b.','markersize',55);
        h_moon = plot3(p_moon(1),p_moon(2),p_moon(3),'r.','markersize',25);
    
        % Format, hold off, draw
        xlabel('AU');
        ylabel('AU');
        zlabel('AU');       
        axis([-2 2 -2 2 -2 2]);     
        hold off        
        drawnow;
    
    end
    

    【讨论】:

    • 所以我在计算后将循环外的 PLOT3 移动到循环内。并用 PLOT3 替换了 SET。这确实解决了问题,但它只是添加了(以前的)点和标记,而不是在移动标记后面添加一条线。
    • 无法编辑我的评论,但我注意到它还将我的 3d 模拟变成了 2d 模拟
    • 所以你有:根据模拟绘制哪些更新。您想要:相同但也有一行先前计算的值?此外,这根本不会改变您的模拟,所以我不确定您说它现在是 2D 是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多