【发布时间】:2011-08-04 07:07:17
【问题描述】:
我正在使用 Java Polygon 对象,它存储了一个点数组,这些点定义了构成形状的线条。
我将如何在其中一条线上选择一个随机点? Polygon 类中是否有任何方法可以使这更容易?
为了澄清,我想从多边形边缘的任何位置选择一个随机点,不一定从定义的顶点集中。
【问题讨论】:
标签: java geometry awt polygon computational-geometry
我正在使用 Java Polygon 对象,它存储了一个点数组,这些点定义了构成形状的线条。
我将如何在其中一条线上选择一个随机点? Polygon 类中是否有任何方法可以使这更容易?
为了澄清,我想从多边形边缘的任何位置选择一个随机点,不一定从定义的顶点集中。
【问题讨论】:
标签: java geometry awt polygon computational-geometry
你要做的第一件事是找到多边形的周长。
现在找到一个范围为 0 到边界的随机数。
然后,遍历多边形的段,从你的值中减去段的长度,直到下一个段的长度比你的当前值长。
假设您正在沿着等于您剩余价值的路段“走那段距离”,您将在周边有一个随机点。
另一个可行的选择是根据长度选择一个随机段(您可以缓存每个多边形的阈值),然后在随机选择的段上选择一个随机点。对于大型多边形(缓存阈值后为 1)会更快,但会经过两倍的随机数。
【讨论】:
使用点斜率形式为从连接顶点的n 边之一中随机选择的边创建y = mx + b 方程。顶点在Polygon.xpoints 和Polygon.ypoints 中定义。
考虑以下几点:
假设我们有一个五边形。我们有 5 条边和 5 个顶点。由于我们有顶点存储在Polygon中并且想要一条边,我们需要两个顶点来形成一条线,所以我们在0和5之间随机选择。假设我们随机生成的数字r = 0。
假设xpoints[r] = 1、ypoints[r] = 1、xpoints[r+1] = 2 和ypoints[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))。
【讨论】:
r = 5,我们的数组索引为 6 超出范围会发生什么。对于r = 5,我们不使用r+1 来获取下一个顶点,而是使用0。
如果数组中有 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]);
【讨论】: