Python scipy.spatial.Voronoi:如何知道光线穿过给定直线的位置?
大家好, 我有以下代码段:Python scipy.spatial.Voronoi:如何知道光线穿过给定直线的位置?,python,scipy,voronoi,Python,Scipy,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), ran
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\u顶点
列表,但是,这些“光线”仅与列表中的一个顶点关联,因此我无法计算出直线方程
编辑:
我的最终目标是,给定平面的边界,为给定的边单元找到与这些边界相交的点。例如,给定左上角的边单元格,边界y=-50和x=525,我会找到用红色x标记的点
因此,如果你对此有任何见解,他们将不胜感激
多谢各位
(x1,y_1)
和(x_2,y_2)
,光线与边界的交点为(x*,y*)
,则以下公式成立:(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\u 1,y\u 1)
还是(x\u 2,y\u 2)
作为第一个通行证,我会用蛮力:
(1) 迭代所有点的组合(每个边框n*(n-1)/2个,所以不要太多),分别查找x*
或y*
。这将为您提供一个潜在解决方案的列表(x_1,y_1),(x_2,y_2),(x*,y*)
(2) 对于每个候选(x*,y*)
对,我将在原始数据点集中找到两个最近的邻居(有效地通过scipy.spatial.KDTree
)。如果这些点不是(x_1,y_1)
和(x_2,y_2)
,则丢弃候选溶液(x*,y*)
在KD树中查找最近邻是O(n logn)(IIRC),因此在整个过程中,您仍然是O(n^2) 但是,给定两个区域,我不知道我知道的是
x*
和y*
中的哪一个,对吗?所以我必须计算这两种情况,并决定哪一种是适用的?对不起,我不确定你的意思。你能详细说明一下吗?我以为你会设置边界?我会,但我怎么知道给定光线首先穿过哪个边界,因为它可能会穿过两个边界?如果所有数据点都不是共线的,即在一条直线上,光线不能穿过多个边界。但边界定义为直线,而不是线段。因此,光线最终将在穿过第一条边界后穿过第二条边界。我对如何确定它首先穿过哪一条感到困惑——或者我是否可以。