在多边形的一条直线上选择一个随机点

3
我正在使用Java多边形对象,它存储定义形状的线段点数组。我该如何在这些线段上选择一个随机点?Polygon类中是否有任何方法可以更轻松地完成此操作?需要澄清的是,我想从多边形边缘的任意位置选择一个随机点,不一定是定义顶点集合中的点。
3个回答

6
首先,你需要找到多边形的周长。
接着,在 0 到周长之间随机选一个数。
然后,遍历多边形的线段,并从你的值中减去该线段的长度,直到下一条线段的长度大于你当前的值为止。
假设你“沿着这段距离”走了你剩余的值的距离,那么你就在周长上得到了一个随机点。
另一个可行的选择是根据线段长度选择随机线段(你可以缓存每个多边形的阈值),然后在随机选择的线段上选择随机点。对于大型多边形来说速度更快(缓存阈值后的顺序为 1),但会使用两倍的随机数。

2
+1 - 这些方法可以在周长上给出均匀分布的随机点。 - Stephen C

2
使用点斜式创建一个 y = mx + b 方程,用于连接顶点的 n 条边中随机选择的一条边。顶点在 Polygon.xpointsPolygon.ypoints 中定义。
考虑以下内容: 假设我们有一个五边形。我们有 5 条边和 5 个顶点。由于顶点存储在 Polygon 中,而我们想要一条边,因此我们需要两个顶点来形成一条线,所以我们随机选择介于 05 之间的数。假设我们随机生成的数字为 r=0
假设 xpoints[r]=1ypoints[r]=1xpoints[r+1]=2ypoints[r+1]=4
对于 m,我们有:
m = (4-1)/(2-1) = 3

对于点斜式,我们有:
(y - 1) = m(x - 1)
(y - 1) = 3(x - 1) --> y = 3x - 2

现在,在这条边的两个x坐标之间选择一个随机的x值,即在区间[0,2]内选择,然后你就得到了随机点(x, y(x))。请保留HTML标签。

另外,注意当r = 5时会发生什么,我们有一个数组索引为6,超出了边界。对于r = 5,我们不是使用r + 1来获取下一个顶点,而是使用0 - Travis Webb

-1
如果数组中有n个点,请使用Java的Random类。
java.util.Random r = new java.util.Random();
int num = r.nextInt(n); // n is the highest random number generated, also the size of the array
fuctionThatUsesPoint(myPolygon.xpoints[num], myPolygon.ypoints[num]);

1
他想要在其中一条直线上随机选取一个点,而不是随机选择一个顶点。 - Stephen C
抱歉,在问题中我应该表述得更清楚。我想从多边形的任何边缘位置随机选择一个点,不一定是从定义的顶点集合中选择。 - Matt
@Matt - 在我看来,问题最初的写法已经足够清晰了。 - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接