Функции рисования 2d графики (библиотеки vectors и buf2d)

Discussing libraries simplifying applications development
  • А может имеет смысл вызывать библиотеку с указателем на блок данных описывающих фигуру из отрезков (относительные кординаты, цвет и толщина), а также задавать масштаб для всего массива?
    Плюс со временем количество примитивов можно расширить: треугольник, прямоугольник, круг. Хотя две последние фигуры можно рисовать при помощи треугольников.
  • Все функции вынес в библиотеку, переделал 2 примера под нее. Написал небольшую документацию.
    Attachments
    vectors.7z (6.19 KiB)
    1-я версия библиотеки + 2 примера
    Downloaded 469 times
  • Еще идея вдогонку - сделать готовые шаблоны. Например, пример со стрелками уже подходит для чертежей навроде AutoCAD.
  • Mario wrote:идея вдогонку - сделать готовые шаблоны. Например, пример со стрелками
    Внести функцию рисующую стрелку внутрь библиотеки, или просто заготовить разные примеры но в виде файлов *.kex ?
    Кстати для стрелки можно сделать разной формы наконечники, допустим как в Word-е.

    Возник еще вопрос: Как можно сделать что-бы через определенное время вызывалась какая-либо функция? На сколько я знаю таймера в Колибри нет. Хотел сделать более интересные примеры, но таймер не знаю как сделать.
  • Возник еще вопрос: Как можно сделать что-бы через определенное время вызывалась какая-либо функция? На сколько я знаю таймера в Колибри нет. Хотел сделать более интересные примеры, но таймер не знаю как сделать.
    А в libGUI есть програмные таймеры. :mrgreen:
    Их там можно ставить сколько угодно и на любые функции. Знаю, что обещал ещё в четверг выложить libGUI, но я сам не думал, что портирование libGUI в KolibriOS будет не таким лёгким. Надеюсь сегодня или завтра добить эту проблему и портировать библиотеку окончательно.
    KolibriOS-перспективная ос!
    Kolibri is best operation system in the world!
  • IgorA wrote:Возник еще вопрос: Как можно сделать что-бы через определенное время вызывалась какая-либо функция?
    В цикле обработки сообщений использовать не 10-ю функцию, а 23-ю, рассчитывая таймаут как время от текущего момента до следующего пробуждения.
  • Внести функцию рисующую стрелку внутрь библиотеки, или просто заготовить разные примеры но в виде файлов *.kex ?
    Не обязательно все в отдельные бинарники спихивать - можно в виде текстового или бинарного файла подгружать и сделать вьювер. Впоследствии облегчится использование, за счет уже готового набора шаблонов. Я, например, могу к zSea прикрутить подгрузку модуля для просмотра шаблонов.
    Как можно сделать что-бы через определенное время вызывалась какая-либо функция?
    Часть кода из 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 секунд). Вычисление таймаута, про которое я говорил в предыдущем посте, может выглядеть так:

    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
    
    kiv делает примерно так (разве что дополнительно учитывает, что для статических картинок пробуждаться вообще не нужно), но сам по себе код независим от kiv и может быть использован без всякой связи.
    Ушёл к умным, знающим и культурным людям.
  • разве что дополнительно учитывает, что для статических картинок пробуждаться вообще не нужно
    процедура называется slide_show (ИМХО из названия все понятно уже), zSea не использует ее при обычном просмотре
  • сделал пример с таймером, библиотека не изменялась
    Attachments
    samolot.7z (3.7 KiB)
    авиа симулятор ;)
    Downloaded 436 times
  • Самолёт при движении по диагонали всё время меняет свою форму - это плохо. Но понятно, что это только начало, поэтому желаю удачи!
  • Атауальпа wrote:Самолёт при движении по диагонали всё время меняет свою форму - это плохо
    В данном случае это хорошо. Дело в том, что координаты центральной точки дробные числа по 4 байта (float). Вычисления координат точек тоже в дробных числах идут. А уже при выводе на экран они округляються до ближайших целых значений. Потому самолет и меняет форму, что округление может происходить каждый раз по разному.
    Т. е. можно сделать округление координат центральной точки, и тогда самолет не будет менять форму при движении. Это не есть недостаток библиотеки или алгоритма программы :wink:
  • Немного обновил библиотеку и документацию. Добавил параметр для разбиения точек на отрезки (будет удобнее для программистов).
    В архиве 3 примера, которые были и раньше:
    1) со стрелками 2) с часами 3) с самолетом
    Attachments
    Downloaded 445 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 3 guests