Archive for the ‘Графіка’ Category
Як збудувати геодезичний купол?
Я простий програміст, але іноді свербить побути архітектором. Всякий ентерпрайз проектувати ще не пускають, але тут випала нагода зпроектувати проект іграшкової хатинки для донечки. Тому що після покупки меблів в порожню квартиру в нас все ще залишається вільна кімната і в ній куууупа картону.
Я погуглив які можна робити хатинки і знайшов таке на instructables. Але там виміри подані все ще в імперській системі і я вирішив перерахувати. І взагалі зробити проект правильною водоспадною методологією – поетапно.
Прочитати решту цього запису »
Як намалювати стрілочку в SVG

Креслення стрілочки, з позначенням деяких змінних
Поточна ситуація така, що на запит “як намалювати стрілочку”, Google видає купу порад дівчатам про те як зашпаклювати лице. Але проблема трапляється часто, і не тільки в SVG, ось наприклад старий пост про те як малювати вектори в OpenGL, для програмки що проводить структурний аналіз кінематики машин і механізмів. Тому треба виправити цю ситуацію, і написати ще пару публікацій про малювання стрілочок. 🙂
Тут буде код який було весело писати, і яким варто поділитись. Присутній також JsFiddle. Код дозволяє малювати стрілочки наступного вигляду:
Написано з використанням D3.js, але код можна причепити де завгодно, так як головне тут – функція arrow_path
, яка генерує значення атрибуту d
для тега path
. Приймає вона координати початку і кінця стрілки, ширину лінії стрілки, радіус (задає розмір трикутника на кінці стрілки, і радіус gizmo (пімпочки на середині)). directed
– булевий аргумент, що вказує чи малювати стрілочку на кінці лінії взагалі. gizmo
– якщо false – пімпочки не буде, 'circle'
– буде коло, 'diamond'
– буде ромбик.
Прочитати решту цього запису »
Пишемо переглядач молекул з Pyglet
Я хотів створити серію уроків про графіку в OpenGL по слідах NeHe, але отримав іншу пропозицію, і пріоритети змінились. Ну й графіка в наш час людей не так цікавить. Але так як задачу я почав робити, просто витирати її з списку проектів буде не цікаво, краще опублікувати те що є і перенести в список закінчених проектів. Чим я зараз й займусь.
Ідея програми – намалювати атоми сферами різних кольорів і розмістити їх в різних місцях простору, таким чином отримавши молекулу. Для цього нам треба знати координати. Для цього ми використаємо Open Babel – хімічну експертну систему. Ось інструкції з інсталяції, apt-get install python-openbabel
якщо кому лінь їх читати.
Користуючись нею, ми можемо перетворити формулу SMILES, на список координат атомів:
Прочитати решту цього запису »
OpenGL в Python
Мене якось запитали про це, але без підготовки пояснити було важко, крім того мета була амбітна – намалювати молекулу, тому вийшло не так добре як би хотілось. Спробую написати короткий покроковий вступ в цю тему, який приблизно слідує послідовності в старих уроках Nehe (так, я чув що вони застаріли, але для нового OpenGL з шейдерами я якихось гарних послідовних уроків не бачив).
Інсталяція та перше вікно
Найперше що потрібно графічним програмам – вікно. Щоб створити вікно, нам треба якусь бібліотеку, наприклад PyQt, PySide, PyGtk, WxPython чи PyGame – їх купа. Потрібно також щоб це вікно підтримувало контекст OpenGL (тобто могло дозволити відеокарті виводити свої дані в область вікна). З цим може справитись багато бібліотек, але ми виберемо Pyglet. Тому що в ній мало зайвого, і вона ставиться традиційно:
pip install pyglet
Ну, і як годиться – почнемо з найпростішої програми:
import pyglet window = pyglet.window.Window(width=640, height=480, caption="Hello OpenGL!") pyglet.app.run()
Отримаємо вікно заданої ширини та висоти, і з заданим заголовком:
Елементарно, правда?
Фарби
Давайте ще зафарбуємо вікно в білий колір. Для цього потрібно знати що кольори задаються переважно інтенсивністю світла в моделі RGB (червоний, зелений, голубий), числами від 0 до 1. Тобто білий – це 1.0, 1.0, 1.0, сірий – 0.5, 0.5, 0.5, і т.п. Детальніше на вікіпедії.
import pyglet from pyglet.gl import * # імпортуємо всі функції OpenGL # вони починатимуться з префіксів gl або glu, тому простір імен надто не засмічуватимуть window = pyglet.window.Window(width=640, height=480, caption="Hello OpenGL!") # я не буду довго пояснювати що таке декоратор. Просто знайте, що # @window.event позначає функції що відповідають за обробку подій @window.event def on_draw(): # викликатиметься, коли операційна система вирішить що вікно треба перемалювати # наприклад, коли ми забрали вікно що було над нашим, або вперше виводимо його на екран glClearColor(1.0, 1.0, 1.0, 1.0) # Задати колір яким ми будемо очищати екран. # Четверте число - прозорість. # Я його сам не дуже розумію, але обов’язково треба чотири параметри. glClear(GL_COLOR_BUFFER_BIT) # очистити буфер кольору # (бувають і інші буфери, але про це пізніше) pyglet.app.run()
To be continued
В цьому уроці я хотів ще написати про те як намалювати трикутник, але часу мало (тобто є інші пріорітети). Зате ми створили вікно і навчились змінювати його колір. Ну й краще напевне писати менше але частіше. Якщо пілотний епізод цього курсу буде популярний – подумаю чи випускати перший сезон.
P.S. Май на увазі, якщо ти не хочеш навчити свою дівчину програмувати – вона може знайти когось хто схоче. 😛 Або взагалі сама з допомогою інтернету звикне вчитись.
D3: фіксація вузла в графі
Knowledge is power – it’s measured in WAT?!s (Rose Ames)
Я все мрію написати детективну історію на зразок “Шерлок Холмс і Бага Баскервілів”, але ніяк не підберу багу аби сюжет був достатньо гостросюжетним. Ось наприклад поділюсь знанням цікавої особливості D3.js при малюванні графів за допомогою фізичної симуляції. Наприклад ми хочемо деякі вузли графа розміщувати вручну.
Each node has the following attributes: …
fixed – a boolean indicating whether node position is locked.
Ок, тоді давайте при кліку по вузлі, показувати меню, в якому є галочка “фіксувати ноду”. В коді що показує меню пишемо:
pin_down.setChecked(data.fixed);
І чомусь, не залежно від того фіксований вузол, чи ні, галочка завжди стоїть:
Я почав логувати data.fixed
, виявилось що вона отримує значення то 6, то 7, то 3… Зовсім не булевські. Я думав вже що десь якийсь код думає що fixed
на вузлі графа означає щось інше.
Документація бреше. Виявилось що fixed
– не булева змінна.
Internally, the force layout uses three bits to control whether a node is fixed. The first bit can be set externally, as in this example. The second and third bits are set on mouseover and mousedown, respectively, so that nodes are fixed temporarily during dragging. Although the second and third bits are automatically cleared when dragging ends, the first bit stays true in this example, and thus nodes remain fixed after dragging. (Sticky Force Layout).
Ну що ж, давайте по масці виділяти перший біт:
pin_down.setChecked(data.fixed && 1);
Все одно завжди поставлена? Ааа, ну так, && – це логічна кон’юнкція, а не побітова. 6 && 1 – true. Нам треба побітову.
pin_down.setChecked(data.fixed & 1);
Resolve issue -> Fixed.
Тепер залишилось придумати як в такий детектив додати персонажів і саспенсу. 😀