6

三角形内に (均一に) 分布する 2D ポイントのクラウドを生成しようとしています。これまでのところ、次のことを達成しました。

Matlab プロット

私が使用したコードは次のとおりです。

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

ただし、左隅と右隅にはっきりと見られるように、点は均一に分布していません。どうすればその結果を改善できますか? 私もさまざまな形を探してみましたが、うまくいきませんでした。

4

4 に答える 4

9

最初に、三角形内の点を均一に分布させるにはどうすればよいかを自問する必要があります。

簡単に言うと、三角形の 3 つの頂点すべてが与えられた場合、次のように 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), '.')

ここに画像の説明を入力

この解決策は、乱数の条件付き操作を繰り返し行わないため、無限ループに陥る可能性がないことに注意してください。

さらに読むには、この記事をご覧ください。

于 2012-12-24T13:34:45.357 に答える
1

三角形が垂直に 2 つに分割されていると想像し、一方を動かしてもう一方と合わせて長方形を作ることができます。ここで、長方形で均一にサンプリングしますが、これは簡単です。次に、半三角形を元に戻します。

また、単位の長さ (長方形が正方形になる) で作業してから、三角形を目的の寸法に引き伸ばす方が簡単です。

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),'.')

ここに画像の説明を入力

于 2014-07-01T15:19:48.867 に答える
0

このケースを一般化できます。ユークリッド空間の (n - 1) 次元シンプレックスから点を UNIFORMLY (三角形である必要はありません - 凸多面体である必要はありません) からサンプリングする場合は、パラメーター 1 を使用して対称 n 次元ディリクレ分布からベクトルをサンプリングするだけです。これらは、ポリトープの頂点に対する凸 (または重心) 座標です。

于 2016-02-10T17:21:46.853 に答える