ぎるばーとの日記

もっともっと遠くへ行きたい 空が広く見える場所まで

三角形内の一様乱数

 頂点ABCの三角形内で一様な乱数はどうすればいいでしょうか?

A new method to simulate the triangular distribution
 前回と同じ文献。「Random vectors in the plane」の部分で触れられてます。この論文より先に知られていた方法らしく。

u \sim \text{Uniform}(0,1),\ v \sim \text{Uniform}(0,1);
\text{MIN} = \text{MIN}(u,v),\ \text{MAX} = \text{MAX}(u,v)として、
\vec{a} \text{MIN}+ \vec{b} (1 - \text{MAX}) + \vec{c} (\text{MAX} - \text{MIN})

 なぜこれでOKなのかよく分かりませんが、2次元の場合でプロットしてみると確かに三角形になる……。ふむ。

Point2D randomPoint(double x1, double y1, double x2, double y2, double x3, double y3) {
    double u = Math.random(), v = Math.random();
    
    double m1 = Math.min(u, v);
    double m2 = 1.0 - Math.max(u, v);
    double m3 = Math.max(u, v) - Math.min(u, v);
    double x = m1 * x1 + m2 * x2 + m3 * x3;
    double y = m1 * y1 + m2 * y2 + m3 * y3;
    return new Point2D.Double(x, y);
}