Antialiasing.
От: Аноним  
Дата: 14.10.02 02:49
Оценка:
Нужен алгоритм antialiasing'a для примитивов, как например в corel draw или любом векторном редакторе. В инете нашел только для line, а как сделать например circle, spline или любой другой примитив? Please Help.
Re: Antialiasing.
От: McSeem2 США http://www.antigrain.com
Дата: 14.10.02 03:53
Оценка: 104 (6)
Здравствуйте Аноним, Вы писали:

А>Нужен алгоритм antialiasing'a для примитивов, как например в corel draw или любом векторном редакторе. В инете нашел только для line, а как сделать например circle, spline или любой другой примитив? Please Help.


Anti-Grain Geometry http://www.antigrain.com

Высококачественный рендерер векторной 2D графики. Идея, что называется, витает в воздухе. Требуется средство, позволяющее рисовать векторные примитивы с высоким качеством и достаточной скоростью. Лучшее из того, что я видел — это Macromedia Flash. За ней следуют разные SVG вьюверы:
http://www.w3.org/Graphics/SVG/Overview.htm8
самый продвинутый их которых — Adobe: http://www.adobe.com/svg/
Но увы, это все закрыто для творчества, я имею в виду как библиотеку для C/C++. Есть подобные библиотеки и для C/C++, но они либо стоят бешеных денег, либо полностью закрыты (что полный и безусловный мастдай), либо ограничены GPL-лицензией (для справки — лицензии GPL и LGPL не позволяют использовать код в коммерческих целях — и не надо говорить, что "нам пофиг" — это ОЧЕНЬ не пофиг). Лучшее из таких средств, известное мне — это библиотека LibArt:
http://www.levien.com/libart/
Но эта штука довольно ограничена и слегка глюкава. К тому же, тормозит весьма и выпущена как раз под LGPL. Есть еще аналогичная и довольно простая Zodius http://www.tinic.net/index.php?s=projects
Но она еще тормозней и еще менее функциональна.

Что я понимаю под "высоким качеством". Это субпиксельная точность и многоуровневый anti-aliasing. Мне кажется странным тот факт, что достигнут значительный прогресс в деле текстурирования с билинейной интерполяцией, в то время как границы полигонов остаются самыми позорными "лестницами". Все что достигнуто и доступно широкой публике это технология супер-самплинга, которая дает 4 или 16 уровней сглаживания при неимоверном увеличении вычислитеотных затрат. Посмотрите, к примеру, на сглаживание в OpenGL:
http://www.antigrain.com/img/opengl_aa.jpg
Ну это же просто смешно! Причем, это сделано на не самой хилой видеокарте GeForce3 Ti200!

Далее. Все уважающие себя векторные редакторы используют anti-aliasing. Но все они пользуются той же технологией. Для сравнения, приведу картинку:
http://www.antigrain.com/img/compare_to_xara.gif
И тот же самый алгоритм используется практичекси во всех продуктах Adobe и других монстров, в том числе и Macromedia Flash. Про Microsoft и говорить нечего:
http://www.antigrain.com/agg_comparison/agg_gdiplus.html
Там субпиксельной точностью даже и не пахнет.

Итак, я работаю над библиотекой, которая абсолютно и безусловно бесплатна, распространяется в исходниках и не имеет ограничений на использование. Написана на C++ и представляет собой не то чтобы законченный продукт, но так сказать "инструмент для создания других инструментов". В базовом варианте полностью переносима, причем, там нет ни одного #idef/#elif/#elif...#endif. То есть это действительно чистый и полностью стандартный C++, независимый ни от каких технологий и катаклизмов. Непосредственно ей пользоваться нелегко, но зато, она проста изнутри и абсолютно расширяема, то есть, дизайн подразумевает возможность добавления новых компонент без какой-либо модификации существующих файлов. Попробуйте, к примеру, вставить что-либо в середину существующей иерархии классов, не модифицируя исходников. AGG это позволяет.

