将点分布在边界内的表面上

2024-01-28

我对一种在 4 面(如正方形)上分布预定义数量的点的方法(算法)感兴趣。

主要问题是每个点必须具有彼此之间的最小和最大接近度(两个预定义值之间的随机值)。基本上,任何两点的距离不应小于 2,也不应大于 3。

我的代码将用 ruby​​ 实现(点是位置,表面是地图),但任何想法或片段绝对受到欢迎,因为我的所有想法都包含相当多的蛮力。


Try 这张纸 http://diwww.epfl.ch/w3lsp/publications/colour/prhsfcabp_93.html。它有一个很好、直观的算法,可以满足您的需要。

在我们的建模中,我们采用了另一种模型:我们认为每个中心都通过排斥弦与其所有邻居相关。

在模拟开始时,中心是随机分布的,并且各中心的强度也是随机分布的 字符串。我们随机选择移动一个中心;然后我们计算所有引起的合力 给定中心的邻居,我们计算成比例且定向的位移 就合力而言。

经过一定次数的迭代(这取决于迭代次数) 中心和初始随机性程度)系统变得稳定。

如果从图中看不清楚,这种方法会生成均匀分布的点。您可以使用在边界内为零的力(例如,在 2 到 3 之间),否则使用非零力(如果点太近则为排斥力,如果太远则为吸引力)。

这是我的 Python 实现(抱歉,我不懂 ruby​​)。只需导入它并调用uniform()即可获取点列表。

import numpy as np
from numpy.linalg import norm
import pylab as pl

# find the nearest neighbors (brute force)
def neighbors(x, X, n=10):
  dX = X - x
  d = dX[:,0]**2 + dX[:,1]**2
  idx = np.argsort(d)
  return X[idx[1:11]]

# repulsion force, normalized to 1 when d == rmin
def repulsion(neib, x, d, rmin):
  if d == 0:
    return np.array([1,-1])

  return 2*(x - neib)*rmin/(d*(d + rmin))

def attraction(neib, x, d, rmax):
  return rmax*(neib - x)/(d**2)

def uniform(n=25, rmin=0.1, rmax=0.15):
  # Generate randomly distributed points
  X = np.random.random_sample( (n, 2) )

  # Constants
  # step is how much each point is allowed to move
  #   set to a lower value when you have more points
  step = 1./50.

  # maxk is the maximum number of iterations
  #   if step is too low, then maxk will need to increase
  maxk = 100

  k = 0

  # Force applied to the points
  F = np.zeros(X.shape)

  # Repeat for maxk iterations or until all forces are zero
  maxf = 1.
  while maxf > 0 and k < maxk:
    maxf = 0
    for i in xrange(n):
      # Force calculation for the i-th point
      x = X[i]
      f = np.zeros(x.shape)

      # Interact with at most 10 neighbors
      Neib = neighbors(x, X, 10)

      # dmin is the distance to the nearest neighbor
      dmin = norm(Neib[0] - x)

      for neib in Neib:
        d = norm(neib - x)
        if d < rmin:
          # feel repulsion from points that are too near
          f += repulsion(neib, x, d, rmin)
        elif dmin > rmax:
          # feel attraction if there are no neighbors closer than rmax
          f += attraction(neib, x, d, rmax)

      # save all forces and the maximum force to normalize later
      F[i] = f
      if norm(f) <> 0:
        maxf = max(maxf, norm(f))

    # update all positions using the forces
    if maxf > 0:
      X += (F/maxf)*step

    k += 1

  if k == maxk:
    print "warning: iteration limit reached"

  return X
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将点分布在边界内的表面上 的相关文章

