【问题标题】:MATLAB - How to make multiple markers moving simultaneous in 3d plot in MATLABMATLAB - 如何在 MATLAB 的 3d 图中使多个标记同时移动
【发布时间】:2015-03-12 08:50:42
【问题描述】:

我目前正在开展一个模拟两个航天器和一个卫星(火卫一)绕火星运动的项目。一个名为 SPICE 的 MATLAB 工具给了我一个包含 x、y 和 z 距离的数组,我用它们来绘制运行良好的轨道。现在我想为每个航天器和火卫一获取标记,以查看它们何时相互飞行。我让标记工作但不是同时工作,它们相互追逐。我在 youtube 上找到了一个例子,所以它一定是可能的,但他还没有发布代码如何做到这一点(https://www.youtube.com/watch?v=nArR2P0o4r4)。

这是我的代码:

a = position_MEX_Mars(1,:);
b = position_MEX_Mars(2,:);
c = position_MEX_Mars(3,:);
k = position_MAVEN_Mars(1,:);
l = position_MAVEN_Mars(2,:);
m = position_MAVEN_Mars(3,:);
x = position_Phobos_Mars(1,:);
y = position_Phobos_Mars(2,:);
z = position_Phobos_Mars(3,:);
ah = axes;
set(ah,'XLim',[min(x) max(x)],'YLim',[min(y) max(y)],...
    'ZLim',[min(z) max(z)]);
plot3(0,0,0,'ro-',x,y,z,a,b,c,k,l,m);
grid on;
hold on;
hpoint = line('XData', 0,'YData', 0,'ZData', 0,'Color','black','Marker',...
    'o','MarkerSize',10);
ht = hgtransform('parent',ah);
set(hpoint,'Parent',ht);
for i =2:length(x)
    trans = makehgtform('translate',[x(i) y(i) z(i)]);
    set(ht,'Matrix',trans);
    pause(0.001);
end

这将在时间上运行一个很好的火卫一轨迹动画图,但只有火卫一,而不是与 MEX 和 MAVEN(来自 ESA 和 NASA 的航天器)同时运行。

我试过了,但没有用:

a = position_MEX_Mars(1,:);
b = position_MEX_Mars(2,:);
c = position_MEX_Mars(3,:);
k = position_MAVEN_Mars(1,:);
l = position_MAVEN_Mars(2,:);
m = position_MAVEN_Mars(3,:);
x = position_Phobos_Mars(1,:);
y = position_Phobos_Mars(2,:);
z = position_Phobos_Mars(3,:);
ah = axes;
set(ah,'XLim',[min(x) max(x)],'YLim',[min(y) max(y)],...
    'ZLim',[min(z) max(z)]);
plot3(0,0,0,'ro-',x,y,z,a,b,c,k,l,m);
grid on;
hold on;
hpoint = line('XData', 0,'YData', 0,'ZData', 0,'Color','black','Marker',...
    'o','MarkerSize',10);
ht = hgtransform('parent',ah);
set(hpoint,'Parent',ht);
for i =2:length(x)
    trans1 = makehgtform('translate',[x(i) y(i) z(i)]);
    set(ht,'Matrix',trans1);
    trans2 = makehgtform('translate',[a(i) b(i) c(i)]);
    set(ht,'Matrix',trans2);
    pause(0.001);
end

我还尝试合并数组,以便将它们逐个绘制,但这会使动画不流畅并且对项目不满意。

a = position_MEX_Mars(1,:);
b = position_MEX_Mars(2,:);
c = position_MEX_Mars(3,:);
k = position_MAVEN_Mars(1,:);
l = position_MAVEN_Mars(2,:);
m = position_MAVEN_Mars(3,:);
x = position_Phobos_Mars(1,:);
y = position_Phobos_Mars(2,:);
z = position_Phobos_Mars(3,:);
tempx = [position_MEX_Mars(1,:); position_Phobos_Mars(1,:); position_MAVEN_Mars(1,:)];
xt = tempx(:);
tempy = [position_MEX_Mars(2,:); position_Phobos_Mars(2,:); position_MAVEN_Mars(2,:)];
yt = tempy(:);
tempz = [position_MEX_Mars(3,:); position_Phobos_Mars(3,:); position_MAVEN_Mars(3,:)];
zt = tempz(:);
ah = axes;
set(ah,'XLim',[min(x) max(x)],'YLim',[min(y) max(y)],...
    'ZLim',[min(z) max(z)]);
plot3(0,0,0,'ro-',x,y,z,a,b,c,k,l,m);
grid on;
hold on;
hpoint = line('XData', 0,'YData', 0,'ZData', 0,'Color','black','Marker',...
    'o','MarkerSize',10);
ht = hgtransform('parent',ah);
set(hpoint,'Parent',ht);
for i =2:length(x)
    trans = makehgtform('translate',[xt(i) yt(i) zt(i)]);
    set(ht,'Matrix',trans);
    pause(0.001);
end

我想我已经很接近了,但我似乎遗漏了一些东西,而且我对 MATLAB 的了解还不是很好。希望你能帮帮我。

干杯杰伦

【问题讨论】:

  • 将问题简化为您要解决的具体问题会有所帮助。您在这里进行了相当多的轨道漫游,而我正在努力弄清楚您究竟遇到了什么问题。
  • @Aiken,问题是我无法让两个同时标记顺利移动,如 youtube 视频中所见。到目前为止,我发现的解决方案显示了彼此之后的轨迹,因此首先是航天器1,然后是航天器2,或者合并阵列的 MATLAB 将在航天器之间快速切换,这非常华丽且不流畅。我希望这能解决问题。
  • 我的评论与其说是要求在 cmets 中进行澄清,不如说是在推动重新检查您的问题并编辑到您要解决的具体问题。我对 MATLAB 一无所知,只是在审核队列中遇到了您的问题,所以我无法回答您的问题,但如果您可以向 实际 MATLAB 专家非常清楚您的问题是什么那么您(以及任何未来遇到同样问题的访问者)更有可能得到满意的解决方案。

标签: matlab animation markers simultaneous


【解决方案1】:

这是一个可能有用的简化(并且在物理上不正确)示例:

t = linspace(0,2,1000); %// time parameter
x1 = 10*cos(2*pi*t+1);
y1 = 5*sin(2*pi*t+1); %// trajectory of object 1
x2 = 2*cos(6*pi*t-2);
y2 = 3*sin(6*pi*t-2); %// trajectory of object 1
plot(x1,y1,'color',[.5 .5 .5]); %// plot trajectory of object 1
hold on
plot(x2,y2,'color',[.5 .5 .5]); %// plot trajectory of object 2
h1 = plot(x1(1),y1(1),'ro'); %// plot initial position of object 1
h2 = plot(x2(1),y2(1),'b*'); %// plot initial position of object 2
axis([-12 12 -12 12]) %// freeze axis size
grid on
for n = 1:numel(t)
    set(h1, 'XData', x1(n), 'YData', y1(n)); %// update position of object 2
    set(h2, 'XData', x2(n), 'YData', y2(n)); %// update position of object 2
    drawnow %// refresh figure
end

【讨论】:

  • 我并不是要粗鲁,但不是这样即使你不做drawnow,这个数字最终会更新自己吗?我的意思是,既然makehgtform 似乎很慢,那么drawnow 还能解决问题吗?这就是我不建议使用drawow的原因。如果我错了,请纠正我。
  • 感谢这使它顺利,但我的位置数组是 a.t.m。 29.000 个多头头寸。在我的原始脚本中,我使用了 pause(0.001);加快动画速度。这似乎在这里不起作用还有其他方法可以加快动画速度吗?这就是你的意思@patrik?
  • @Terranees,我猜你无法同步不同的标记。在那种情况下,我不确定drawnow 是否会起作用。不过,我想把这个问题直接问 Luis Mendo,因为他的解决方案通常效果很好。
  • @patrik 其实我对这个问题还没有深入了解(抱歉,文本和代码太多了)。我只是想展示一个示例,其中两个标记同时移动。我使用drawnow 只是为了在每次循环迭代时强制更新。如果省略drawnow,Matlab 可能会决定稍后更新该图
  • @Terranees 要加快动画速度,请使用drawnow 而不是pause。这样你就可以强制图形更新而不引入任何暂停
【解决方案2】:

你想做的事情并不像你想象的那么容易。主要问题是您需要同时更新所有内容。多年来,这已以多种方式实施。一种方法是使用所谓的双缓冲区。

这意味着您有两个“表面”可供绘画。在 matlab 中,这被转换为 2 个轴(或者可能是 2 个图形)。但是,您只能同时看到一个轴。这意味着您将有时间在显示内容之前在“隐藏的表面”上绘制所有内容。完成所需的一切后,只需切换可见的表面即可。

这可以通过更简单的方式完成,但我不熟悉matlab中的hgtransfrom函数。

编辑 这是一个如何完成的示例

function test()
fig = figure;
ax1 = axes;
plot(1:10);

ax2 = axes;
plot(1:10,'r');
setVisibility(ax2,'off');

pause(1);
for k = 1:5
    setVisibility(ax2,'on');
    setVisibility(ax1,'off');
    pause(1);
    setVisibility(ax1,'on');
    setVisibility(ax2,'off');
    pause(1);
end

function setVisibility(ax, visibility)
set(ax, 'visible', visibility)
set(findall(ax), 'visible', visibility)

【讨论】:

  • 这听起来很合乎逻辑,我想知道您是否知道任何示例,您是否还可以提及其他方式?
  • @Terranees,我可以发布一个简单的示例作为编辑。其他方式通常需要更高级的框架。您也可以尝试对代码进行矢量化处理,以便您可以对绘图函数进行一次调用。
  • 如果这不是太多要求,那就太好了。两周前我刚开始使用 MATLAB,我习惯于写出循环,我不知道向量化,谢谢你的提示:D @patrik
  • @Terranees 好的,我添加了最简单的示例,它只是闪烁 2 个不同的轴。由于我发现无法在同一个函数调用中设置可见轴上的所有内容,因此不会同时显示完整的轴。但是,将绘图设置为可见通常是一项简单的任务,这意味着眼睛永远不会注意到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多