Для начала готовые примеры для Windows:
http://www.antigrain.com/idea.zip
Сравните качество и скорость со стандартным Microsoft Direct Animation (ideaDA.html, работает только в IE). На каждом шаге фигура поворачивается на 0.5 градуса. Строго говоря, рисование в low quality в DA не является пределом скорости. Реально он рисует гораздо быстрей, но я просто не смог заставить фигуру вращаться вообще без задержек, к тому же нас вообще не интересует режим низкого качества. Но когда включаешь high quality в той же странице, вот тут-то все и выходит на чистую воду. Теперь idea.exe. Слайдер вверху регулирует скорость: крайнее левое положение — 0.0 градусов на каждый шаг, крайнее правое — 1.0. Если сместить его до упора влево, а затем нажать один раз стрелку вправо, то угол будет 0.005 градуса. Этот пример как раз и демонстрирует возможности субпиксельной точности в AGG.

http://www.antigrain.com/lion.zip
Популярный в SVG львенок. Фишка в том, что он рисуется поверх нарисованного, при этом можно регулировать прозрачность (alpha) слайдером слева внизу. Дальше просто press left button & drag. Правая кнопка его "искривляет".

http://www.antigrain.com/gamma_ctrl.zip
Хитрый контрол, управляющий гамма-коррекцией.
Обратите внимание, что при ресайзе все контролы тоже масштабируются. Впрочем, это лучше видно на следующем примере.

http://www.antigrain.com/gradients.zip
Цветовые градиенты. Ничего особенного, можно просто "попимпать" туда-сюда и поиграться. Но сначала, ничего не нажимая, кто скажет, какая модель освещения используется для рисования "шара"?
Вот целиком и полностью класс, необходимый для получения такого градиента:
Код:

class gradient_circle
{
public:
static int calculate(int x, int y, int)
{
return int(fast_sqrt(x*x + y*y));
}
};


http://www.antigrain.com/images1.zip
Это то, над чем я сейчас активно работаю — трансформация изображений.

http://www.antigrain.com/gouraud.zip
Цветовая интерполяция в треугольнике — закраска Гуро. Фишка в том, что треугольники тоже anti-aliased и пр этом необходимо избавиться от так называемого эффекта "bleeding" — то есть "просвечивания" на границах. А это не легко и универсального решения здесь не существует.

Что еще можно посмотреть:
http://www.antigrain.com/agg_docs/doc_pipelines.html
Конвейер преобразований.

http://www.antigrain.com/agg_docs/doc_tutorial.html
Начало описания (будет переделываться).

http://www.antigrain.com/agg_research/bezier_interpolation.html
Собственный метод интерполяции полигонов.

Примеры сделаны для win32, SDL http://www.libsdl.org и для X11. Для X11 работа еще не закончена, очень там муторно разбираться с XCreateImage()/XPutImage().

Сайт пока в запущенном состоянии и давно не обновлялся, поскольку я нахожусь в режиме глубокой отдадки. В какой-то степени я намеренно делаю вид, что все забросил, поскольку иначе — только и делаешь, что отввечаешь на письма, а работать некогда.

Все исходники доступны любому кто имеет CVS-клиента на http://sourceforge.net/cvs/?group_id=42020
Module name agg2. Почти каждый день я что-нибудь да обновляю. Ну тем у кого нету можно взять сегодняшний snapshot:
http://www.antigrain.com/agg2.zip

Документации пока нету, все в процессе. Но к Новому Году — точно сделаю.

Ну вот такие дела. Жду критики и отзывов.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[2]: Antialiasing.
От: Аноним  
Дата: 15.10.02 02:36
Оценка:
Здравствуйте McSeem2, Вы писали:

Огромный thanx за исходники, но к сожалению нет сил и времени в них разбираться. Не могли бы вы объяснить — в идеале у нас есть например точка с float x, float y координатами, которой мы можем нарисовать любой примитив — line, circles, splines or anything else. Как сделать ее antianliasing'овой?

MS>Здравствуйте Аноним, Вы писали:


