[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум Panda3D - по русски » Panda3D » Примеры кода » Fractal Map Generator
Fractal Map Generator
ninthДата: Среда, 13.04.2011, 00:53 | Сообщение # 1
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
Не относится напрямую к панде, но может быть полезен если необходимо генерировать карту, состоящую из нескольких типов поверхности, например вода, земля и горы.
Алгоритм абстрагирован от какой-либо конкретной реализации карты, поэтому потребуется передать две callback функции для работы с вашим вариантом. Первая функция должна принимать кортеж (x,y) и возвращать тип поверхности, находящийся по этим координатам.
Вторая - должна принимать кортеж (x,y), тип поверхности и устанавливать принятый тип в координаты x y

Конструктор класса FractalMapGen принимает следующие параметры:
sample - список или кортеж вариантов поверхности. Элементы любого типа.
getCallback - указатель на функцию с помощью которой генератор будет получать тип поверхности по координатам
setCallback - указатель на функцию с помощью которой генератор будет устанавливать тип поверхности по координатам
dimension - размер карты (x,y)
step - величина шага - количество клеток, на которые будет делиться поле в каждой итерации. Должен быть > 1. Размеры карты должны без остатка делиться на шаг. В идеале - должны быть степенью шага.

метод generate принимает 2 параметра и возвращает True в случае успешной генерации:
showProgress - показывать прогресс генерации (0 - не поазывать; 1 - простой вывод процентов (по умолчанию); 2 - расширенный вывод, корректно работает только в unix-based терминалах, по сути нафиг не нужен - это я экспериментировал ))
maxIters - ограничение кол-ва итераций (0 - максимально возможное (по умолчанию); целое число > 0 - ограничить итерации этим числом; целое < 0 - вычесть из максимально возможного количества итераций данное число)

Можно назначить шаблон для генерации карты в виде двухмерного массива, элементами которого являются типы местности или значение None, которое будет заполнено случайным образом. Размерность массива так же должна быть кратна шагу. шаблон устанавливается до генерации методом setTemplate.
setTemplate принимает шаблон и возвращает True в случае успешного применения.

Пример 1: в качестве карты используется изображение. Работа с изображением через PIL (должна быть установлена)

Code
from fractalMG import FractalMapGen
from PIL import Image, ImageDraw
sx,sy = 128,128
colors = ((255,0,0),(0,255,0),(0,0,255),(250,150,50))
image = Image.new("RGB", (sx,sy), (0,0,0,0))
fg = FractalMapGen(colors, image.getpixel, image.putpixel, (sx,sy), 4)
fg.generate()
image.save("./test1.png", "PNG")
del image

Пример2: в качестве карты используется массив из символов. Применён шаблон

Code
from fractalMG import FractalMapGen
sx,sy = 24,24
tiles = ('_','#','^')
field = [[None for y in xrange(sy)] for x in xrange(sx)]
             
def getS(pos):
       x,y = pos
       return field[x][y]
          
def setS(pos, val):
       x,y = pos
       field[x][y] = val

tmp = (('_',None,None,'#'),
          ('^','_','#','^'),
          ('^','#','_','^'),
          ('#',None,None,'_'))

fg = FractalMapGen(tiles, getS, setS, (sx,sy), 4)
fg.setTemplate(tmp)
fg.generate()

for y in xrange(sy):
       print ''
       for x in xrange(sx):
           print field[x][y],

_ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ # # # # # # # # # # #
_ ^ ^ ^ ^ ^ ^ ^ _ ^ ^ ^ # # # # # # # # # # # #
_ ^ ^ ^ ^ ^ _ _ _ ^ ^ ^ # # # # # # ^ ^ ^ ^ # #
^ ^ ^ ^ ^ ^ _ _ _ _ ^ ^ # # # # # # ^ ^ ^ ^ # #
^ _ _ _ _ ^ _ _ _ _ ^ ^ # # # # # # ^ ^ ^ ^ ^ ^
^ _ _ _ ^ ^ ^ _ _ _ ^ ^ # # # # # # # # ^ ^ ^ ^
_ _ _ ^ ^ ^ ^ _ _ ^ ^ ^ # # # # # # ^ # ^ ^ ^ ^
_ _ ^ _ _ _ ^ _ _ _ _ _ # _ _ _ ^ ^ _ # ^ ^ ^ ^
_ ^ ^ ^ ^ _ _ _ _ _ _ _ # # _ _ _ ^ _ ^ # ^ ^ #
^ ^ ^ ^ _ _ _ _ _ _ _ _ _ _ _ ^ _ ^ ^ # # # ^ #
^ ^ ^ ^ _ _ _ _ _ ^ _ _ _ _ _ ^ ^ ^ ^ ^ # # # #
^ ^ ^ ^ # _ ^ _ _ _ _ _ _ _ _ # ^ ^ ^ # # # # #
^ ^ ^ ^ # _ ^ ^ ^ ^ _ _ _ _ # # # _ _ _ # # # #
^ ^ ^ ^ # # # # ^ ^ ^ _ _ _ # # # _ # # # # # #
^ ^ ^ # # # # ^ # ^ ^ _ _ _ # # # # # # # # # #
^ ^ ^ ^ # # # # # ^ ^ ^ ^ _ # # # # # # _ # _ _
^ ^ ^ # # # # # ^ ^ ^ ^ ^ ^ # # # # # # _ # _ _
# # ^ # # # # # # ^ ^ ^ ^ ^ ^ ^ _ _ _ _ _ _ _ _
# # # # # # ^ ^ ^ ^ ^ # # # ^ ^ ^ # _ _ _ _ _ _
# # # # # # # ^ # ^ ^ # # ^ ^ # _ # _ _ _ _ _ _
# # # # # # # # # # # # # ^ # # # _ _ _ _ _ _ _
# # # # # # # # # # # ^ ^ ^ # _ _ _ _ _ _ _ _ _
# ^ ^ # # # # # # # # # ^ ^ # # _ _ _ _ _ _ _ _
# ^ ^ # # # # # # # # # # # # # _ _ _ _ _ _ _ _

Прикрепления: 2069296.png(3Kb) · fractalMG.py(4Kb)
 
Форум Panda3D - по русски » Panda3D » Примеры кода » Fractal Map Generator
Страница 1 из 11
Поиск: