MATLAB,生成并绘制一个三角形内分布的点云(Matlab, generate and plot

2019-07-17 12:53发布

我试图产生2D点(均匀地)一个三角形内分布云。 到目前为止,我已经取得了以下:

我使用的代码是这样的:

N = 1000;
X = -10:0.1:10;
for i=1:N
    j = ceil(rand() * length(X));
    x_i = X(j);
    y_i = (10 - abs(x_i)) * rand;

    E(:, i) = [x_i y_i];
end

然而,这些点并非均匀分布,可以清楚地看到在左边和右边的角落。 我怎样才能改善这种结果呢? 我一直在试图寻找不同的形状也没有运气。

Answer 1:

你应该先问自己什么会均匀分布的一个三角形内做出点。

为了使长话短说,鉴于三角的三个顶点,你需要变换2个均匀分布的随机值,就像这样:

N = 1000;                    % # Number of points
V = [-10, 0; 0, 10; 10, 0];  % # Triangle vertices, pairs of (x, y)
t = sqrt(rand(N, 1));
s = rand(N, 1);
P = (1 - t) * V(1, :) + bsxfun(@times, ((1 - s) * V(2, :) + s * V(3, :)), t);

这将产生一组被指定的三角形的内部均匀分布的点:

scatter(P(:, 1), P(:, 2), '.')

请注意,此解决方案不涉及重复的随机数的条件操作,所以它不能可能陷入死循环。

对于进一步的阅读,看看这篇文章 。



Answer 2:

点的那浓度将从您正在构建点的方式可以预期的。 你点沿X轴均匀分布。 在三角形的极值有大约存在于三角形的中心点相同量的,但它们沿小得多的区域分布。

第一,最好的办法我能想到的: 蛮力 。 平均分配点周围一个更大的区域,然后删除那些你感兴趣的区域外的人。

N = 1000;
points = zeros(N,2);
n = 0;
while (n < N)
    n = n + 1;
    x_i = 20*rand-10; % generate a number between -10 and 10
    y_i = 10*rand; % generate a number between 0 and 10
    if (y_i > 10 - abs(x_i)) % if the points are outside the triangle
       n = n - 1; % decrease the counter to try to generate one more point
    else % if the point is inside the triangle
       points(n,:) = [x_i y_i]; % add it to a list of points
    end
end

% plot the points generated
plot(points(:,1), points(:,2), '.');
title ('1000 points randomly distributed inside a triangle');

我已经发布的代码的结果:

一个重要的免责声明 :随机分布并不意味着“均匀”分布! 如果从均匀分布生成随机数据,这并不意味着,这将是“均匀分布”沿三角形。 你会看到,事实上,分一些集群。



Answer 3:

你可以想像,三角形垂直分成两半,并用它使一个矩形的其他使一起移动的一半。 现在你在矩形,这是很容易均匀采样,然后将半三角回。

而且,它更容易与单元长度的工作(矩形变成正方形),然后拉伸的三角形期望的尺寸。

x = [-10 10]; % //triangle base
y = [0 10]; % //triangle height
N = 1000; %// number of points

points = rand(N,2); %// sample uniformly in unit square
ind = points(:,2)>points(:,1); %// points to be unfolded 
points(ind,:) = [2-points(ind,2) points(ind,1)]; %// unfold them
points(:,1) = x(1) + (x(2)-x(1))/2*points(:,1); %// stretch x as needed
points(:,2) = y(1) + (y(2)-y(1))*points(:,2); %// stretch y as needed
plot(points(:,1),points(:,2),'.')



Answer 4:

我们可以概括这种情况。 如果要采样从一些(N - 1)分维单纯在欧几里德空间匀速(不一定是三角形 - 它可以是任何凸多面体),从对称n维狄利克雷分布只是品尝矢量与参数1 - 这些是凸的(或重心)相对于所述多面体的顶点坐标。



文章来源: Matlab, generate and plot a point cloud distributed within a triangle