python – scipy.spatial.Voronoi:如何知道光线穿过给定线的位置?
作者:互联网
今天是个好日子,
我有以下代码段:
import numpy as np
from random import randint
import matplotlib.pyplot as plt
from scipy.spatial import Voronoi, voronoi_plot_2d
NUM_OF_POINTS = 20
points = []
for i in range (0, NUM_OF_POINTS):
points.append([randint(0, 500), randint(0, 500)])
points = np.array(points)
vor = Voronoi(points)
voronoi_plot_2d(vor)
plt.show()
我的目标是找到’射线'(走出绘图的线,虚线或实线)与给定线相交的位置(例如x = 500).我该怎么做呢?
我已经尝试在Voronoi对象中使用ridge_vertices列表,但是,这些“光线”仅与列表中的单个顶点相关联,因此我无法弄清楚线方程.
编辑:
我的最终目标是,在给定平面边界的情况下,找到与给定边缘单元格的这些边界相交的点.例如,给定左上角的边缘单元格,边界y = -50和x = 525,我会发现用红色X标记的点.
因此,如果您对此有任何见解,他们将不胜感激.
谢谢.
解决方法:
>角落是微不足道的,因为你知道x和y坐标.
> Voronoi图中的边缘与由该边分开的两个单元的中心等距,这自然包括“光线”的终点(在您的术语中).设两个中心为点(x1,y_1)和(x_2,y_2),并且光线与边界的交点为(x *,y *),则以下成立:
(1)(x * -x_1)^ 2(y * -y_1)^ 2 = d ^ 2
(2)(x * -x_2)^ 2(y * -y_2)^ 2 = d ^ 2
你知道x *或y *,因为它们是由边界定义的.然后你有两个方程,两个未知数(x *或y *和d).假设你知道y *,那么你得到x *的以下解决方案:
x * =((y * -y_1)^ 2 – (y * -y_2)^ 2 x_1 ^ 2 – x_2 ^ 2)/(2 *(x_1 – x_2))
现在,您如何确定要选择哪些点(x_1,y_1)和(x_2,y_2)?
作为第一关,我会蛮力:
(1)迭代所有点的组合(每个边界n *(n-1)/ 2,所以不是那么多),分别找到x *或y *.这为您提供了潜在解决方案的列表(x_1,y_1),(x_2,y_2),(x *,y *).
(2)对于每个候选(x *,y *)对,我会在原始数据点集中找到2个最近邻居(通过scipy.spatial.KDTree有效).如果这些点不是(x_1,y_1)和(x_2,y_2),则丢弃候选解(x *,y *).
在KD树中查找最近邻居是O(n log n)(IIRC),因此对于整个过程,您仍然是O(n ^ 2).
标签:python,scipy,voronoi 来源: https://codeday.me/bug/20190701/1350236.html