matlab - 如何在复杂的多段线旁边创建随机点?

标签 matlab

我想在二维图上填充随机点,使这些点落在“C”形多段线附近。

我设法用一个相当简单的方形“C”完成了这个:

scatter and polyline

我是这样做的:

% Marker color
c = 'k';    % Black

% Red "C" polyline
xl = [8,2,2,8];
yl = [8,8,2,2];
plot(xl,yl,'r','LineWidth',2);
hold on;

% Axis settings
axis equal;
axis([0,10,0,10]);
set(gca,'xtick',[],'ytick',[]);

step = 0.05;    % Affects point quantity
coeff = 0.9;    % Affects point density

% Top Horizontal segment
x = 2:step:9.5;
y = 8 + coeff*randn(size(x));
scatter(x,y,'filled','MarkerFaceColor',c);

% Vertical segment
y = 1.5:step:8.5;
x = 2 + coeff*randn(size(y));
scatter(x,y,'filled','MarkerFaceColor',c);

% Bottom Horizontal segment
x = 2:step:9.5;
y = 2 + coeff*randn(size(x));
scatter(x,y,'filled','MarkerFaceColor',c);

hold off;

正如您在代码中看到的,对于折线的每一段,我使用 randn 人工生成了散点坐标。

对于前面的示例,将多段线分割成线段并手动生成点就可以了。但是,如果我想尝试像这样更复杂的“C”形状怎么办:

polyline

请注意,使用我当前的方法,当折线的几何复杂性增加时,编码工作量也会增加。

在进一步讨论之前,是否有更好的方法来解决这个问题?

最佳答案

一种更简单的方法,可以推广到任何多段线,是在线段上运行一个循环。对于每个段,r 是它的长度,m 是要沿着该段放置的点数(它与规定的步长非常接近,略有偏差情况下步长不均匀划分长度)。请注意,x 和 y 都受到随机扰动。

for n = 1:numel(xl)-1 
    r = norm([xl(n)-xl(n+1), yl(n)-yl(n+1)]);
    m = round(r/step) + 1;
    x = linspace(xl(n), xl(n+1), m) + coeff*randn(1,m);
    y = linspace(yl(n), yl(n+1), m) + coeff*randn(1,m);
    scatter(x,y,'filled','MarkerFaceColor',c);
end

输出:

output

一个更复杂的例子,使用 coeff = 0.4;xl = [8,4,2,2,6,8]; yl = [8,6,8,2,4,2];

example

如果您认为此点云在端点附近太薄,您可以在运行循环之前人为地延长第一段和最后一段。但我不认为有必要:模糊曲线在末端变细是有道理的。

关于matlab - 如何在复杂的多段线旁边创建随机点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35589029/

相关文章:

c++ - 使用带有 MEX Wrapper 的辅助 C 文件从 MATLAB 2016 调用 C++ 代码时遇到问题

matlab - 在 matlab 中有效实现张量点积

MatLab-->csv : Export data to csv file using dlmwrite in Matlab

c++ - MATLAB中如何调用命令程序

matlab - 加快样条曲线的着色段?

matlab - 将索引向量转换为矩阵

matlab - 如何在Matlab中找到最小10%的数据?

c# - 使用 COM 对象从 C# 调用 Matlab

MATLAB 强制 num2str 格式化

matlab - 从函数句柄获取文档