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标记的点

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

多谢各位

  • 角点很小,因为你知道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\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*
    中的哪一个,对吗?所以我必须计算这两种情况,并决定哪一种是适用的?对不起,我不确定你的意思。你能详细说明一下吗?我以为你会设置边界?我会,但我怎么知道给定光线首先穿过哪个边界,因为它可能会穿过两个边界?如果所有数据点都不是共线的,即在一条直线上,光线不能穿过多个边界。但边界定义为直线,而不是线段。因此,光线最终将在穿过第一条边界后穿过第二条边界。我对如何确定它首先穿过哪一条感到困惑——或者我是否可以。