在 Matlab 中,我在3D空间中获得了几个分数。这些点代表一根绳子,我想绘制一条连接所有这些点的线。这是我的问题:应该如何组织这些要点才能拥有一个简单的"和"或多或少的线条"。换句话说,我想绘制一条连接从第一个到最后一个点的所有点的线,但不是"返回" 。也许用简单的图像我可以更好地解释我的问题:
这是代码应该做的事情:
这是代码不应该做的事情:
关于如何实现预期结果的一些想法?我该如何组织积分?我正在使用Matlab,但如果你知道任何论文,我可以阅读如何做到这一点就没问题了。谢谢。
答案 0 :(得分:1)
如果你不想回到上方,那么@Dan建议的解决方案应该没问题。在连接之前将它们按那个方向排序。
但是,如果这不是一项要求,但您实际上正在寻找一个没有尽可能短的丑陋交叉的解决方案,您可能需要寻找解决旅行商问题的解决方案。
如果您将1到9之间的距离定义为零,那么您找到旅行商问题的解决方案应该能为您提供一条漂亮而短的绳索。
如果你想采用TSP方法但有点迷失,那就试试最长的插入'开始职位或' 2选择'这些改进可能会在很少的努力下对随机路径选择进行大的改进。
答案 1 :(得分:0)
行。我找到了正确答案(由Gunther Struyf撰写):Sort Coordinates Points in Matlab
为了可视化最终结果,只需在Gunther的代码中添加以下行:
row=data(:,1);
col=data(:,2);
figure
scatter(row,col,'r');
hold on
line(row(result),col(result));
以下代码显示了相同的算法,但是对于3D实现:
close all;
data = [2,2, 2; 2,3,2 ; 1,2,3 ; 1,3,3 ; 2,1,3 ; 1,1,3 ; 3,2,4 ; 3,3,4 ; 3,1,5; 5,4,6; 7,3,8; 8,9,7; 9,4,7; 6,2,5; 5,8,6; 9,3,8;6,9,2];
row=data(:,1);
col=data(:,2);
frame=data(:,3);
dist = pdist2(data,data);
N = size(data,1);
result = NaN(1,N);
result(1) = 1; % first point is first row in data matrix
for ii=2:N
dist(:,result(ii-1)) = Inf;
[~, closest_idx] = min(dist(result(ii-1),:));
result(ii) = closest_idx;
end
figure
%Ploting the points directly (without sorting)
subplot(2,1,1);
scatter3(row,col,frame,'r');
hold on;
line(row,col,frame);
%Ploting after sorting
subplot(2,1,2);
scatter3(row,col,frame,'r');
hold on
line(row(result),col(result),frame(result));