Matlab 中二维连续连接点

问题描述 投票:0回答:2

我想知道你是否可以告诉我如何将几个点精确地一个接一个地连接在一起。

假设:

data =
          x        y
      ------------------
      591.2990  532.5188
      597.8405  558.6672
      600.0210  542.3244
      606.5624  566.2938
      612.0136  546.6825
      616.3746  570.6519
      617.4648  580.4575
      619.6453  600.0688
      629.4575  557.5777
      630.5477  584.8156
      630.5477  618.5906
      639.2696  604.4269
      643.6306  638.2019
      646.9013  620.7697
      652.3525  601.1584

“数据”是点的坐标。

现在,我想将第一个点(第一个数组)连接(绘制)到第二个点,第二个点连接到第三点,依此类推。

请注意,

plot(data(:,1),data(:,2))
会给我相同的结果。但是,我正在寻找一个连接(绘制)每个循环的每对点的循环。

例如:

data1=data;
figure
scatter(X,Y,'.')
hold on
for i=1:size(data,1)
[Liaa,Locbb] = ismember(data(i,:),data1,'rows');
data1(Locbb,:)=[];

[n,d] = knnsearch(data1,data(i,:),'k',1);
x=[data(i,1) data1(n,1)];
y=[data(i,2) data1(n,2)];
plot(x,y);
end
hold off

虽然建议的循环看起来不错,但我想要一种图,其中每个点连接到最多 2 个其他点(正如我所说的

plot(x,y)

任何帮助将不胜感激!

matlab plot point sequential
2个回答
1
投票

感谢大家的帮助,终于找到解决方案了:

n=1;
pt1=[data(n,1), data(n,2)];
figure
scatter(data(:,1),data(:,2))
hold on
for i=1:size(data,1)
    if isempty(pt1)~=1
        [Liaa,Locbb] = ismember(pt1(:)',data,'rows');
             if Locbb~=0
                data(Locbb,:)=[];
                [n,d] = knnsearch(data,pt1(:)','k',1);
                x=[pt1(1,1) data(n,1)];
                y=[pt1(1,2) data(n,2)];
                pt1=[data(n,1), data(n,2)];
                plot(x,y);
             end
    end
end
hold off

enter image description here

顺便说一句,可以删除最后最长的一行,因为它与问题无关,如果有人需要它,请告诉我。


0
投票

您根本不需要使用循环。您可以使用

interp1
。将
x
y
数据点指定为 控制点。之后,您可以指定从第一个
x
值到最后一个
x
值的更精细的点集。您可以指定
linear
样条线,因为如果您想要的行为与
plot
相同,这就是您想要完成的任务。假设
data
是一个 2D 矩阵,如上面所示,不用多说:

%// Get the minimum and maximum x-values
xMin = min(data(:,1));
xMax = max(data(:,1));
N = 3000; % // Specify total number of points

%// Create an array of N points that linearly span from xMin to xMax
%// Make N larger for finer resolution
xPoints = linspace(xMin, xMax, N);

%//Use the data matrix as control points, then xPoints are the values
%//along the x-axis that will help us draw our lines.  yPoints will be
%//the output on the y-axis
yPoints = interp1(data(:,1), data(:,2), xPoints, 'linear');

%// Plot the control points as well as the interpolated points
plot(data(:,1), data(:,2), 'rx', 'MarkerSize', 12);
hold on;
plot(xPoints, yPoints, 'b.');

警告: 您有两个

x
值映射到
630.5477
,但会产生不同的
y
值。如果您使用
interp1
,这会给您一个错误,这就是为什么我必须稍微扰动其中一个值才能使其正常工作。当您开始使用自己的数据时,希望情况不会出现这种情况。这是我得到的情节:

enter image description here

你会发现我所说的这两点之间存在巨大差距。这是

interp1
的唯一限制,因为它假设
x
值严格单调递增。因此,您的
x
值集中不能有相同的两个点。

© www.soinside.com 2019 - 2024. All rights reserved.