А>>Нужен алгоритм antialiasing'a для примитивов, как например в corel draw или любом векторном редакторе. В инете нашел только для line, а как сделать например circle, spline или любой другой примитив? Please Help.


MS>Anti-Grain Geometry http://www.antigrain.com


MS>Высококачественный рендерер векторной 2D графики. Идея, что называется, витает в воздухе. Требуется средство, позволяющее рисовать векторные примитивы с высоким качеством и достаточной скоростью. Лучшее из того, что я видел — это Macromedia Flash. За ней следуют разные SVG вьюверы:

MS>http://www.w3.org/Graphics/SVG/Overview.htm8
MS>самый продвинутый их которых — Adobe: http://www.adobe.com/svg/
MS>Но увы, это все закрыто для творчества, я имею в виду как библиотеку для C/C++. Есть подобные библиотеки и для C/C++, но они либо стоят бешеных денег, либо полностью закрыты (что полный и безусловный мастдай), либо ограничены GPL-лицензией (для справки — лицензии GPL и LGPL не позволяют использовать код в коммерческих целях — и не надо говорить, что "нам пофиг" — это ОЧЕНЬ не пофиг). Лучшее из таких средств, известное мне — это библиотека LibArt:
MS>http://www.levien.com/libart/
MS>Но эта штука довольно ограничена и слегка глюкава. К тому же, тормозит весьма и выпущена как раз под LGPL. Есть еще аналогичная и довольно простая Zodius http://www.tinic.net/index.php?s=projects
MS>Но она еще тормозней и еще менее функциональна.

MS>Что я понимаю под "высоким качеством". Это субпиксельная точность и многоуровневый anti-aliasing. Мне кажется странным тот факт, что достигнут значительный прогресс в деле текстурирования с билинейной интерполяцией, в то время как границы полигонов остаются самыми позорными "лестницами". Все что достигнуто и доступно широкой публике это технология супер-самплинга, которая дает 4 или 16 уровней сглаживания при неимоверном увеличении вычислитеотных затрат. Посмотрите, к примеру, на сглаживание в OpenGL:

MS>http://www.antigrain.com/img/opengl_aa.jpg
MS>Ну это же просто смешно! Причем, это сделано на не самой хилой видеокарте GeForce3 Ti200!

MS>Далее. Все уважающие себя векторные редакторы используют anti-aliasing. Но все они пользуются той же технологией. Для сравнения, приведу картинку:

MS>http://www.antigrain.com/img/compare_to_xara.gif
MS>И тот же самый алгоритм используется практичекси во всех продуктах Adobe и других монстров, в том числе и Macromedia Flash. Про Microsoft и говорить нечего:
MS>http://www.antigrain.com/agg_comparison/agg_gdiplus.html
MS>Там субпиксельной точностью даже и не пахнет.

MS>Итак, я работаю над библиотекой, которая абсолютно и безусловно бесплатна, распространяется в исходниках и не имеет ограничений на использование. Написана на C++ и представляет собой не то чтобы законченный продукт, но так сказать "инструмент для создания других инструментов". В базовом варианте полностью переносима, причем, там нет ни одного #idef/#elif/#elif...#endif. То есть это действительно чистый и полностью стандартный C++, независимый ни от каких технологий и катаклизмов. Непосредственно ей пользоваться нелегко, но зато, она проста изнутри и абсолютно расширяема, то есть, дизайн подразумевает возможность добавления новых компонент без какой-либо модификации существующих файлов. Попробуйте, к примеру, вставить что-либо в середину существующей иерархии классов, не модифицируя исходников. AGG это позволяет.


MS>Для начала готовые примеры для Windows:

