Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Броунівське дерево

leave a comment »

Виглядає так:

Що воно таке – читайте на вікіпедії, а тут я розкажу як собі таке зробити.

В цьому прикладі, я випадковим чином ставив точку на коло з певним радіусом, і надавав їй випадкової початкової швидкості певного, конкретного модуля.

SIZE = 4 # Розмір частинки
SX = RESOLUTION[0]/SIZE # Розмір поля
SY = RESOLUTION[1]/SIZE

field = np.zeros((SX,SY),dtype=int) # Створити чисте поле потрібних розмірів np = numpy
field[SX/2,SY/2] = 1 # І поставити посередині центр кристалізації

def addcell():
        global field
        alpha = randint(0,360)*math.pi/180 # З випадкового напрямку
        x = SX/2.0 - math.sin(alpha)* SY/2.1 # На колі радіуса SY/2.1
        y = SY/2.0 - math.cos(alpha)* SY/2.1
        alpha = randint(0,360)*math.pi/180 # У випадковому напрямку
        dx = math.sin(alpha)/2 # Запустити частинку
        dy = math.cos(alpha)/2
        while True: # І хай летить
                x += dx 
                y += dy
                if x<0 or x>=SX or y<0 or y>=SY: # Якщо вийде за межі поля 
                        return False # Закінчити
                if field[int(x),int(y)]: # Якщо вдарилась в іншу частинку
                        field[int(x-dx),int(y-dy)] = 1 # Приліпити
                        palette.green()# Замалювати зеленим того кого вдарили
                        rectangle(int(x)*SIZE,int(y)*SIZE,SIZE-1,SIZE-1) 
                        palette.red()# Замалювати червоним того хто прилип
                        rectangle(int(x-dx)*SIZE,int(y-dy)*SIZE,SIZE-1,SIZE-1) 
                        return True # Успіх

Повний код тут. Для запуску потрібні Pygame та OpenGL. Після запуску програма стоїть на паузі – натисніть пробіл щоб запустити дифузію.

Кінець опису. Далі сльози і соплі.

P.S. Загалом мене знову після ОГ та КГ взяла злість, бо не вмію придумувати нові алгоритми, а Терещенко хоче аби я придумав якийсь оптимальний алгоритм тетраедралізації. От я подумав що треба сісти на 5 годин за комп’ютер, і написати щось попростіше. Для початку свій Minecraft. Але зразу навіть таку штуку важко написати, тому хотілось розбити проект на фази:

  1. Запуск OpenGL, реагування на події. (Є, бо те що вище працює).
  2. Написання гарненької камери і навігація по сцені.
  3. Додавання на сцену кубиків (вокселів).
  4. Визначення видимої для камери області, та області під курсором. Взаємодія з вокселями.
  5. Тетраедралізація об’єкта що складений з вокселів.

Вже три години, і я вже стомився. Але треба розібратись з камерою. Приклад вище взагалі плоский (ортогональна проекція).

Advertisements

Written by bunyk

Квітень 11, 2011 at 17:21

Оприлюднено в Графіка, Кодерство, Нещоденник

Tagged with

Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: