Оглавление

Вступление

Документация к свободной библиотеке vectors.asm, для ОС Колибри.

Последнее обновление библиотеки 17.09.09.

Вопросы и предложения на форум сюда.

Функции

vect_line

Рисует линию на экране.

; [esp+8] = p0
; [esp+12] = p1
; [esp+16] = color

vect_conv_cont

Преобразует координаты заданного контура из декартовой системы координат в полярную.

; [esp+8] = contur

vect_draw_cont

Рисует фигуры с учетом заданной центральной точки и угла поворота

; [esp+8] = x0,y0,a0,...
; [esp+12] = contur
; [esp+16] = color

vect_opred2i

Определяет длину и угол поворота вектора по двум координатам

; ebp+8  = adress int coord x
; ebp+10 = adress int coord y

vect_line_len4i

Вычисляет длину отрезка (расстояние между 2-мя точками)

vect_c_bezier

Рисует кривую Безье по 3-м точкам

vect_draw_text

Вывод векторного шрифта в своем формате.

Пример:

  push dword txt      ;указатель на текстовую строку
  push dword arr0c    ;указатель на цвет, точку вывода
  push dword my_font  ;указатель на данные векторного шрифта
  call [vect_draw_text]
...
txt db 'ABCDEF-',13,'abcdef-012345',0
arr0c:
  dd 0xff
  .x dd 50.0
  .y dd 50.0
  .a dd 0.261799 ;angle
  .s dw 35 ;высота шрифта в пикселях

Переменные

vect_o_len dd ?

Длинна вектора, которая вычисляется функцией vect_opred2i или vect_line_len4i

vect_o_ang dd ?

Угол порота вектора в радианах, вычисляется функцией vect_opred2i

Как использовать библиотеку

1. Подключаем библиотеку как и остальные библиотеки в Колибри. Пример таблицы экспорта:

align 4
vectors_lib_import:
  vect_line dd av_line
  vect_c_bezier dd av_c_bezier
  vect_conv_cont dd av_conv_cont
  vect_draw_cont dd av_draw_cont
  vect_opred2i dd av_opred2i
  vect_line_len4i dd av_line_len4i
  vect_draw_text dd av_draw_text
  vect_o_len dd av_o_len
  vect_o_ang dd av_o_ang
  dd 0,0
  av_line db 'vect_line',0
  av_c_bezier db 'vect_c_bezier',0
  av_conv_cont db 'vect_conv_cont',0
  av_draw_cont db 'vect_draw_cont',0
  av_opred2i db 'vect_opred2i',0
  av_line_len4i db 'vect_line_len4i',0
  av_draw_text db 'vect_draw_text',0
  av_o_len db 'vect_o_len',0
  av_o_ang db 'vect_o_ang',0

2. Подключаем файл vectors.inc.

include 'vectors.inc' ;vectors functions constant

3. Задаем параметры центральной точки (имя может быть любое):

sam:
  .x dd 180.0
  .y dd 100.0
  .a dd 0.0 ;angle
  .s dd 1.0 ;scale

4. Задаем число точек в каждом контуре и координаты точек (имя контура любое).

cont:
  dw 21
  dd -12.0,-2.0, -10.0,-2.0, -9.5,-4.0, -8.5,-4.0, -7.0,-2.0, -6.0,-2.0, -5.0,-7.0, -3.0,-7.0, 1.0,-2.0, 3.0,-2.0
  dd 5.0,0.0, 3.0,2.0, 1.0,2.0, -3.0,7.0, -5.0,7.0, -6.0,2.0, -7.0,2.0, -8.5,4.0, -9.5,4.0, -10.0,2.0, -12.0,2.0
  dw 2
  dd 5.0,0.0, 8.0,0.0
  dw 2
  dd -10.0,-2.0, -10.0,2.0
  dw 2+VECT_PARAM_COLOR
  dd 0x0080d0
  dd 0.0,0.0, 2.0,0.0
  dw 0

5. Если координаты точек в контуре заданы не полярной системе координат, то вызываем функцию для их преобразования:

push dword cont
call [vect_conv_cont]

В новых версиях библиотеки эту функцию можно не вызывать, сама вызвется. Если координаты точки заданы в полярной системе координат, они должны быть обозначены константой VECT_POINTS_IS_POLAR, иначе при вызове пропрсовки будет произведено преобразование, которое испортит координаты.

6. Рисуем наши фигуры:

push dword 0xff ;первоначальный цвет
push dword cont      ;координаты контуров (фигура)
push dword sam       ;параметры начальной точки
call [vect_draw_cont]

7. При необходимости коректируем параметры начальной точки и делаем новые перерисовки

Константы

VECT_PARAM_COLOR

Позволяет задавать цвет линий в контуре. На входе функция vect_draw_cont принимает цвет, но этот цвет можно менять и внутри описания контура, для этого используется эта контстанта. Она дабавляеться к числу точек контура (можно добавить через or или +), а потом дальше добавляется цвет (4 байта) и уже потом идут координаты точек:

...
  dw 2+VECT_PARAM_COLOR ;2 координаты + использовать новый цвет
  dd 0x0080d0 ;цвет (без VECT_PARAM_COLOR эта строка пропускается)
  dd 0.0,0.0, 2.0,0.0 ;координаты
...

VECT_PARAM_PROP_L

Позволяет разбивать контур на заданное количество точек.

cif_tbl:
  dw 8+VECT_PARAM_PROP_L ;8 координат + разбивать контур
  dd 0x0002 ;количество точек для разбиения (без VECT_PARAM_PROP_L эта строка пропускается)
  dd 0.0,80.0, 0.0,100.0, 80.0,0.0, 100.0,0.0 ;координаты
  dd 0.0,-80.0, 0.0,-100.0, -80.0,0.0, -100.0,0.0
  dw 0 ;0 точек - конец контуров для рисования

В даном примере рисуются 4 отрезка по 2 точки (8=4*2). Без параметра VECT_PARAM_PROP_L будет нарисована ломанная линия заданная 8-ми точками. Без данного параметра эти 4 отрезка можно задать и так:

cif_tbl:
  dw 2
  dd 0.0,80.0, 0.0,100.0
  dw 2
  dd 80.0,0.0, 100.0,0.0
  dw 2
  dd 0.0,-80.0, 0.0,-100.0
  dw 2
  dd -80.0,0.0, -100.0,0.0
  dw 0

Колличество точек для разбиения может быть в пределах от 0 до 255. (0 - не разбивать контур, 1 - рисовать только точки (причем последняя не нарисуется), 2 и больше работают нормально).

VECT_CONT_LINE

Рисование прямолинейного контура. (По умолчанию контур и так прямолинейный)

VECT_CONT_BEZIER

Указывает, что-бы контур рисовался через кривые Безье.

История

01.09.09 - самая первая версия библиотеки. 2 примера использ.

03.09.09 - добавлен параметр, позволяющий разбивать контур на заданное количество точек. 3 примера использ.

15.09.09 - добавлены 3 функции: кривая Безье, измерение расстояния между 2-мя точкими, вывод векторного шрифта (формат шрифта свой, не стандартный). Добавлено масштабирование контуров.

17.09.09 - вызов функции vect_conv_cont делается перед прорисовкой контуров автоматически. Изменено задание размера текста, и сама функция вывода текста доработана.

19.09.09 - небольшие доработки функций.

28.09.09 - доработаны функции рисующие линии и кривые (если задать координаты меньше 0, то рисование не происходит, раньше с такими координатами зависало).