编程语言
首页 > 编程语言> > python – scipy.spatial.Voronoi:如何知道光线穿过给定线的位置?

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()

这产生了Voronoi图,例如:random Voronoi diagram

我的目标是找到’射线'(走出绘图的线,虚线或实线)与给定线相交的位置(例如x = 500).我该怎么做呢?

我已经尝试在Voronoi对象中使用ridge_vertices列表,但是,这些“光线”仅与列表中的单个顶点相关联,因此我无法弄清楚线方程.

编辑:

我的最终目标是,在给定平面边界的情况下,找到与给定边缘单元格的这些边界相交的点.例如,给定左上角的边缘单元格,边界y = -50和x = 525,我会发现用红色X标记的点.

example case

因此,如果您对此有任何见解,他们将不胜感激.

谢谢.

解决方法:

>角落是微不足道的,因为你知道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