用一条线连接节点(矩阵rx3的坐标)

3次浏览(过去30天)
我正在修改这个问题,因为它完全被误解了。
我想把坐标连接起来 data.txt (代表黑色 在图中)用一条线(红色)按如下方式:
我尝试了这段代码,但它没有给出预期的结果。
数据= readmatrix(“data.txt”);
数字
情节(数据(:1),数据(:,2),“k *’“Markersize”15)
持有
情节(数据(:1),数据(:,2),“- r”“线宽”, 1)
持有
网格
包含(“x”
ylabel (“y”
1评论
阿尔贝托·阿克利
阿尔贝托·阿克利 2022年12月24日
我曾经想过这样的事情,但目前它并没有带来预期的结果:
数据= readmatrix(“data.txt”);
Count_rows =高度(数据);
I = 1:2:count_rows
Odd_row = data(i,:);
J = 2:2:count_rows
Row_even = data(j,:);
线(odd_row row_even)
结束
结束

登录评论。

接受的答案

沃斯
沃斯 2022年12月24日
数据= readmatrix(“data.txt”);
N = size(data,1);
% d:每一点到另一点的距离(平方)
%(点到自身的距离设置为Inf,
%,这样它就不会是最小值)
X = data(:,1);
Y = data(:,2);
D = (x-x.').²+(y-y.').²;
d(1:N+1:结束)= Inf;
% used_idx:目前使用的点数索引
% unused_idx:目前未使用的点的索引
%从点1开始
Used_idx = 1;
unused_idx = 2:N;
只要有一些积分还没有使用
~ isempty (unused_idx)
找到离上次使用的点最近的未使用点
[~,idx] = min(d(used_idx(end),unused_idx),[],2);
将该索引添加到used_idx向量
Used_idx (end+1) = unused_idx(idx);
%并将其从unused_idx向量中移除
Unused_idx (idx) = [];
结束
%的阴谋
情节(x, y,‘* k”
持有
%包含开头和结尾的第一个点([1:end 1]),
%以关闭循环
情节(x (used_idx([1] 1:结束)),y (used_idx([1] 1:结束)),...
“线宽”3)
2的评论
沃斯
沃斯 2022年12月26日
编辑:沃斯 2022年12月26日
这是因为你在x_sx和x_dx中输入了nan试图将数据集划分为两条独立的曲线。基本上,在每条曲线的最后一点和第一点之间,另一条曲线存在但它的x坐标都是NaN,所以你看不到它,但你也没有得到最后一点和第一点之间的连接线。
你可以修改代码来处理nan,但对我来说更有意义的是,与其使用nan,不如完全分离两条曲线:
数据= readmatrix(“te_300.txt”);
X = data(:,1);
Y = data(:,2);
阈值= 255;
Idx = x >阈值;
X_sx = x(idx);
Y_sx = y(idx);
Coord_left = [x_sx, y_sx];
X_dx = x(~idx);
Y_dx = y(~idx);
Coord_right = [x_dx, y_dx];
然后,当然,d_sx和d_dx的计算必须分别使用y_sx和y_dx,而不是y:
%……
D_sx = (x_sx - x_sx.')。^2 + (y_sx - y_sx.').^2;
%……
D_dx = (x_dx-x_dx.').^2+(y_dx-y_dx.').^2;
%……
其余部分保持不变。

登录评论。

更多答案(3)

卡里姆
卡里姆 2022年12月24日
编辑:卡里姆 2022年12月24日
请注意,由于曲线的形状,使用角度的典型排序技巧将不起作用。因此,下面的方法使用循环遍历点,寻找最近的邻居,直到找到顺序。
下面将使用数据点演示该原则。希望能有所帮助。
数据= readmatrix(“data.txt”);
确定每个点的最近点的顺序
Idx = knnsearch(数据,数据,“K”、大小(数据,1));
%创建一个向量来存储点的顺序
Order = 0 (size(data,1),1);
我们使用点1作为起点
Order (1) = 1;
%循环其他点
I = 2:size(data,1)
%提取最接近当前点的点的索引
这些是按距离排列的
currPoints = idx(order(i-1),:);
继续寻找我们到目前为止没有使用过的最近的点。
J = 2:size(data,1)
如果all(order(1:(i-1)) ~= currPoints(j))
%我们找到了下一个点,存储在顺序和停止
%内循环
order(i) = currPoints(j);
打破
结束
结束
结束
%使用顺序对点排序
数据=数据(order,:);
%得出一个数字
数字
情节(数据(:1),数据(:,2),“线宽”, 1.5)
网格
标题(“排序点”

图像分析
图像分析 2022年12月23日
编辑:图像分析 2022年12月23日
不知道如何定义厚度但如果它是距离最远的两点之间的距离,你可以用 pdist2 bwferet
数据= readmatrix(“data.txt”);
%图1
数字
情节(数据(:1),数据(:,2),“k *’“Markersize”5)
持有
情节(数据(:1),数据(:,2),“- r”“线宽”, 1)
持有
网格
包含(“x”
ylabel (“y”
%图2
X = data(:,1);
Y = data(:,2);
S = 1;
K = boundary(x,y,s);
数字
情节(x, y,“k *’, x(k) y(k)“- r”
网格
包含(“x”
ylabel (“y”
获取边界点。
Xb = x(k);
Yb = y(k);
Rows = max(y)
列= max(x)
掩码= poly2mask(xb, yb,行,列);
数字
imshow(面具)
轴(“上”“xy”
feretInfo = bwferet(掩码)
使用pdist2找出彼此之间最远的点。
距离= pdist2([xb, yb], [xb, yb]);
maxDistance = max(距离(:))
feretInfo =
1×3表
MaxDiameter MaxAngle MaxCoordinates
________________ ________________ ______________
113.600176056202 170.371843871513 {2×2 double}
maxDistance =
113.282831885507
5个评论

登录评论。


本杰明·克劳斯
本杰明·克劳斯 2022年12月23日
您可以指定 线宽 当你打电话给 情节 命令。
数据= readmatrix(“data.txt”);
X = data(:,1);
Y = data(:,2);
S = 1;
K = boundary(x,y,s);
情节(x, y,“k *’, x(k) y(k)“- r”“线宽”3)此处指定线宽
网格
包含(“x”
ylabel (“y”
2的评论
阿尔贝托·阿克利
阿尔贝托·阿克利 2022年12月24日
阅读我编辑的问题。我希望它比上一个更清楚。

登录评论。

类别

了解更多仪器连接与通信帮助中心而且文件交换

2022世界杯八强谁会赢?


释放

R2021b

世界杯预选赛小组名单社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!世界杯预选赛小组名单

开始狩猎!

Baidu
map