Использование PyGame для отображения Sci Py ребер voronoi создает странный эффект "звезды" - PullRequest
2 голосов
/ 19 марта 2019

Я пытаюсь использовать SciPy и PyGame для создания и отображения диаграммы Вороного поверх случайно сгенерированной карты мира.

Проблема, с которой я сталкиваюсь, заключается в том, что всегда есть одна точка, которая имеет странные линии, которые игнорируют все остальное и распространяются по карте, как звезда или что-то в этом роде.Как видно в верхнем левом и нижнем левом углах, они не уходят в бесконечность.

Как от этого избавиться?

Что показано:

enter image description here

Мой код:

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)

1 Ответ

1 голос
/ 20 марта 2019

Благодаря комментариям пациентов здесь я узнал, что vor.vertices вернет -1 для первого индекса точки, которая уходит в бесконечность. Это создает проблему, так как python рассматривает -1 как индекс последнего элемента списка или массива.

Решением моей проблемы было не рисовать линии с индексом -1 от vor.vertices.

Я реализовал это, заменив функцию draw_voronoi() следующим кодом:

def draw_voronoi(pygame_surface):

    # generate voronoi diagram
    vor = __generate_voronoi()

    # draw all the edges
    for indx_pair in vor.ridge_vertices:

        if -1 not in indx_pair:

            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)

Это произвело это изображение:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...