Python: Как генерировать точки случайной формы / SVG с отверстиями? - PullRequest
0 голосов
/ 15 января 2020

Для школьного проекта я пытаюсь сгенерировать точки (отбор по Пуассону c) в случайном файле SVG. Мои ученики создадут файл SVG. Итак, у меня есть код для отбора по Пуассону c в прямоугольнике, который необходимо адаптировать к случайному SVG.

def sample_poisson_uniform(width, height, r, k):
#Convert rectangle (the one to be sampled) coordinates to 
# coordinates in the grid.
def grid_coordinates((x, y)):
    return (int(x*inv_cell_size), int(y*inv_cell_size))

# Puts a sample point in all the algorithm's relevant containers.
def put_point(p):
    process_list.push(p)
    sample_points.append(p)  
    grid[grid_coordinates(p)] = p

# Generates a point randomly selected around
# the given point, between r and 2*r units away.
def generate_random_around((x, y), r):
    rr = uniform(r, 2*r)
    rt = uniform(0, 2*pi)

    return rr*sin(rt) + x, rr*cos(rt) + y

# Is the given point in the rectangle to be sampled?
def in_rectangle((x, y)):
    return 0 <= x < width and 0 <= y < height

def in_neighbourhood(p):
    gp = gx, gy = grid_coordinates(p)

    if grid[gp]: return True

    for cell in grid.square_iter(gp, 2):
        if cell and sqr_dist(cell, p) <= r_sqr:
            return True
    return False

#Create the grid
cell_size = r/sqrt(2)
inv_cell_size = 1 / cell_size   
r_sqr = r*r

grid = Grid2D((int(ceil(width/cell_size)),
    int(ceil(height/cell_size))))

process_list = RandomQueue()
sample_points = []  

#generate the first point
put_point((rand(width), rand(height)))

#generate other points from points in queue.
while not process_list.empty():
    p = process_list.pop()

    for i in xrange(k):
        q = generate_random_around(p, r)
        if in_rectangle(q) and not in_neighbourhood(q):
                put_point(q)

return sample_points

Я думал найти внешнюю и внутреннюю границу файла SVG и использовать symmetric_difference от shapely. Хотя у меня нет большого опыта работы с shapely, и мне нужно было бы сначала преобразовать SVG в шейп-файл .

Это правильный способ мышления? Каков будет лучший способ сделать это? - случайный пример SVG.

...