Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 30, 2011 17:05:29

Лёша
От:
Зарегистрирован: 2011-01-30
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Диаграмма Вороного

Я начинающий питонер, прошу не пинать. Нашёл в инете скрипт, генерирующий растровую картинку с диаграммой Вороного. Не могу разробраться, как это работает. Используются модули 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")
Работает довольно-таки медленно, чем больше разрешение выходной картинки, тем дольше ждать



Офлайн

#2 Янв. 30, 2011 17:22:23

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Диаграмма Вороного

картинка создается попиксельно, так так что мне кажется ничего не получится.
Работает долго потому что 3 вложенных питоньих цикла.
600 * 600 * n итераций.



Офлайн

#3 Янв. 31, 2011 19:52:21

Лёша
От:
Зарегистрирован: 2011-01-30
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Диаграмма Вороного

Интересен даже не метод генерации изображения средствами PIL, а сам алгоритм построения “диаграммы Вороного”. Интересно, как действует функция math.hypot



Офлайн

#4 Янв. 31, 2011 21:11:40

certanista
От:
Зарегистрирован: 2010-10-28
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Диаграмма Вороного

Такое на си + libgd можно переписать за милую душу.

http://docs.python.org/library/math.html?highlight=math.hypot#math.hypot
Очень полезный сайт, всем рекомендую (:



Офлайн

#5 Фев. 1, 2011 15:28:46

Лёша
От:
Зарегистрирован: 2011-01-30
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Диаграмма Вороного

Спасибо:)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version