Для школьного проекта я пытаюсь сгенерировать точки (отбор по Пуассону 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.