формат векторной графики

Applications development, KoOS API questions
  • Gluk wrote:И остается вопрос с нечетным пикселом толщины
    Если рисовать сглаженные линии, то такой вопрос решится за счет плавного перехода цвета границы и фона. Вообще это вопрос округления.
  • Во вногих векторных редакторах у обводок есть также следующие характеристики:
    Расположение на переднем/заднем плане - т.е. если у объекта есть заливка, то обводка может быть нарисована как поверх, так и позади неё (в половину своей толщины).
    Вид окончания разомкнутых линий - квадратный (окончание линии рисуется ещё на половину толщины обводки), круглый, усечённый квадратный (линия рисуется только в стороны от своей оси не продолжаясь вперёд).
    Вид углов/изломов - прямые, усечённые, закруглённые. С этой характеристикой связан параметр предела угла (miter limit) т.е. все углы острее заданного рисуются усечёнными.
    Форма кисти обводки - квадрат, круг, сплющенные варианты квадратов и кругов (с заданием коэфф. сжатия и угла наклона)
    ---
    В будущем можно подумать о переменной толщине, переменном цвете обводки, концевых стрелках и т.д. и т.п.
  • IgorA: "Вообще это вопрос округления." - мне кажется что стандарт не должен позволять отображать рисунок как захочется просмотрщику (в зависимости от выбора способа округления), поэтому такие вещи должны быть оговорены хотя бы уж в виде рекомендаций
    "Если рисовать сглаженные линии, то такой вопрос решится за счет плавного перехода цвета границы и фона." - не представляю как он решится, например, в случае неповернутого прямоугольника с границей в один пиксел. Налицо неоднозначность размеров прямоугольника (для каждой стороны плюс-минус пиксел)

    lev, угу. у нас и более того, как окончанием линии, так и кистью может быть любой графический объект. Ну я об этом еще не писал сюда, но оно так и запланировано.

    А вот переменной толщины я не встречал в редакторах (в Inkscape), можно подробней? Стало интересно, как это можно реализовать, кроме как с помощью задания толщины в каждой точке (ну пусть даже с функциональными зависимостями) линии или площади
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • Переменная толщина - может быть просто кистью растягивающей свою форму на всю длину линии с отслеживанием направления, например капля, треугольник (один конец узкий, второй широкий), песочные часы (сужение посерёдке) и т.п.
    В одной из кистей CorelDRAW предназначенной для работы с планшетом отслеживается сила нажатия пера (для мыши можно имитировать нажатием стрелок вверх-вниз) при рисовании. Т.е. для линии сохраняется величина кисти в разных местах её протяжённости.
    Кажется Knuth в своих работах рассматривал подобные линии, запоминая переменные сечения линии по её пути.
    Ещё забыл упомянуть используемые во многих пакетах двойные-тройные-волнистые и т.п. линии, штрих-пунктиры.
    Можно подумать и о всяческих pattern кистях.
  • Gluk wrote:В SVG используется первый вариант
    В SWF тоже. Правда там нет понятия квадрат, есть только линия и кривая Безье по трём точкам, из них уже делаются и прямоугольники, и круги, и всё остальное.
  • небольшой оффтоп:
    konstantin_666: "Тем более, что я уже практически завершил работу над XML-парсером. На данный момент есть уже 5 тыс. строк на ассемблере. Осталось только тщательно всё отладить и оптимизировать." - как успехи?
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • собрал основное о формате с темы и поместил в файл, коий приложил к первому посту темы. Там нет примеров битфилдов с атрибутами, и мне хотелось бы знать, нужны они или и так все понятно. Если нужны - то для каких именно пунктов.

    Описания объектов будут позже, если хотите - можете помочь мне с ними)
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • ну, во-первых, среди объектов должны быть графические примитивы (простейшие фигуры, не могущие менять форму кроме как размерами (т.е. всякие звезды и спирали это другая категория)).

    имеющие площадь:
    -Прямоугольник (квадрат) [в т.ч. с закругленными углами]
    -Эллипс (круг) [в т.ч. их сектора]

    контурные:
    -Прямая (точка)
    -Кривая Безье (?)
    -Дуга (?)

    (в скобках указаны частные случаи объектов, получаемые убиранием некоторых параметров. Просто, чтобы знать что эти объекты не надо отдельными тэгами реализовывать.)

    из контурных объектов составляются все остальные неконтурные (мм.. площадные? при этом можно указать толщину и цвет только у первого объекта, тогда они скопируются на все остальные, но в общем случае толщины не обязательно одинаковы)

    помогайте, чего, может быть, не хватает?
    пока остановимся только на графических (рисуемых) объектах, и пока что только на примитивах
  • SWF изменил моё представление о двумерной графике, так что я могу сказать только ладно эллипс, ладно прямоугольник, но дуга-то зачем если предполагается наличие кривой Безье?
  • Asper, неужели кривая Безье рисуется проще чем дуга? тем более что код рисования дуги фактически и так будет иметься в парсере (для секторов)
    Если проще, то исправим)
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • Для построения дуги нужны тригонометрические функции.

    Code: Select all

    x = R * cos(A) + X
    y = R * sin(A) + Y
    или с арктангенсом.
    Ну или придумай как модифицировать алгоритм Брезенхема для построения дуги. Если придумаешь новый алгоритм, не забудь запатентовать. :)

    Для алгоритма кривой Безье тригонометрия не нужна.
    Код из исходников Buf2D.

    Code: Select all

    ;float t, xt,yt;
    ;for(t=.0;t<1.;t+=.005){
    ;  xt=pow(1.-t,2)*x0+2*t*(1.-t)*x1+pow(t,2)*x2;
    ;  yt=pow(1.-t,2)*y0+2*t*(1.-t)*y1+pow(t,2)*y2;
    ;  dc.SetPixel(xt,yt,255L);
    ;}
  • Asper, что значат эти переменные и операция точкаминус?
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • попробую ответить за Asper (могу в чём-то ошибаться)...
    точка относится к "1" и означает вещественную единицу (в цикле ещё используется .0 и .005). pow - возведение в степень (в данном случае выражения 1-t в квадрат). и если я правильно понимаю, ввод переменных xt и yt исходит из полярных координат...
  • спасибо за ответ)

    насчет точки теперь понял. Просто привык что в php это объединение строк, и $smth.(-$num) при $smth=5, $num=8, вроде как там дает в результате строку "5-8" (могу ошибаться, не проверял именно с отрицательными числами)

    pow() знаю

    про координаты по прежнему не понял..
    можно подробно, что есть y0, y1, y2, yt, x0, x1, x2, xt?
    сойдет ссылка на описание алгоритма (гуглил, именно такого не нашел)
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • Who is online

    Users browsing this forum: No registered users and 28 guests