Archive for the ‘Графіка’ Category
Заклинання для сповільненої зйомки в Ubuntu/Debian
Звичайно вам потрібна ще веб-камера, і можливо якісь драйвери. На всяк випадок поставте Cheese – програмку для тестування веб-камери.
Інвентар:
sudo apt-get install cheese sudo apt-get install streamer sudo apt-get install mencoder
Сцена:
mkdir timelapse cd timelapse vim generate.py
Зйомка:
Прочитати решту цієї замітки »
Перетин променя й трикутника
Для тривимірного випадку.
Це досить часта задача в комп’ютерній графіці. Зокрема, визначити чи знаходиться точка всередині меша (якщо він замкнений), можна обчисливши кількість перетинів довільного променя що виходить з цієї точки з мешем. Якщо ця кількість непарна – точка всередині меша. Про обчислення зіткнень, та трасування променів взагалі мовчу.
Нам дано вектори – початок променя,
– його напрям,
– вершини трикутника.
– перетин променя й трикутника.

Прочитати решту цієї замітки »
Графіки та інша векторна графіка в будь-якій мові програмування
Спеціально для тих, кому терміново треба графік функції, і вони не хочуть встановлювати всякі важкі графічні бібліотеки, а тим більше їх вивчати. Зображення буде створюватись в файлі, тому якщо ваша мова вміє записувати в файли текст – то ви зможете створити в ній зображення. Хто вже знає що таке SVG – може далі не читати. Кому це справді треба – прошу критикувати. Я можу написати більше і зрозуміліше, якщо сильно попросите. Основне – задавайте питання.
На прикладі Python, але принцип такий же і в інших мовах (недавно я написав функцію на C, яка малювала гістограми. Теж влізла в один екран). Двовимірні графіки нудні, тому перейдемо одразу до трьох вимірів, і спробуємо намалювати параболоїд. Все одно вийде занадто просто.
Загалом, нам навіть не потрібна мова програмування. Для того, щоб намалювати зображення подібне до того що справа, нам досить створити текстовий файл picture.svg (чи з іншою_назвою.svg), і написати в ньому наступний текст:
Прочитати решту цієї замітки »
Маштабована векторна наочність
Єху! Я прорвався в анімації з SVG. Жаль тільки що wordpress, і вікіпедія не дозволяє тут їх викладати, бо вони такі інтерактивні, що й можуть містити шкідливий код. Тому клацніть на картинку.
Картинка пояснює як побудувати коло що проходить через дві точки, знаючи радіус. (Взагалі то пояснює слабо, але перспективу має). Крім того основною метою було – розібратись як створюють анімації в SVG за допомогою JavaScript. Поки що вмію малювати лише відрізки, еліпси та прямокутники.
А ще для SVG є офігенний редактор. svg-edit, який можна вбудувати прямо в веб-сторінку.
Хтось обов’язково мусить зверстати підручник з планіметрії на HTML5. Якби я був міністром освіти, то виділив б на це десь так 20000грн.
Броунівське дерево
Виглядає так:
Що воно таке – читайте на вікіпедії, а тут я розкажу як собі таке зробити.
В цьому прикладі, я випадковим чином ставив точку на коло з певним радіусом, і надавав їй випадкової початкової швидкості певного, конкретного модуля.
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. Але зразу навіть таку штуку важко написати, тому хотілось розбити проект на фази:
- Запуск OpenGL, реагування на події. (Є, бо те що вище працює).
- Написання гарненької камери і навігація по сцені.
- Додавання на сцену кубиків (вокселів).
- Визначення видимої для камери області, та області під курсором. Взаємодія з вокселями.
- Тетраедралізація об’єкта що складений з вокселів.
Вже три години, і я вже стомився. Але треба розібратись з камерою. Приклад вище взагалі плоский (ортогональна проекція).




