Pergunta

Eu olhei para Este exemplo usando PHP e GD para render uma espiral por partes com pequenos arcos. O que eu gostaria de fazer é tornar uma aproximação a uma espiral que é o mais matematicamente precisa possível.

Inkscape tem um ferramenta espiral Isso parece muito bom, mas eu gostaria de fazer a geração em espiral programaticamente (de preferência em Python).

Não encontrei nenhuma biblioteca de desenho (por exemplo, Cairo) que suporta nativamente formas espirais. Se alguém quisesse tornar uma espiral antialiasse perfeita, seria a melhor maneira de iterar o pixel por pixel em uma tela, determinando se cada pixel está dentro de uma região de braço espiral de maneira matematicamente definida (de espessura finita)? Nesse caso, também seria necessário implementar a lógica anti-aliasing do zero. Você integraria a parte da curva que fica dentro de cada caixa de pixels e converteria a proporção de área cheia para vazia para um valor alfa?

Nesse caso, a qualidade da renderização é mais importante que o tempo de renderização. No entanto, avaliar uma parte integrante em cada pixel me parece bastante ineficiente.

Atualizar: Eu acredito que a pergunta que devo fazer é Este (para o qual o Yahoo Answers falhou).

Foi útil?

Solução

Não seria mais fácil desenhar uma curva (spline?) E apenas gerar muitos pontos de controle? Assim, você pegaria um motor antialiasing existente.

Editar]: Uma primeira aproximação a isso (feita com TCL/TK, mas o código deve ser fácil de converter) me dá o seguinte:

# Make the list of spiral coordinates
set coords {}          
set theta 0; set r 10
set centerX 200; set centerY 150
# Go out 50 pixels per revolution
set pitch [expr {100.0 / 720.0}]
for {set i 0} {$i<720} {incr i} {
    lappend coords [expr { $centerX + $r*sin($theta) }] \
                   [expr { $centerY + $r*cos($theta) }]
    set r     [expr { $r + $pitch }]
    # Increment angle by one degree
    set theta [expr { $theta + 3.1415927/180 }]
}

# Display as a spline
pack [canvas .c -width 400 -height 300]
.c create line $coords -tag spiral -smooth 1

Não fiz nenhum esforço para ser eficiente no uso de pontos de controle.

Outras dicas

Não encontrei nenhuma biblioteca de desenho (por exemplo, Cairo) que suporta nativamente formas espirais

Não, é uma característica bastante incomum; É apenas muito recentemente que desenhar com espirais se tornou popular.

O código que o Inkscape usa para isso é Spiro. É principalmente python e pode usar o Cairo para tornar os bens em que as espirais são aproximadas.

No entanto, avaliar uma parte integrante em cada pixel me parece bastante ineficiente.

Sim, de fato.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top