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

Я не знаю куди й нащо мені бігти. Та це все таки веселіше ніж сидіти.

Archive for the ‘Графіка’ Category

Заклинання для сповільненої зйомки в Ubuntu/Debian

leave a comment »

Звичайно вам потрібна ще веб-камера, і можливо якісь драйвери. На всяк випадок поставте Cheese – програмку для тестування веб-камери.

Інвентар:

sudo apt-get install cheese
sudo apt-get install streamer
sudo apt-get install mencoder

Сцена:

mkdir timelapse
cd timelapse
vim generate.py

Зйомка:
Прочитати решту цієї замітки »

Written by bunyk

Жовтень 10, 2011 at 23:02

Опубліковано в Інструменти, Графіка, Кодерство

Tagged with ,

Перетин променя й трикутника

leave a comment »

Для тривимірного випадку.

Це досить часта задача в комп’ютерній графіці. Зокрема, визначити чи знаходиться точка всередині меша (якщо він замкнений), можна обчисливши кількість перетинів довільного променя що виходить з цієї точки з мешем. Якщо ця кількість непарна – точка всередині меша. Про обчислення зіткнень, та трасування променів взагалі мовчу.

Нам дано вектори \vec O – початок променя, \vec D – його напрям, \vec A,\ \vec B,\ \vec C – вершини трикутника. \vec X – перетин променя й трикутника.

Прочитати решту цієї замітки »

Written by bunyk

Квітень 25, 2011 at 23:44

Опубліковано в Графіка, Кодерство

Tagged with , ,

Графіки та інша векторна графіка в будь-якій мові програмування

Кількість коментарів - 3

Результат - графік параболоїда


Спеціально для тих, кому терміново треба графік функції, і вони не хочуть встановлювати всякі важкі графічні бібліотеки, а тим більше їх вивчати. Зображення буде створюватись в файлі, тому якщо ваша мова вміє записувати в файли текст – то ви зможете створити в ній зображення. Хто вже знає що таке SVG – може далі не читати. Кому це справді треба – прошу критикувати. Я можу написати більше і зрозуміліше, якщо сильно попросите. Основне – задавайте питання.

На прикладі Python, але принцип такий же і в інших мовах (недавно я написав функцію на C, яка малювала гістограми. Теж влізла в один екран). Двовимірні графіки нудні, тому перейдемо одразу до трьох вимірів, і спробуємо намалювати параболоїд. Все одно вийде занадто просто.

Загалом, нам навіть не потрібна мова програмування. Для того, щоб намалювати зображення подібне до того що справа, нам досить створити текстовий файл picture.svg (чи з іншою_назвою.svg), і написати в ньому наступний текст:
Прочитати решту цієї замітки »

Written by bunyk

Квітень 18, 2011 at 23:45

Опубліковано в Графіка, Кодерство, Розмітка

Tagged with

Маштабована векторна наочність

Кількість коментарів - 6

Будуємо кола що проходять через дві точки


Єху! Я прорвався в анімації з SVG. Жаль тільки що wordpress, і вікіпедія не дозволяє тут їх викладати, бо вони такі інтерактивні, що й можуть містити шкідливий код. Тому клацніть на картинку.

Картинка пояснює як побудувати коло що проходить через дві точки, знаючи радіус. (Взагалі то пояснює слабо, але перспективу має). Крім того основною метою було – розібратись як створюють анімації в SVG за допомогою JavaScript. Поки що вмію малювати лише відрізки, еліпси та прямокутники.

А ще для SVG є офігенний редактор. svg-edit, який можна вбудувати прямо в веб-сторінку.

Хтось обов’язково мусить зверстати підручник з планіметрії на HTML5. Якби я був міністром освіти, то виділив б на це десь так 20000грн.

Written by bunyk

Квітень 14, 2011 at 11:44

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

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. Тетраедралізація об’єкта що складений з вокселів.

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

Written by bunyk

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

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

Tagged with

Follow

Get every new post delivered to your Inbox.