排序成对最短距离

ron*_*oni 2 matlab shortest

这是我的问题.

clc; clear all; close all;  
N = 10;
R = randn(N,1)+10;R(end) = R(1);
tht = linspace(0,2*pi,N).';
x = R.*cos(tht);
y = R.*sin(tht);
plot(x, y,'o-b');
Run Code Online (Sandbox Code Playgroud)

随机排序数组

X = x(randperm(size(x,1)),:);
Y = y(randperm(size(y,1)),:);
hold on, plot(X,Y,'o-r');
Run Code Online (Sandbox Code Playgroud)

可以看出,绘制的轮廓具有重叠区域.所以我想绘制一个不重叠的闭合轮廓.我得到的一个想法是通过对矩阵的元素进行排序,使得矩阵元素之间的相邻距离最小.所以最近的点将彼此相邻.

任何人都可以指定我怎么做吗?我尝试使用pdist2但失败了.

Rod*_*uis 6

如果我理解正确,您需要重新排序某些顶点,以便后续点之间绘制的所有线条形成一个封闭的,不重叠的轮廓.

这可以通过围绕所有点的质心以(逆)顺时针方式重新排序顶点来实现.在2D中,这可以通过对以下输出进行排序来实现atan2:

%// Compute centre of mass
r_COM = sum([X, Y]) / numel(X);

%// Sort all vertices by angle
[~, I] = sort(atan2(Y - r_COM(2), X - r_COM(1)));

%// Plot the new contour
hold on, plot(X([I; I(1)]),Y([I; I(1)]), '.-k', 'linewidth', 2);
Run Code Online (Sandbox Code Playgroud)

结果:

结果

  • @roni:......两次问同样的问题不会让我理解的机会增加一倍:) (2认同)