【问题标题】:Positioning random points on a 2D plane在 2D 平面上定位随机点
【发布时间】:2015-03-06 20:28:49
【问题描述】:

这里有一些几何图形供您参考。我已经坚持了一段时间了:

我需要编写一个生成随机点的脚本(在 C# 中,但您可以随意使用任何脚本来回答)。 A 点必须有值 x 和 y。

我必须总共生成 N 个点(其中 N > 1 并且也随机达到 100)。

点 1 必须是 x = 0,y = 0。点 2 必须与点 1 的距离为 1。因此 Root(x2 + y2) = 1。 点 3 必须与点 2 的距离为 1,依此类推。

现在这里是棘手的部分 - 点 N 必须与点 1 的距离为 1。因此,如果您要将所有点连接成一个形状,您将得到一个封闭的形状,每个顶点的长度相同。

(顶点可能会交叉,甚至可能在完全相同的位置有两个点。只要它是随机的)。

知道你会怎么做吗?

【问题讨论】:

    标签: geometry


    【解决方案1】:

    我会通过模拟链来做到这一点,有 2 种基本方法,一种是从正多边形开始,然后稍微随机化一个点(旋转一点),然后迭代其余部分以维护段 size=1

    第二个是从完整的随机开放链开始(如 MBo 答案),然后迭代地改变角度,直到最后一个点与第一个点的距离达到所需距离。我认为第二种方法编码更简单...

    如果你想要更复杂的东西,那么你可以生成M 随机点并将它们作为封闭的贝塞尔曲线曲线三次补丁循环控制点来处理。然后在上面找到N 等距点(这是一项艰巨的任务)并重新调整整个东西以匹配线段大小 = 1

    如果你想尝试第一种方法,那么

    1. 正多边形起点(闭环)

      从正多边形开始(圆上的等距点)。所以将圆圈划分为N 角段。选择半径r,使线长匹配l=1

      所以r=0.5/cos(pi/N) ...从半角三角形

    2. 制作函数将i-th点旋转一小步

      所以只需围绕(i-1)th 点旋转i-th 点,半径为1,然后反复更改{i+1,...N} 点以匹配段大小

    3. 您可以利用对称性来避免项目符号 #2

      但是对于小的N,这不会导致非常随机的结果。只需反向旋转随机点p(i) 的 2 个接触段并循环多次。

      为了使其更加随机,您可以在整个部分(2 个随机点之间)而不是仅在 2 行上应用对称

    第二种方法是这样的:

    1. 创建随机开放链(如 MBo 的回答)

      所以所有段都已经带有size=1.0。还要记住角度而不仅仅是位置

    2. i-th 点迭代

      为简单起见,将这些点称为p1,p2,...pn

      1. 计算d0=||pn-p1|-1.0|
      2. 将点 pi 向左旋转一些小的 da 角度步长
      3. 计算dl=||pn-p1|-1.0|
      4. 将点pi向右旋转2.0*da
      5. 计算dr=||pn-p1|-1.0|
      6. 将点pi 旋转到原来的位置...向左da

      现在选择更接近解决方案的方向(最小dl,dr,d0)所以:

      • 如果d0 最小,则根本不要更改此点并停止
      • 如果dl 最小,则在dl 下降时向左旋转da
      • 如果dr 最小,则在dr 下降时向右旋转da
    3. 解决方案

      循环子弹 #2d=||pn-p0|-1.0| 正在降低,然后将da 更改为da*=0.1 并再次循环。如果da 步太小或循环迭代后d 没有变化,则停止。

    [注释]

    展位解决方案并不精确,您的距离将非常接近 1.0,但可能会出现 +/- 一些误差,具体取决于最后的 da 步长。如果您旋转点pi,那么只需向所有pi,pi+1,pi+2,..pn 点添加/子角度

    【讨论】:

      【解决方案2】:

      编辑:这不是答案,没有考虑亲密关系。

      已知Cos(Fi)^2 + Sin(Fi)^2 = 1对于任意角度Fi

      所以你可以使用下一个方法:

      P[0].X = 0
      P[0].Y = 0
      for i = 1 .. N - 1:
        RandomAngle = 2 * Pi * Random(0..1)
        P[i].X = P[i-1].X + Cos(RandomAngle)
        P[i].Y = P[i-1].Y + Sin(RandomAngle)
      

      【讨论】:

      • 他还需要最后一个点与第一个点的距离为 1(即闭链循环)
      猜你喜欢
      • 1970-01-01
      • 2015-12-18
      • 2020-05-14
      • 2021-11-13
      • 2016-02-28
      • 1970-01-01
      • 2011-02-02
      • 2019-07-23
      • 1970-01-01
      相关资源
      最近更新 更多