如何计算新点位于 Voronoi 图的哪个位置?

2024-03-03

我写了一个小脚本来显示 voronoi 图M点来自本教程 https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.spatial.Voronoi.html. I use scipy.spatial.

我想给出一个新的平面点,并说出这个点在voronoi图的哪个位置。是否可以?

这是我的代码:

import random
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import Voronoi, voronoi_plot_2d

N = 70
M = 10

Matrix = [(random.random()*100,random.random()*100)  for x in range(M)]
points = np.array(Matrix)


vor = Voronoi(points)
print(vor.ridge_vertices)

voronoi_plot_2d(vor)
plt.show()

根据Voronoi图的概念,新点P所属的单元是由原始点中距离P最近的点生成的。找到这一点就是直接最小化距离:

point_index = np.argmin(np.sum((points - new_point)**2, axis=1))

然而,您想要找到region。以及这些地区vor.regions与以下顺序不同vor.points,不幸的是(我真的不明白为什么,因为每个点都应该有一个区域)。

所以我使用了以下方法:

  1. 找到我想要的点周围的所有山脊,使用vor.ridge_points
  2. 将这些山脊中的所有山脊顶点作为一个集合
  3. 寻找具有相同顶点集的(唯一)区域。

Result:

M = 15
points = np.random.uniform(0, 100, size=(M, 2))
vor = Voronoi(points)
voronoi_plot_2d(vor)

new_point = [50, 50]   
plt.plot(new_point[0], new_point[1], 'ro')

point_index = np.argmin(np.sum((points - new_point)**2, axis=1))
ridges = np.where(vor.ridge_points == point_index)[0]
vertex_set = set(np.array(vor.ridge_vertices)[ridges, :].ravel())
region = [x for x in vor.regions if set(x) == vertex_set][0]

polygon = vor.vertices[region]
plt.fill(*zip(*polygon), color='yellow')  
plt.show()

这是一个演示:

请注意,如果该区域是无界的,则该区域的着色将不正确;这是简单着色方法的缺陷,而不是区域查找算法的缺陷。看为 Voronoi 图着色 https://stackoverflow.com/questions/20515554/colorize-voronoi-diagram为无界区域着色的正确方法。

旁白:我使用 NumPy 生成随机数,这比你所做的更简单。

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

如何计算新点位于 Voronoi 图的哪个位置? 的相关文章

