【发布时间】:2019-08-09 11:21:03
【问题描述】:
我正在尝试使用 SciPy 和 PyGame 在我随机生成的世界地图上创建和显示 Voronoi Diagram。
我遇到的问题是,总是有一个点有奇怪的线条,忽略其他任何东西,并像星星或其他东西一样在地图上散布开来。从左上角和左下角可以看出,它们不会进入无穷大。
我怎样才能摆脱它?
显示内容:
我的代码:
import numpy
import random
import pygame
from scipy.spatial import Voronoi
def __generate_voronoi():
"""
Randomly chooses various points within the x and y dimensions of the map.
Then, uses SciPy to generate a voronoi diagram with them, and returns it.
:return: SciPy voronoi diagram
"""
point_arr = numpy.zeros([900, 2], numpy.uint16)
for i in range(900):
point_arr[i][0] = numpy.uint16(random.randint(0, 1600))
point_arr[i][1] = numpy.uint16(random.randint(0, 900))
return Voronoi(point_arr)
def draw_voronoi(pygame_surface):
# generate voronoi diagram
vor = __generate_voronoi()
# draw all the edges
for indx_pair in vor.ridge_vertices:
start_pos = vor.vertices[indx_pair[0]]
end_pos = vor.vertices[indx_pair[1]]
pygame.draw.line(pygame_surface, (0, 0, 0), start_pos, end_pos)
【问题讨论】:
-
这不是一个解决方案,但代码可以检查行长度
start_pos->end_pos并丢弃任何超过某个校准最大值的行。 -
@Kingsley 谢谢你,但我想看看我是否能找到即使该点靠近地图边界也能工作的东西。
-
ridge_vertices中的索引可以包含 -1 值,表示图表边缘的一条线指向无穷远,而不是连接到vertices中的另一个点。您盲目地将这些值视为索引,从而导致在列表中碰巧位于最后的任何顶点出现一行。生成一个有意义的远端点来表示这些无限的线需要一些额外的计算 - 我建议查看scipy.spatial.voronoi_plot_2d的源代码作为起点。 -
@jasonharper 谢谢你,但我认为你在无穷大方面犯了一个错误。这些线条实际上并没有走向无穷大。查看图像的左上角和左下角。
-
@LuminousNutria 它们是应该走向无穷远的线,因此它们的索引为-1。在许多语言中,这是一种返回错误而不是在索引中的简单方法,但在 python 中,-1 是一个有效的索引。查看“/python_location/Lib/site-packages/scipy/spatial/_plotutils.py”第 173-188 行,了解内置实用程序的功能。
标签: python python-2.7 numpy scipy pygame