Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我在MATLAB中有一系列XY点对。这些对描述图像中形状周围的点。它们不是函数,意味着每个x值可能存在两个或更多y点。
我可以使用类似的方法分别绘制这些点 plot(B(:,1),B(:,2),'b+'); 我还可以使用plot连接点: plot(B(:,1),B(:,2),'r'); 我要检索的是我自己的点值,可以用来连接点,以便将其用于进一步分析。我不需要完全连接的图,我需要基于数据的东西,而不仅仅是plot()生成的图形。我很想让plot()生成这些点(似乎在后台执行),但是我尝试使用plot()返回的linseries,但是它要么无法正常工作,要么没有给我我想要的东西。 我认为这是一个插值问题,但是这些点不包含函数。他们描述一个形状。本质上,我所需要做的只是plot()似乎要计算的点;连接一系列点的直线。弯曲将是一个好处,并且可以避免我在下游遭受悲伤。 如何在MATLAB中执行此操作? 谢谢! 编辑:是的,图片会有所帮助:) 蓝点是使用上面的第一个plot()调用绘制的实际点值(x,y)。红色轮廓是使用上述第二种方法调用plot()的结果。我正在尝试获取红色轮廓的点数据;换句话说,连接蓝色点的点。 ![]() 回答: 阿德里安绝对有一个正确的想法 :定义一个参数坐标,然后分别对x和y坐标执行线性插值。 我想添加的一件事是定义参数坐标的另一种方法,这样您可以在一次通过中围绕整个形状创建均匀间隔的插值点。您想要做的第一件事(如果还没有的话)是通过复制第一个点并将其添加到末尾来确保最后一个坐标点重新连接到第一个坐标点: B = [B; B(1,:)]; 接下来,通过计算后续点之间的总距离,然后取累加和,您可以获得一个参数坐标,该坐标使靠近点的步长变小,而远离点的步长变大: distance = sqrt(sum(diff(B,1,1).^2,2)); %# Distance between subsequent points s = [0; cumsum(distance)]; %# Parametric coordinate 现在,您可以使用INTERP1Q函数插入一组新点,这些点沿着连接点的直线沿边缘均匀分布: sNew = linspace(0,s(end),100).'; %'# 100 evenly spaced points from 0 to s(end) xNew = interp1q(s,B(:,1),sNew); %# Interpolate new x values yNew = interp1q(s,B(:,2),sNew); %# Interpolate new y values 这些新的点集不一定包括原始点,因此,如果要确保原始点也出现在新的点集中,可以执行以下操作: [sAll,sortIndex] = sort([s; sNew]); %# Sort all the parametric coordinates xAll = [B(:,1); xNew]; %# Collect the x coordinates xAll = xAll(sortIndex); %# Sort the x coordinates yAll = [B(:,2); yNew]; %# Collect the y coordinate yAll = yAll(sortIndex); %# Sort the y coordinates 例: 这是显示上述代码如何执行的示例(我使用11对x和y坐标,为完整示例而重复其中之一): B = [0.1371 0.1301; ... %# Sample data 0.0541 0.5687; ... 0.0541 0.5687; ... %# Repeated point 0.0588 0.5863; ... 0.3652 0.8670; ... 0.3906 0.8640; ... 0.4090 0.8640; ... 0.8283 0.7939; ... 0.7661 0.3874; ... 0.4804 0.1418; ... 0.4551 0.1418]; %# Run the above code... plot(B(:,1),B(:,2),'b-*'); %# Plot the original points hold on; %# Add to the plot plot(xNew,yNew,'ro'); %# Plot xNew and yNew ![]() 更多&回答... |
![]() |
![]() |