随机推荐

  • 将 Typeahead.js 与 ASP.Net Webmethod 集成

    我正在寻找将 Typeahead js 与 Asp Net Webmethod 一起使用的示例 我有来自的例子http twitter github io typeahead js examples http twitter github
  • SQL Server 2012-数据库主数据库中的创建数据库权限被拒绝(错误 262)

    我想使用 SQL Server Management studio 在 SQL Server 2012 上创建一个新数据库 我以管理员身份运行 SQL Server Management studio 并使用 Windows 身份验证登录
  • 性能问题 - iOS 中的 plist 与 sqlite

    我需要跟踪一些变量并经常保存它们 我不需要复杂的搜索和排序 只需要简单的读 写 plist 和 sqlite 的读 写性能有什么区别 除了上述两种方法之外 我还应该使用 core data 吗 请给我一些提示 Thanks 在 SQlite
  • 无法加载 libhdfs

    尝试使用 pyarrow 访问 hdfs 文件但无法使其工作 下面是代码 非常感谢您 rxie cedgedev03 code python Python 2 7 12 Anaconda 4 2 0 64 bit default Jul 2
  • 电子如何允许不安全的https

    Loading https github com https github com例如 工作正常 但是加载不安全的https 页面显示为空 我做了一些研究并尝试了 3 个标志 webSecurity allowDisplayingInsec
  • 如何清除服务器端文件上传文本(c#)

    我想清除文件上传的文件路径 文件上传位于更新面板内 我正在使用AsyncFileUpload 如何清除文件并更改文件上传的背景颜色 btnAudUpload Click 方法 string filename FileUpload FileN
  • gcc优化说明

    出于黑客的好奇心 我想知道如何gcc能巧妙地优化下面的功能吗 int c int i j 0 for i 0 i lt 10 i j i return j objdump D c o下面是针对arm的 但x86在逻辑上没有什么不同 0000
  • 清除标准输入缓冲区?

    我正在编写一些代码并使用 fgets 来获取用户输入 然后我在代码上编写了一个循环 以不断要求用户输入 直到用户打印退出 但第二次询问时 它写了 2 次 请输入您的输入 而不是 1 次 并且第一次没有等待我的输入 所以 我用谷歌搜索它 发现
  • 如何使用原子操作切换一个文档中的布尔字段?

    有没有办法通过原子操作来切换 MongoDB 中一个文档的布尔字段 说 用Python cl update id toggle field 1 目前 我认为通过一次手术不可能做到这一点 按位运算符 http www mongodb org
  • Oracle 中的匿名 TABLE 或 VARRAY 类型

    在 Oracle 中 我有时想创建诸如此类的构造 SELECT FROM TABLE STRINGS a b c SELECT FROM TABLE NUMBERS 1 2 3 显然 我可以为上述声明我自己的类型 我可以选择TABLE an
  • MediatR 发布和 MediatR 发送

    我已经尝试使用 MediatR 的 CQRS 模式 并且喜欢正在处理的应用程序正在转换的干净状态 在我见过和使用的所有例子中 我总是这样做 await Mediator Send command 查询也是一样的 var data await
  • float32 和 float64 之间的真正区别

    我想了解之间的实际区别float16 and float32从结果精度来看 例如 NumPy 允许您选择所需数据类型的范围 np float16 np float32 np float64 我担心的是 如果我决定使用 float16 来保留
  • 删除默认构造函数令人头疼

    我的 C 书是这么说的 lippman c Primer 第五版 第 508 页 如果类 有一个 const 成员 其类型未显式定义默认构造函数 则合成的默认构造函数被定义为已删除and该成员没有类内初始值设定项 强调我的 那么为什么这段代
  • 使用套接字 io 向所有浏览器发送消息

    我正在摆弄socket io和node js 并且想知道如何完成以下任务 我有一个简单的表单 将文本字符串发送到服务器 服务器将其发回 并将其附加到div中 我想做的是为所有浏览器中的所有用户更新该 div 目前它只更新发送消息的浏览器 来
  • 拒绝应用来自...的样式,因为其 MIME 类型('text/html')不是受支持的样式表 MIME 类型,并且启用了严格的 MIME 检查

    此错误仅在 Chrome 中显示 我正在搜索这个问题 但还没有找到令人满意的解决方案 我附上了该错误的屏幕截图 请为此提出一些想法 错误图像 https i stack imgur com 6IAxV png 样式表的 MIME 类型应为t
  • 是否可以在 Wear OS 中永久可靠地运行网络 ping 服务?

    我正在尝试找到一种在 Wear OS 上以可靠的方式运行网络心跳服务的方法 目标是有一个进程每 x 分钟发送一次网络请求 无论设备的状态如何 屏幕开 关 充电 关闭充电器等 有可能实现吗 我的方法是运行前台服务 https develope
  • SSDT 创建回滚部署脚本?

    我们可以使用TFS SSDT创建SQLServer部署脚本 但是有没有办法创建回滚脚本 以便我们可以回滚部署 谢谢 由于 SSDT 和类似产品 都是通过将项目中的模式与实时数据库进行比较来使数据库与模型同步来工作的 因此没有直接的方法来创建
  • 可以使用 Window.Onscroll 方法来检测滚动方向吗?

    可以使用 Window Onscroll 方法来检测滚动方向吗 如果您在页面加载时以及每次发生滚动事件时记录scrollX和scrollY 那么您可以将以前的值与新值进行比较 以了解滚动的方向 这是概念证明 function scrollF
  • 从 .NET Windows 服务调用本机 DLL 失败

    我有一个本机 dll 形式的第 3 方 API 我使用 C 调用它DllImport 此本机 dll 依赖于打开的第 3 方应用程序 当我正常运行代码时 API 会执行预期的操作并驱动应用程序 然而 当我运行与 Windows 服务相同的代
  • 将点分布在边界内的表面上

    我对一种在 4 面 如正方形 上分布预定义数量的点的方法 算法 感兴趣 主要问题是每个点必须具有彼此之间的最小和最大接近度 两个预定义值之间的随机值 基本上 任何两点的距离不应小于 2 也不应大于 3 我的代码将用 ruby 实现 点是位置