Java内部三角形内的随机点

时间:2013-10-29 09:28:00

标签: java random geometry

我正试图在Java中获得三角形中的随机点。

我有三个点,x,y坐标并试图使用这个公式。

P = (1 - sqrt(r1)) * A + (sqrt(r1) * (1 - r2)) * B + (sqrt(r1) * r2) * C

其中r1和r2是从0到1的随机双精度。  但是,如何定义A,B,C?因为现在A有x和y坐标。

4 个答案:

答案 0 :(得分:10)

P(x) = (1 - sqrt(r1)) * A(x) + (sqrt(r1) * (1 - r2)) * B(x) + (sqrt(r1) * r2) * C(x)
P(y) = (1 - sqrt(r1)) * A(y) + (sqrt(r1) * (1 - r2)) * B(y) + (sqrt(r1) * r2) * C(y)

可以在math.stackexchangethis papaer

找到更多信息

答案 1 :(得分:0)

这是实现这一目标的另一种方法,也在Graphics Gems(Turk)中引入。

if (r1 + r2 > 1) {
    r1 = 1 - r1;
    r2 = 1 - r2;
}

a = 1 - r1 - r2;
b = r1; 
c = r2;

Q = a*A + b*B + c*C

此方法无法扩展到更高维度的空间。如果是这种情况,您需要使用基本上是重心坐标的公式。

答案 2 :(得分:0)

我宁愿不使用这个涉及平方根的公式,因此浮点误差+计算时间。以下方法仅使用乘法和加法,这使得它更有效,并且更加浮动友好。它也很容易实现/理解:

在ABC中随机统一生成一个点: 我们的想法是在平行四边形ABCD中生成一个点,并将获得的点投影到ABC中。

enter image description here

  • 在平行四边形ABCD中选取一个点p(D是矢量AB + AC的A的平移)

  • 两个案例:

    1)p在ABC内,保持

    2)p在ABC之外,选择p',根据[BC]中间的对称性

其他细节

  • 检查点是否在三角形内:How to determine if a point is in a 2D triangle? (事实上​​你只需要检查bc的哪一面)

  • 平行四边形ABCD中的随机点p: 让V1(相应的V2)从A到B(resp A到C)的向量。 点p由A乘以(r1 * V1 + r2 * V2)给出,其中r1和r2是0和1之间的两个随机双。

  • 均匀性:平行四边形中的选择点明显均匀选择。此外,ABC中的每一点都可以从ABCD的两个点“获得”。

答案 3 :(得分:0)

由于问题是针对Java代码而不是伪代码或数学符号,因此这是Vaibhav在Java中的解决方案:

public class Point{
    public double x;
    public double y;

    public Point(double x, double y){
        this.x = x;
        this.y = y;
    }
}

public class Triangle {
    Point A;
    Point B;
    Point C;

    public Point getRandomPoint(){
        double r1 = Math.random();
        double r2 = Math.random();

        double sqrtR1 = Math.sqrt(r1);

        double x = (1 - sqrtR1) * A.x + (sqrtR1 * (1 - r2)) * B.x + (sqrtR1 * r2) * C.x;
        double y = (1 - sqrtR1) * A.y + (sqrtR1 * (1 - r2)) * B.y + (sqrtR1 * r2) * C.y;

        return new Point(x, y);
    }
}

进一步优化是可能的,代码变得不那么可读。