Desenho de linha rápido antialias


11

O algoritmo de linha de Bresenham é uma maneira de desenhar linhas retas usando apenas operações inteiras rápidas (adição, subtração e multiplicação por 2). No entanto, gera linhas com alias. Existe uma maneira igualmente rápida de desenhar linhas antialias?


1
Algumas perguntas ... você está fazendo a lógica do desenho na CPU ou GPU? Além disso, você está procurando algoritmos baseados em números inteiros ou ponto flutuante?
Alan Wolfe

5
@AlanWolfe, algoritmos de número inteiro na CPU - o mesmo ambiente para o qual o algoritmo de Bresenham foi projetado.
Mark

3
en.wikipedia.org/wiki/Xiaolin_Wu%27s_line_algorithm é o clássico, embora a página da wikipedia esteja meio cozida e eu não tenha acesso ao jornal. Parece uma pergunta preguiçosa, já que é muito fácil encontrar isso pesquisando alguns artigos básicos.
yuriks 12/08/2015

2
Pensando bem alto, acho que deve ser fácil adaptar Bresenham para desenhar linhas com vários pixels de espessura. Em seguida, você pode executar o antialiasing calculando a distância de cada centro de pixel da linha matemática ideal e aplicando alguma função de falloff.
Nathan Reed

2
Não posso marcar um comentário como correto, no entanto.
Mark

Respostas:


9

Existe uma maneira igualmente rápida de desenhar linhas antialias?

Não, porque, por definição, uma linha anti-serrilhada toca mais pixels. Tais algoritmos serão mais lentos.


Em um rasterizador de software, a maneira onipresente de desenhar linhas sem serrilhado é o algoritmo de linha de Xiaolin Wu . Não é difícil de implementar e, de qualquer forma, há um pseudocódigo de alta qualidade incomum nesse link.

Em um pipe de varredura de hardware, a primitiva de linha é expandida para um quadrilátero no espaço da tela pelo sombreador de geometria padrão (ou fornecido pelo usuário) e, em seguida, desenhado como dois triângulos, que podem ser suavizados no modo usual.

Em um raytracer, há uma variedade de opções. Vale a pena pensar em como você realmente deseja desenhar um objeto 1D. Talvez como um cilindro (woo sombras!). Observe que isso introduz questões de perspectiva / escoramento, que podem (ou não) ser o que você deseja. Não há uma generalização clara. Então, obviamente, o que quer que você faça, basta superexemplo.


"e de qualquer maneira há um pseudocódigo de alta qualidade incomum nesse link", discordo. Esse pseudocódigo provavelmente não é uma implementação adequada do algoritmo de Wu, embora pareça ser o que foi usado em inúmeros locais da web. O algoritmo original de Wu desenhou de ambas as extremidades para dentro em direção ao centro e era realmente mais rápido que o de Bresenham, porque realiza cerca da metade das operações, mesmo gravando em mais pixels. Estou falando do algoritmo real de Wu, não o publicado no artigo da wikipedia.
Octopus

@Octopus [Expressa um ceticismo vago, especialmente na parte mais rápida, mas falta contexto para refutar ou confirmar - se é assim, fontes, correções e edições são bem-vindas.]
imallett

Depende do que você conta. Se você desenhar das duas extremidades para dentro, o algoritmo de Wu fará metade dos cálculos, mas o dobro de gravações em pixels. Veja a Tabela 1 no artigo de Wu, vinculado na Wikipedia. Portanto, se as gravações de pixel são caras, como é o caso de uma TFT em uma conexão serial, o algoritmo de Wu é mais caro que o de Bresenham. (Devo admitir que eu não vejo por que o algoritmo do Bresenham não pode usar simetria também.)
Jan-Åke Larsson

1
Mas eu concordo com o @Octopus, mesmo aceitando "desenhar de uma extremidade à outra", o pseudocódigo é o algoritmo de Wu apenas se a aritmética inteira for usada em toda parte. O código que vejo on-line usa aritmética de ponto flutuante, o que é uma mudança significativa. No artigo de Wu, o algoritmo usa apenas aritmética inteira (ou aritmética de ponto fixo).
Jan-Åke Larsson
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.