Ir ao conteúdo

Posts recomendados

Postado

C++: O que é Anti-aliased e para que serve?

Eu tenho outra função para desenhar uma  linha, mas, dependendo da rotação,  posso perder alguns pontos da linha.  Eu penso que não é perder,  mas pode ir para outro pixel que não é o correcto.  Será que fazer o Anti-aliased, é tentar corrigir esse erro? 

  • Obrigado 1
Postado

Essa não parece ser uma pergunta de programação e tampouco de C++. É sobre computação gráfica e você pode encontrar a resposta buscando pela palavra-chave processamento de sinais (signal processing).

Uma imagem aliased foi resterizada, ou seja, transformada da sua forma vetorial numa malha de pixels. Obviamente, os pixels na fronteira entre os vários objetos que formam a imagem mudam de cor de forma brusca. Por exemplo, numa foto de um céu ensolarado, os últimos pixels na borda das nuvens são brancos enquanto os pixels seguintes, do fundo, são azuis. Isso causa um efeito artificial de (escada) pixelamento. Uma imagem anti-aliased (AA) corrige esse problema determinando um valor médio da cor na fronteira entre objetos utilizando vários pixels ao redor (sampling). Assim, no caso da foto do céu ensolarado, e com AA, ao invés de um pixel branco seguido de um pixel azul, teríamos um pixel azul claro (parcialmente branco e azul).

Devido a minha ignorância no tema, eu seria incapaz de dar qualquer dica minimamente inteligente pra resolver o seu problema especificamente, muito embora pareça obvio que, sim, utilizando AA você vai conseguir linhas mais definidas. Caso esteja afiado no inglês, recomendo a fantástica aula abaixo sobre esse tema. Na verdade, não recomendo apenas a aula 22 mas toda a série de aulas do Cem Yuksel.

Intro to Graphics 22 - Signal Processing

  • Curtir 2
  • Amei 1
Postado

eis a minha função de http://members.chello.at/easyfilter/bresenham.html

struct point
{
    float x,y,z;
} ;

vector<point> GetLinePoints(point Origin, point Destination)
{
    vector<point> LinePoints;
    point LinePoint;
    int dx = abs(Destination.x-Origin.x), sx = Origin.x<Destination.x ? 1 : -1;
    int dy = abs(Destination.y-Origin.y), sy = Origin.y<Destination.y ? 1 : -1;
    int dz = abs(Destination.z-Origin.z), sz = Origin.z<Destination.z ? 1 : -1;
    int dm =std::max( { dx, dy, dz } ), i = dm; /* maximum difference */
    Destination.x = Destination.y = Destination.z = dm/2; /* error offset */

    do
    {
        Destination.x -= dx; if (Destination.x < 0) { Destination.x += dm; Origin.x += sx; }
        Destination.y -= dy; if (Destination.y < 0) { Destination.y += dm; Origin.y += sy; }
        Destination.z -= dz; if (Destination.z < 0) { Destination.z += dm; Origin.z += sz; }
        LinePoint.x=Origin.x;
        LinePoint.y=Origin.y;
        LinePoint.z=Origin.z;
        LinePoints.push_back(LinePoint);
        i--;
    }while(i >=0);
    return LinePoints;
}

eis o resultado: 
image.png.b9b467993856f6e4ff5a3b783c34201e.png

alguns pixels(sim era para ser vermelho) não são imprimidos ou tem coordenadas erradas 😞

  • Obrigado 1
Postado

A resolução da imagem é muito baixa então não consigo ver bem o problema. Ele ocorre na borda do retângulo ou no centro?

De qualquer maneira, como é uma imagem com apenas duas cores (vermelho e preto), e além do objeto vermelho possuir segmentos pontudos (intersecção dos dois lados do retângulo), a mim me parece completamente natural que você venha a observar pixelamento. Um AA certamente ajudaria mas, devido a pobreza da imagem (apenas duas cores), o máximo que vai conseguir é um efeito borrado na borda pra esconder o pixelamento. Não há muita mágica possível na média entre apenas duas coisas 😅.

  • Curtir 1
Postado

em toda a área:

image.png.db2de105c4aad5f877889c4043c7b4be.png

eu ainda não entendi como funciona os cálculos para calcular os pontos da recta... mas pode ser por isso mesmo que tenho esses pixels pretos dentro do vermelho e eu não sei como os testar 😞

  • Obrigado 1
Postado

Ah, são pixels pretos no meio da região vermelha. Não deve tratar-se de aliasing e tampouco anti-aliasing.

Se eles tivessem posições irregulares, e dependo do algoritmo que está a usar, tipo ray-tracing, talvez fosse um problema de noise/denoise. Tampouco parece ser o caso, dada a regularidade dos pontos pretos. Parece ser algo muito mais simples, precisamente na forma como você desenha a imagem.

Mais tarde darei uma olhadela no código.

  • Amei 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!