растеризовать полигон с антиалиазингом
От: linux_fan  
Дата: 25.10.09 09:34
Оценка:
Здравствуйте аткой вопрос, хочу понять как можно растеризовать полигон с антиалиазингом
Заполнить полигон проблем особых не вижу, сам антиалиазинг я так понимаю нужен только при рисовании границ полигона, то есть при растеризации ребер.
По сути ребро представляет собой прямую, и соответственно прозрачность пикселя прямо пропорционально той площади, которую он занимает в многоугольнике.
Мне кажется грубый метод наверное выглядит, так, что есть ребро (x1. y1) и (x2. y2) x1 < x2, y1 < y2 и для простоты ребро лежит в первом октанте ось У — направлена в верх,
Его можно представить прямой y = k * x + b,
где k = y2 – y1 / x2 – x1, b = y1 – k * x1;



Допустим я иду по Брезенхему и в каждом получившемся пикселе считаю его площадь, лежащею справа от прямой, в результате пересечения пикселя и прямой получиться трапеция, либо треугольник



То есть, к примеру, Брезенхем выдал координаты Xi, Yi,

То пересечение ребра с осью Yi , будет равно
Xo = (Yi – b) / k. если Xo получается больше Xi + 1, то у нас площадь равна площади треугольника, с катетами k1 = k (Xi + 1) + b, и k2 = ((Yi – 1) – b) / k, иначе площадь ограничивается трапецией с высотой равной высоте пикселя и основаниями Xo и k2 = ((Yi – 1) – b) / k.
И так в принципе можно исходя из площади задавать прозрачность пикселю, для того что бы работать с целочисленными координатами увеличить размер пикселя к примеру в 256 раз. Для последующего вычисления площади использовать сохраненные ранее значения пересечений с Xi и Yi.
Но вот вопрос в Брезенхеме уже есть вычисление ошибки можно ли как то ее попытаться использовать для оценке величины прозрачности пикселя.


    void line(int x1, int y1, int x2, int y2) 
    {
           int dx = abs(x2 - x1);
        int dy = abs(y2 - y1);

            int sx = x2 >= x1 ? 1 : -1;
            int sy = y2 >= y1 ? 1 : -1;
            if(dy <= dx)
            {
                int derr = (dy << 1) - dx;
                int dS = dy << 1;
                int  dD = (dy - dx) << 1;
                m_ren->blend_pixel(x1, y1, m_line_color);
                for (int x = x1 + sx, y = y1, i = 1; i <= dx; i++, x += sx)
                {

                    if(derr > 0)
                    {
                        derr += dD;
                        y += sy;
                    }
                    else 
                    {
                        derr += dS;
                    }
                    m_ren->blend_pixel(x, y, m_line_color, cover_full);
                }


            }
            else 
            {
                int derr = (dx << 1) - dy;
                int dS = dx << 1;
                int  dD = (dx - dy) << 1;
                m_ren->blend_pixel(x1, y1, m_line_color, cover_full);
                
                for (int x = x1 , y = y1 + sy, i = 1; i < dy; ++i, y += sy)
                {
                            if (derr > 0)
                    {

                        derr += dD;
                        x += sx;
                    }
                    else
                    {
                        derr += dS;
                    }
                 
                  m_ren->blend_pixel(x, y, m_line_color, cover_full);
                     }
            }
        }


Хотелось бы использовать derr, без дополнительного вычисления площадей.
Re: растеризовать полигон с антиалиазингом
От: WolfHound  
Дата: 25.10.09 17:16
Оценка:
Здравствуйте, linux_fan, Вы писали:

Все украдено до нас: http://www.antigrain.com/
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: растеризовать полигон с антиалиазингом
От: Тролль-323  
Дата: 25.10.09 17:49
Оценка:
WH>Все украдено до нас: http://www.antigrain.com/

Извините, но задолбали своим AGG. Человек вас спрашивает про алгоритм.

AGG — это, видать, такая икона сиплюсплюсника, обычно висит рядом с иконой святого Буста.
Re: растеризовать полигон с антиалиазингом
От: korzhik Россия  
Дата: 26.10.09 12:16
Оценка:
Здравствуйте, linux_fan, Вы писали:

_>Здравствуйте аткой вопрос, хочу понять как можно растеризовать полигон с антиалиазингом


вот здесь есть описание алгоритма с картинками, который используется в AGG
а вот здесь
Автор: McSeem2
Дата: 30.03.05
уже другое описание, без картинок, но более подробное.
Re[2]: растеризовать полигон с антиалиазингом
От: SL555 Россия  
Дата: 26.10.09 16:10
Оценка:
Здравствуйте, korzhik, Вы писали:

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


_>>Здравствуйте аткой вопрос, хочу понять как можно растеризовать полигон с антиалиазингом


K>вот здесь есть описание алгоритма с картинками, который используется в AGG

K>а вот здесь
Автор: McSeem2
Дата: 30.03.05
уже другое описание, без картинок, но более подробное.


Не могу понять по какому принципу тут вычисляется площадь :
Re[3]: растеризовать полигон с антиалиазингом
От: korzhik Россия  
Дата: 26.10.09 16:31
Оценка:
Здравствуйте, SL555, Вы писали:

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


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


_>>>Здравствуйте аткой вопрос, хочу понять как можно растеризовать полигон с антиалиазингом


K>>вот здесь есть описание алгоритма с картинками, который используется в AGG

K>>а вот здесь
Автор: McSeem2
Дата: 30.03.05
уже другое описание, без картинок, но более подробное.


SL>Не могу понять по какому принципу тут вычисляется площадь :

SL>

area вычисляется как удвоенная (в целях оптимизации) площадь трапеции, образованной сегментом линии, проходящей через пиксель, и левым краем пикселя.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.