Jak kontrolować niezmienność skali?

9

Próbuję połączyć kilka diagramów w coś w rodzaju stołu. Myślę, że nazywa się to „drukiem indeksowym” - fotografowie robią to, gdy muszą przeglądać wiele fotografii jednocześnie. W każdym razie jest to kod:

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

Nie działa zgodnie z oczekiwaniami. Ale zbliżajmy się do tego stopniowo. Po pierwsze, oto rendering pojedynczego kafelka:

jeden

A teraz połączmy hcatcztery płytki.

hcat

Dodaj drugi wiersz: (Zobacz, jak zagęszczają się niezmienne cechy skali ).

kafelek2

I tak to wygląda z 4 rzędami:

dachówka

Na poczekaniu!

Wydaje mi się, że niezmienne cechy skali, takie jak groty strzałek, są skalowane proporcjonalnie do obszaru obrazu. Ale w tym przypadku muszę rozwinąć schemat bez ponownego skalowania tych funkcji. Jak mogę to osiągnąć?

Ignat Insarov
źródło

Odpowiedzi:

5

Część instrukcji na temat jednostek miar jest tym, na co chcesz spojrzeć. Rzeczy takie jak groty strzałek są domyślnie mierzone w „znormalizowanych” jednostkach, które są skalowane, tak aby zawsze były stałą proporcją wielkości całego obrazu. Jeśli dobrze rozumiem twój przypadek użycia, myślę, że prawdopodobnie chcesz zamiast tego używać jednostek lokalnych. Użyj pierwotnego wariantu dowolnej funkcji strzałki, której używasz, i daj mu opcję zapisu czegoś podobnego

(with & headLength .~ local 0.1)

ale przy dowolnej liczbie Twoje zdjęcia wyglądają tak, jak chcesz. Zobacz samouczek dotyczący strzałek, aby uzyskać więcej informacji na temat opcji strzałek.

Brent Yorgey
źródło