我正试图在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坐标。
答案 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)
找到更多信息
答案 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中。
在平行四边形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);
}
}
进一步优化是可能的,代码变得不那么可读。