随机推荐

  • 在这种情况下溢出意味着什么?

    我找到了一种以模数相乘的算法 下一个伪代码取自维基百科 页面模指数 部分从右到左的二进制方法 完整的伪代码是 function modular pow base exponent modulus Assert modulus 1 modul
  • Vuetify 没有 vue-cli sass/scss 冲突

    我需要将 vuetify 集成到一个无法使用 vue cli 且具有以下 css sass webpack 配置的项目中 test s ac ss use MiniCssExtractPlugin loader loader css loa
  • 在 C# if 语句中检查多个布尔条件的最佳方法

    我的代码 C 中有 3 个布尔值和一个int32取决于布尔值的属性true and false 除了 if 语句之外 以另一种方式实现此目的的最佳方法是什么 if a b c d 1 if a b c d 2 etc ect 编辑 这 3
  • 在 Spring Data JPA 中使用 Java 配置进行审计

    Java 配置是Spring Data 1 2 0 版本中引入 http blog springsource org 2012 10 15 spring data release train arrived 但我不知道java配置如何
  • Windows 上的“catalina.out”在哪里?

    我在 Linux 机器上有一个 tomcat 我可以可视化 catalina out 文件 我想将我的开发环境 Eclipse IDE JDK 6 Tomcat 6 等 从 Linux 迁移到 Windows 一切正常 但是 我在 Wind
  • 我可以使用 JavaScript 或 HTML 打开 IE 10 兼容性视图吗?

    如何在 Javascript 或 HTML 中以编程方式打开 IE 10 兼容性视图 我刚刚在其中添加了以下元标记标签 但它不起作用 有没有办法在 JS 中做同样的事情 我查了msdn上的兼容模式文章 here http msdn micr
  • Excel 中的动态数据验证(非 VBA!)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 I got n持有的类别m产品 该列表未排序 例如如下 现在这就是我基本上想用这个列表做的事情 下拉菜单 数据验证 动态存储第一列的每个唯一值的列表
  • Scala String 与 java.lang.String - 类型推断

    在 REPL 中 我定义了一个函数 请注意返回类型 scala gt def next i List String i map 0 i reverse map 1 next i List String List java lang Stri
  • 泛型:访问新成员,而不是隐藏成员

    我遇到了泛型和新成员的问题 我编写了一个对 ObjectA 类型的对象进行操作的泛型类 ObjectB 派生自ObjectA 并隐藏了ObjectA 的一些成员 当我提供 ObjectB 的类型作为泛型类的类型参数时 我希望当我调用 Obj
  • Javascript fetch 返回 200 但没有数据

    我需要在下拉菜单中显示世界上所有国家 地区 所以我找到了这个api端点端点链接 https restcountries eu rest v1 all 当我在网络浏览器中复制并粘贴此端点链接时 我收到了包含所有数据的响应 国家 当我尝试将其嵌
  • 如何在 Android 中使用应用程序范围的 id 打开 facebook Messenger 聊天窗口

    我可以在我的应用程序中使用 graph api 获取应用程序范围的用户 ID 然后 如何在 android 中使用应用程序范围的 id 打开 facebook Messenger 聊天窗口 我们可以使用 global facebook id
  • 如何获取 Expo 的 assetlinks.json 的 sha256_cert_fingerprints?

    android通用深度链接的说明需要您上传 well known assetlinks json以供验证 Expo 深度链接文档指示您按照官方 Android 文档格式化文件 但该文档假设您正在使用 android studio 来构建您的
  • github 自动将组添加到每个新存储库

    我的组织中存在一个问题 每当创建新存储库时 其中一个组就会自动添加到具有读取权限的该存储库中 即使具有组织所有者权限 也无法将其从那里删除 它指出这是由组织所有者管理的 但在该组或组织设置中都看不到这样的设置 有什么想法如何更改 删除 自动
  • Selenium 中 waitForPageToLoad 的替代方案

    我在页面上有一系列链接 需要不同的时间来加载 我想捕获每个链接所花费的时间 我遇到的问题是 如果超过 waitForPageToLoad 时间 则会导致测试失败 并且我的其余链接没有得到测试 我知道我可以跳过测试中的可疑链接或设置超出预期的
  • JPA 中列表的保存顺序

    我对JPA有以下疑问 我可以保存 java util List 中元素的顺序吗 在我的应用程序中 将元素放入列表中的顺序很重要 但是当我从数据库中获取这些集合后 顺序并不相同 如预期 你能告诉我一种解决这个问题的方法吗 附 我放入集合中的实
  • 计算 DISTINCT 值的出现次数

    我试图找到一个 MySQL 查询 该查询将在特定字段中查找不同的值 计算该值出现的次数 然后按计数对结果进行排序 示例数据库 id name 1 Mark 2 Mike 3 Paul 4 Mike 5 Mike 6 John 7 Mark
  • GAE - 部署错误:“AttributeError:无法设置属性”

    当我尝试部署我的应用程序时 出现以下错误 Starting update of app flyingbat123 version 0 1 Getting current resource limits Password for avigma
  • Prestashop 送货时选择隐藏/显示付款方式

    我试图弄清楚如何在选择送货方式时显示 隐藏付款方式 我尝试了几个解决方案 但它对我不起作用 其中之一是这个
  • 如何在Flutter中像Youtube一样显示之前的时间

    我正在编写一个 flutter 应用程序来克隆一些 Youtube 功能Youtube API V3 该应用程序获取字符串形式的视频时间戳来自 YouTube 视频 API 每个时间戳都具有以下格式 YYYY MM DDTHH MM SSZ
  • 如何计算新点位于 Voronoi 图的哪个位置?

    我写了一个小脚本来显示 voronoi 图M点来自本教程 https docs scipy org doc scipy 0 18 1 reference generated scipy spatial Voronoi html I use