小编zgf*_*985的帖子

如何为具有物理限制的随机点创建修改的 voronoi 算法

毫无疑问,Voronoi 算法提供了一种可行的方法,可以根据到平面特定子集中的点的距离将平面划分为多个区域。这样一组点的 Voronoi 图是其 Delaunay 三角剖分的对偶。 现在可以通过使用模块 scipy 作为直接实现这个目标

import scipy.spatial

point_coordinate_array = np.array(point_coordinates)
delaunay_mesh = scipy.spatial.Delaunay(point_coordinate_array)
voronoi_diagram = scipy.spatial.Voronoi(point_coordinate_array)

# plot(delaunay_mesh and voronoi_diagram using matplotlib)
Run Code Online (Sandbox Code Playgroud)

当预先给定点数时。结果如图1所示,

其中绿色虚线包围的区域是所有点的德劳内三角形,蓝色实线的封闭区域当然是中心点的voronoi单元(为了更好的可视化,这里只显示封闭区域)

直到现在,一切都被认为是完美的。但在实际应用中,所有的点都可能有自己的物理意义。(例如,当这些点代表自然粒子时,它们可能具有“半径”变量)。而上面常见的voronoi算法,对于这种可能需要考虑复杂物理限制的情况,或多或少是不合适的。如图 2 所示,voronoi 单元的脊可能与粒子边界相交。已经不能满足生理要求了。

我现在的问题是如何创建一个修改过的 voronoi 算法(也许它不能再被称为 voronoi)来处理这个物理限制。这个目的大致如图3所示,蓝色虚线封闭的区域正是我想要的。

在此处输入图片说明

所有的点数要求是:

1.numpy-1.13.3+mkl-cp36-cp36m-win_amd64.whl

2.scipy-0.19.1-cp36-cp36m-win_amd64.whl

3.matplotlib-2.1.0-cp36-cp36m-win_amd64.whl

并且都可以直接在http://www.lfd.uci.edu/~gohlke/pythonlibs/下载

我的代码已更新以进行更好的修改,它们是

import numpy as np
import scipy.spatial
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
from matplotlib.collections import PatchCollection

# give the point-coordinate array for contribute the tri-network.
point_coordinate_array = np.array([[0,0.5],[8**0.5,8**0.5+0.5],[0,-3.5],[-np.sqrt(15),1.5]])

# give …
Run Code Online (Sandbox Code Playgroud)

python geometry voronoi matplotlib scipy

10
推荐指数
1
解决办法
873
查看次数

标签 统计

geometry ×1

matplotlib ×1

python ×1

scipy ×1

voronoi ×1