【问题标题】:Select a random point on a line of a polygon在多边形的线上选择一个随机点
【发布时间】:2011-08-04 07:07:17
【问题描述】:

我正在使用 Java Polygon 对象,它存储了一个点数组,这些点定义了构成形状的线条。

我将如何在其中一条线上选择一个随机点? Polygon 类中是否有任何方法可以使这更容易?

为了澄清,我想从多边形边缘的任何位置选择一个随机点,不一定从定义的顶点集中。

【问题讨论】:

    标签: java geometry awt polygon computational-geometry


    【解决方案1】:

    你要做的第一件事是找到多边形的周长。

    现在找到一个范围为 0 到边界的随机数。

    然后,遍历多边形的段,从你的值中减去段的长度,直到下一个段的长度比你的当前值长。

    假设您正在沿着等于您剩余价值的路段“走那段距离”,您将在周边有一个随机点。

    =================================

    另一个可行的选择是根据长度选择一个随机段(您可以缓存每个多边形的阈值),然后在随机选择的段上选择一个随机点。对于大型多边形(缓存阈值后为 1)会更快,但会经过两倍的随机数。

    【讨论】:

    • +1 - 这些方法在周边提供均匀分布的随机点。
    【解决方案2】:

    使用点斜率形式为从连接顶点的n 边之一中随机选择的边创建y = mx + b 方程。顶点在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))

    【讨论】:

    • 另外,请注意如果r = 5,我们的数组索引为 6 超出范围会发生什么。对于r = 5,我们不使用r+1 来获取下一个顶点,而是使用0
    【解决方案3】:

    如果数组中有 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]);
    

    【讨论】:

    • 他想要其中一条线上的随机点......而不是随机顶点
    • 对不起,我应该在问题中说得更清楚。我想从多边形边缘的任何位置选择一个随机点,不一定从定义的顶点集中。
    • @Matt - 问题很清楚,正如最初写的那样,IMO。
    猜你喜欢
    • 2016-01-15
    • 1970-01-01
    • 2023-04-01
    • 2022-06-22
    • 1970-01-01
    • 2022-12-05
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多