Como controlar a invariância da escala?

9

Estou tentando juntar vários diagramas em uma espécie de mesa. Eu acho que isso é chamado de "impressão de índice" , as pessoas que fazem fotografia fazem isso quando precisam revisar muitas fotografias ao mesmo tempo. Enfim, este é o código:

main :: IO ()
main = mainWith @(Diagram B)
     $ (tile . fmap renderOne) examples

renderOne :: AnyGraph -> Diagram B
renderOne (AnyGraph gr) = ...

tile :: [Diagram B] -> Diagram B
tile xs = let columns = (ceiling . sqrt . fromIntegral . length) xs
          in (vcat . fmap hcat . List.chunksOf columns) xs

Não funciona como eu esperava. Mas vamos abordá-lo gradualmente. Primeiro, aqui está uma renderização de um único bloco:

1

Agora, vamos hcatquatro peças juntas.

hcat

Adicione uma segunda linha: (Veja como os recursos invariantes da escala aumentam.)

tile2

E é assim que fica com 4 linhas:

telha

Fora de mão!

Parece-me que recursos invariantes à escala, como pontas de setas, são dimensionados proporcionalmente à área da imagem. Mas, neste caso, preciso aumentar meu diagrama sem redimensionar esses recursos. Como posso conseguir isso?

Ignat Insarov
fonte

Respostas:

5

A seção do manual do usuário sobre unidades de medida é o que você deseja examinar. Itens como pontas de seta são medidos por padrão em unidades "normalizadas", que são dimensionadas para que elas sempre sejam uma proporção constante do tamanho de toda a imagem. Se entendi seu caso de uso corretamente, acho que você provavelmente deseja usar unidades locais. Use a variante preparada de qualquer função de seta que você esteja usando e forneça um registro de opções como

(with & headLength .~ local 0.1)

mas com qualquer número, suas fotos ficam da maneira que você deseja. Veja o tutorial de seta para obter mais informações sobre as opções de seta.

Brent Yorgey
fonte