【发布时间】:2017-04-23 20:35:47
【问题描述】:
我想要做的是获取点列表 (x,y,z) 的数据,散点图上的单个“单元格”(有 9 个不同的单元格:c=1,...,9 ) 和 t=time,并由此创建一个 scatter3,随着位置随时间的变化而不断更新。由于散点图上每个点的 t 从 0 开始,因此散点图上应始终有 9 个点。到目前为止,我所写的只是下面的这段代码,它将列表转换为矩阵,并根据 t 的当前值和最后一个值按顺序绘制每个点(不管 c 值如何),并带有暂停。
x=['x axis points'];
y=['y axis points'];
z=['z axis points'];
c=[1,1,1,1,1,2,2,2,2,3,3,3,3....8,8,8,8,8,8,8,9,9,9,9,9,9,9]; %cells
t=[0,1,2,3,4,0,1,2,3,0,1,2,3,,,,0,1,2,3,4,6,7,0,4,6,9,10,12,14]; %time resetting at 0 for each cell
mat=cell2mat({[x;y;z;c;t]}); %Convert cells into a matrix
scatter3(mat(1,2),mat(1,3),mat(1,4),100);
axis tight;
for jj=1:numel(mat(5,:)) %loops through for length of 5th row
scatter3(mat(1,jj),mat(2,jj),...
mat(3,jj),100); %plots point at t(x,y,z) w/ no regard to c
drawnow
if(jj>1 && mat(5,jj-1)>0)
pause(mat(5,jj)-mat(5,jj-1)) %waits for difference in last two times if not 0
else
pause(1) %otherwise pause a second
end
end
我需要做的第一件事是修改循环,以便绘制每个散点 - 对于时间 t 的每个 c,将其点绘制在对应的 (x,y,z) 处。
- 算法帮助会很好,我已经多年没有使用 MATLAB,而且我的算法技能已经生疏了:这可以用 for 循环完成吗?我应该根据时间对矩阵进行排序,然后根据 c 进行拆分吗?
接下来我需要想办法随着时间的推移更新点
- 是否值得尝试计算每个点之间的 3D 距离并让它逐渐向目的地“滑动”,或者这在 MATLAB 中会非常困难吗?另外,如果两个点同时在两个非常不同的地方,这将如何处理边界?该图是否只是在 MATLAB 中自动缩放?
一旦我有一个足够流畅地显示所有点的算法,我就可以使用以下代码将其转换为视频:https://www.youtube.com/watch?v=nnkTSX5U_a4
如果有人在动画这样的数据方面有智慧,请分享提示或有用的代码。我有一些编程背景,但根本不会表示这样的数据,所以我发现简单的东西让我陷入循环,如果这篇文章遇到了非常糟糕的问题,我很抱歉。
示例数据:
x=[-213.135 -217.261 -220.636 -225.325 -227.763 -232.826 -236.389 -239.577
-238.827 -242.39];
y=[92.081 90.955 88.892 86.83 84.767 82.891 84.392 80.453 75.765
73.327];
z=[60 70 70 80 90 90 90 90 90 100];
c=[1 1 1 1 1 1 1 1 1 1];
t=[0 1.008566667 2.017133333 3.025716667 4.034283333 5.04285 6.051416667
7.059983333 8.068566667 9.077133333];
【问题讨论】:
-
请包含示例
x、y和z数据,以便您可以运行现有代码,以便更好地了解您的问题 -
@Wolfie 我从我的数据中添加了前 10 个数字,c=1 表示它是同一个单元格。要一次绘制多个点,只需复制此数据并将 c 值更改为 2,3,4... 并更改 x、y、z 值之一,以便它们不会相互绘制,时间间隔是我刚刚意识到的每个点都一样,因此程序可以同时更新每个点。
标签: algorithm matlab 3d scatter-plot