Форум сайта python.su
Я начинающий питонер, прошу не пинать. Нашёл в инете скрипт, генерирующий растровую картинку с диаграммой Вороного. Не могу разробраться, как это работает. Используются модули math, PIL и random
Вот сам код. Объясните мне, пожалуйста, поподробнее, как генерируется эта самая диаграмма. Мне очень интересно.
Можно ли обойтись без модуля PIL? Можно ли выводить в Canvas? Или сохранять в SVG?
import random
import math
from PIL import Image
imgx = 600
imgy = 600
image = Image.new("RGB", (imgx, imgy))
n = random.randint(50, 100) # of cells
nx = []
ny = []
nr = []
ng = []
nb = []
for i in range(n):
nx.append(random.randint(0, imgx - 1))
ny.append(random.randint(0, imgy - 1))
nr.append(random.randint(0, 255))
ng.append(random.randint(0, 255))
nb.append(random.randint(0, 255))
for y in range(imgy):
for x in range(imgx):
# find the closest cell center
dmin = math.hypot(imgx - 1, imgy - 1)
j = -1
for i in range(n):
d = math.hypot(nx[i] - x, ny[i] - y)
if d < dmin:
dmin = d
j = i
image.putpixel((x, y), (nr[j], ng[j], nb[j]))
# mark the cell centers
for i in range(n):
image.putpixel((nx[i], ny[i]),(255 - nr[i], 255 - ng[i], 255 - nb[i]))
image.save(" voronoi.png", "PNG")
Офлайн
картинка создается попиксельно, так так что мне кажется ничего не получится.
Работает долго потому что 3 вложенных питоньих цикла.
600 * 600 * n итераций.
Офлайн
Интересен даже не метод генерации изображения средствами PIL, а сам алгоритм построения “диаграммы Вороного”. Интересно, как действует функция math.hypot
Офлайн
Такое на си + libgd можно переписать за милую душу.
http://docs.python.org/library/math.html?highlight=math.hypot#math.hypot
Очень полезный сайт, всем рекомендую (:
Офлайн
Спасибо:)
Офлайн