MS>http://www.antigrain.com/idea.zip
MS>Сравните качество и скорость со стандартным Microsoft Direct Animation (ideaDA.html, работает только в IE). На каждом шаге фигура поворачивается на 0.5 градуса. Строго говоря, рисование в low quality в DA не является пределом скорости. Реально он рисует гораздо быстрей, но я просто не смог заставить фигуру вращаться вообще без задержек, к тому же нас вообще не интересует режим низкого качества. Но когда включаешь high quality в той же странице, вот тут-то все и выходит на чистую воду. Теперь idea.exe. Слайдер вверху регулирует скорость: крайнее левое положение — 0.0 градусов на каждый шаг, крайнее правое — 1.0. Если сместить его до упора влево, а затем нажать один раз стрелку вправо, то угол будет 0.005 градуса. Этот пример как раз и демонстрирует возможности субпиксельной точности в AGG.

MS>http://www.antigrain.com/lion.zip

MS>Популярный в SVG львенок. Фишка в том, что он рисуется поверх нарисованного, при этом можно регулировать прозрачность (alpha) слайдером слева внизу. Дальше просто press left button & drag. Правая кнопка его "искривляет".

MS>http://www.antigrain.com/gamma_ctrl.zip

MS>Хитрый контрол, управляющий гамма-коррекцией.
MS>Обратите внимание, что при ресайзе все контролы тоже масштабируются. Впрочем, это лучше видно на следующем примере.

MS>http://www.antigrain.com/gradients.zip

MS>Цветовые градиенты. Ничего особенного, можно просто "попимпать" туда-сюда и поиграться. Но сначала, ничего не нажимая, кто скажет, какая модель освещения используется для рисования "шара"?
MS>Вот целиком и полностью класс, необходимый для получения такого градиента:
MS>Код:

MS> class gradient_circle

MS> {
MS> public:
MS> static int calculate(int x, int y, int)
MS> {
MS> return int(fast_sqrt(x*x + y*y));
MS> }
MS> };
MS>

MS>http://www.antigrain.com/images1.zip

MS>Это то, над чем я сейчас активно работаю — трансформация изображений.

MS>http://www.antigrain.com/gouraud.zip

MS>Цветовая интерполяция в треугольнике — закраска Гуро. Фишка в том, что треугольники тоже anti-aliased и пр этом необходимо избавиться от так называемого эффекта "bleeding" — то есть "просвечивания" на границах. А это не легко и универсального решения здесь не существует.

MS>Что еще можно посмотреть:

MS>http://www.antigrain.com/agg_docs/doc_pipelines.html
MS>Конвейер преобразований.

MS>http://www.antigrain.com/agg_docs/doc_tutorial.html

MS>Начало описания (будет переделываться).

MS>http://www.antigrain.com/agg_research/bezier_interpolation.html

MS>Собственный метод интерполяции полигонов.

MS>Примеры сделаны для win32, SDL http://www.libsdl.org и для X11. Для X11 работа еще не закончена, очень там муторно разбираться с XCreateImage()/XPutImage().


MS>Сайт пока в запущенном состоянии и давно не обновлялся, поскольку я нахожусь в режиме глубокой отдадки. В какой-то степени я намеренно делаю вид, что все забросил, поскольку иначе — только и делаешь, что отввечаешь на письма, а работать некогда.


MS>Все исходники доступны любому кто имеет CVS-клиента на http://sourceforge.net/cvs/?group_id=42020

MS>Module name agg2. Почти каждый день я что-нибудь да обновляю. Ну тем у кого нету можно взять сегодняшний snapshot:
MS>http://www.antigrain.com/agg2.zip

MS>Документации пока нету, все в процессе. Но к Новому Году — точно сделаю.


MS>Ну вот такие дела. Жду критики и отзывов.
Re[3]: Antialiasing.
От: McSeem2 США http://www.antigrain.com
Дата: 15.10.02 18:39
Оценка:
Здравствуйте Аноним, Вы писали:

А>Огромный thanx за исходники, но к сожалению нет сил и времени в них разбираться. Не могли бы вы объяснить — в идеале у нас есть например точка с float x, float y координатами, которой мы можем нарисовать любой примитив — line, circles, splines or anything else. Как сделать ее antianliasing'овой?


