我想在二维图上填充随机点,使这些点落在“C”形多段线附近。
我设法用一个相当简单的方形“C”完成了这个:
我是这样做的:
% 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”形状怎么办:
请注意,使用我当前的方法,当折线的几何复杂性增加时,编码工作量也会增加。
在进一步讨论之前,是否有更好的方法来解决这个问题?
最佳答案
一种更简单的方法,可以推广到任何多段线,是在线段上运行一个循环。对于每个段,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
输出:
一个更复杂的例子,使用 coeff = 0.4;
和 xl = [8,4,2,2,6,8];
yl = [8,6,8,2,4,2];
如果您认为此点云在端点附近太薄,您可以在运行循环之前人为地延长第一段和最后一段。但我不认为有必要:模糊曲线在末端变细是有道理的。
关于matlab - 如何在复杂的多段线旁边创建随机点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35589029/