Решил написать несколько функций для работы с векторными данными.
Пока что все функции находятся в файле, но в будущем думаю можно переделать его в библиотеку. Все функции написаны на asm. Перспективы могут быть очень большими, пока что есть 3 пробных примера:
1) рисование 3-х стрелок
2) рисование символа из 3-х контуров
3) рисуется самолет, который можно поворачивать курсорами (чем-то напоминает игры наподобие Rocket Forces)
Документации пока еще нет.
Функции рисования 2d графики (библиотеки vectors и buf2d)
-
- Attachments
-
-
vectors.7z (4.06 KiB)Downloaded 471 times
-
А может имеет смысл вызывать библиотеку с указателем на блок данных описывающих фигуру из отрезков (относительные кординаты, цвет и толщина), а также задавать масштаб для всего массива?
Плюс со временем количество примитивов можно расширить: треугольник, прямоугольник, круг. Хотя две последние фигуры можно рисовать при помощи треугольников.
Плюс со временем количество примитивов можно расширить: треугольник, прямоугольник, круг. Хотя две последние фигуры можно рисовать при помощи треугольников.
Все функции вынес в библиотеку, переделал 2 примера под нее. Написал небольшую документацию.
- Attachments
-
-
vectors.7z (6.19 KiB)
- 1-я версия библиотеки + 2 примера
Downloaded 471 times
-
Еще идея вдогонку - сделать готовые шаблоны. Например, пример со стрелками уже подходит для чертежей навроде AutoCAD.
Внести функцию рисующую стрелку внутрь библиотеки, или просто заготовить разные примеры но в виде файлов *.kex ?Mario wrote:идея вдогонку - сделать готовые шаблоны. Например, пример со стрелками
Кстати для стрелки можно сделать разной формы наконечники, допустим как в Word-е.
Возник еще вопрос: Как можно сделать что-бы через определенное время вызывалась какая-либо функция? На сколько я знаю таймера в Колибри нет. Хотел сделать более интересные примеры, но таймер не знаю как сделать.
А в libGUI есть програмные таймеры.Возник еще вопрос: Как можно сделать что-бы через определенное время вызывалась какая-либо функция? На сколько я знаю таймера в Колибри нет. Хотел сделать более интересные примеры, но таймер не знаю как сделать.
Их там можно ставить сколько угодно и на любые функции. Знаю, что обещал ещё в четверг выложить libGUI, но я сам не думал, что портирование libGUI в KolibriOS будет не таким лёгким. Надеюсь сегодня или завтра добить эту проблему и портировать библиотеку окончательно.
KolibriOS-перспективная ос!
Kolibri is best operation system in the world!
Kolibri is best operation system in the world!
В цикле обработки сообщений использовать не 10-ю функцию, а 23-ю, рассчитывая таймаут как время от текущего момента до следующего пробуждения.IgorA wrote:Возник еще вопрос: Как можно сделать что-бы через определенное время вызывалась какая-либо функция?
Не обязательно все в отдельные бинарники спихивать - можно в виде текстового или бинарного файла подгружать и сделать вьювер. Впоследствии облегчится использование, за счет уже готового набора шаблонов. Я, например, могу к zSea прикрутить подгрузку модуля для просмотра шаблонов.Внести функцию рисующую стрелку внутрь библиотеки, или просто заготовить разные примеры но в виде файлов *.kex ?
Часть кода из zSea, при желании использовать - лицензия BSD, т.е. позволяет делать все что угодно (в том числе закрыть исходный код), но упоминание авторства куска кода остается.Как можно сделать что-бы через определенное время вызывалась какая-либо функция?
Code: Select all
slide_show:
mcall 26,9
cmp [timer],eax
jbe .1
jmp .still
.red:
call draw_window
.still:
mcall 23,10
cmp eax,1 ; перерисовать окно ?
je .red
cmp eax,2 ; нажата клавиша ?
je .key ; если да - на key
cmp eax,3 ; нажата кнопка ?
je .button ; если да - на button
; mcall 68,1
jmp slide_show
;-------------------------------------------
.key:
mcall 2
..........
jmp .still
;-------------------------------------------
.button: ; button
mov eax,17 ; get id
mcall
cmp ah,1 ; button id=1 ?
je START.exit
.noclose:
cmp ah,2
je still
jmp slide_show
;-------------------------------------------
.1:
......... <- действия
mcall 26,9
add eax,[slide_show_delay] ;500
mov [timer],eax
jmp slide_show
Ну, только что приведённый код просыпается каждые 0.1 секунду, что во многих случаях заметно чаще, чем следовало бы (если таймауты большие, порядка секунд или больше), а в некоторых менее точное, чем могло бы (если сами таймауты типа 0.12 секунд). Вычисление таймаута, про которое я говорил в предыдущем посте, может выглядеть так:
kiv делает примерно так (разве что дополнительно учитывает, что для статических картинок пробуждаться вообще не нужно), но сам по себе код независим от kiv и может быть использован без всякой связи.
Code: Select all
...инициализация...
mcall 26, 9
mov [last_time], ebx
...ещё инициализация...
...цикл обработки сообщений...
still:
mcall 26, 9
mov ebx, [last_time]
add ebx, Delay
sub ebx, eax
cmp ebx, Delay
ja it_is_time_now
test ebx, ebx
jz it_is_time_now
push 23
pop eax
mcall
dec eax
js it_is_time_now
jz redraw
dec eax
jnz button
key:
...
it_is_time_now:
mcall 26, 9
mov [last_time], eax
...здесь идут действия, вызываемые каждые Delay сотых долей секунд...
jmp still
Ушёл к умным, знающим и культурным людям.
процедура называется slide_show (ИМХО из названия все понятно уже), zSea не использует ее при обычном просмотреразве что дополнительно учитывает, что для статических картинок пробуждаться вообще не нужно
сделал пример с таймером, библиотека не изменялась
- Attachments
-
-
samolot.7z (3.7 KiB)
- авиа симулятор ;)
Downloaded 439 times
-
Самолёт при движении по диагонали всё время меняет свою форму - это плохо. Но понятно, что это только начало, поэтому желаю удачи!
В данном случае это хорошо. Дело в том, что координаты центральной точки дробные числа по 4 байта (float). Вычисления координат точек тоже в дробных числах идут. А уже при выводе на экран они округляються до ближайших целых значений. Потому самолет и меняет форму, что округление может происходить каждый раз по разному.Атауальпа wrote:Самолёт при движении по диагонали всё время меняет свою форму - это плохо
Т. е. можно сделать округление координат центральной точки, и тогда самолет не будет менять форму при движении. Это не есть недостаток библиотеки или алгоритма программы
Немного обновил библиотеку и документацию. Добавил параметр для разбиения точек на отрезки (будет удобнее для программистов).
В архиве 3 примера, которые были и раньше:
1) со стрелками 2) с часами 3) с самолетом
В архиве 3 примера, которые были и раньше:
1) со стрелками 2) с часами 3) с самолетом
- Attachments
-
-
vectors_090603.7z (8.77 KiB)Downloaded 448 times
-
Добавил функции рисования кривых Безье.
Но правда есть один глюк, пока не удалось его найти. Если в одном контуре разные кривые (Безье и линейные) то программа вылетает. По отдельности работает нормально.
Но правда есть один глюк, пока не удалось его найти. Если в одном контуре разные кривые (Безье и линейные) то программа вылетает. По отдельности работает нормально.
Last edited by IgorA on Mon Sep 07, 2009 6:11 pm, edited 1 time in total.
Who is online
Users browsing this forum: No registered users and 6 guests