Нет ничего проще. Вычисляешь площадь части пиксела (в общем случае, площадь трапеции, в частном — площадь прямогугольного треугольника), занятую телом фигуры. Прзрачность пиксела устанавливаешь пропорционально этой площади. Точнее, не совсем пропорционально — как правило, требуется еще и гамма-коррекция. Одной точки здесь не достаточно — надо знать вектор, а так же, по какую сторону от него находится тело фигуры. Далее. Через один пиксел может проходить сколько угодно границ. Что делать в этом случае? Вершины полигонов тоже надо обработать корректно — там надо в общем случае вычислять площадь пяти- или шестиугольника, причем невыпуклого. Алгоритм, который я использую, отрабатывался в течение полугода совместно с автором FreeType (David Turner, http://www.freetype.org). Apple, Adobe и прочие монстры над этим вообще годами работают. Если нет сил и времени разбираться, но есть силы сочинить нечто подобное с нуля, то я снимаю шляпу
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[4]: Antialiasing.
От: Аноним  
Дата: 16.10.02 02:10
Оценка:
Здравствуйте McSeem2, Вы писали:

Где это можно посмотреть в наглядном виде C++ или любого другого языка (именно antialiased pixel)? У меня была идея все рисовать маленькими 1-2 pix wide antialiasing'овыми линиями — окружности, сплайны, вообщем любой примитив,
вроде должно получиться.

MS>Нет ничего проще. Вычисляешь площадь части пиксела (в общем случае, площадь трапеции, в частном — площадь прямогугольного треугольника), занятую телом фигуры. Прзрачность пиксела устанавливаешь пропорционально этой площади. Точнее, не совсем пропорционально — как правило, требуется еще и гамма-коррекция. Одной точки здесь не достаточно — надо знать вектор, а так же, по какую сторону от него находится тело фигуры. Далее. Через один пиксел может проходить сколько угодно границ. Что делать в этом случае? Вершины полигонов тоже надо обработать корректно — там надо в общем случае вычислять площадь пяти- или шестиугольника, причем невыпуклого. Алгоритм, который я использую, отрабатывался в течение полугода совместно с автором FreeType (David Turner, http://www.freetype.org). Apple, Adobe и прочие монстры над этим вообще годами работают. Если нет сил и времени разбираться, но есть силы сочинить нечто подобное с нуля, то я снимаю шляпу
Re[5]: Antialiasing.
От: McSeem2 США http://www.antigrain.com
Дата: 16.10.02 17:51
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте McSeem2, Вы писали:


А>Где это можно посмотреть в наглядном виде C++ или любого другого языка (именно antialiased pixel)? У меня была идея все рисовать маленькими 1-2 pix wide antialiasing'овыми линиями — окружности, сплайны, вообщем любой примитив,


Так уже даны были все ссылки. Еще раз: http://www.freetype.org
http://www.antigrain.com/agg2.zip
Можно еще http://www.artofcode.com/libart.html

В "наглядном виде" не получится — непросто это. Единственный способ — это таращиться в тексты до боли в носу.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[2]: Antialiasing.
От: Аноним  
Дата: 19.09.06 05:53
Оценка:
Здравствуйте, McSeem2, Вы писали:


MS>для справки — лицензии GPL и LGPL не позволяют использовать код в коммерческих целях — и не надо говорить, что "нам пофиг" — это ОЧЕНЬ не пофиг.

LGPL — позволяет использовать код в коммерческих целях. Большинство библиотек нынче под LGPL.
Re: Antialiasing.
От: Аноним  
Дата: 19.09.06 08:00
Оценка:
Возможно, проще воспользоваться готовым решением.. Ключевое слово: GDI+.
Re[2]: Antialiasing.
От: Аноним  
Дата: 19.09.06 09:28
Оценка:
Привет!
Слушай, я посмотрел на либу и демки, честно был в ступоре минут 10. Офигенная!
Хотел спроисть тебя. Как можно использовать её в комерческих притложениях?
Будет ли компилится она под MacOS X?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.