Wie steuere ich die Skaleninvarianz?

9

Ich versuche, mehrere Diagramme in einer Art Tabelle zusammenzustellen. Ich denke, das nennt man "Indexdruck" , Fotografen machen das, wenn sie viele Fotos gleichzeitig überprüfen müssen. Wie auch immer, das ist der Code:

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

Es funktioniert nicht wie erwartet. Aber gehen wir es schrittweise an. Hier ist zunächst ein Render einer einzelnen Kachel:

einer

Lassen Sie uns nun hcatvier Kacheln zusammen.

hcat

Fügen Sie eine zweite Zeile hinzu: (Sehen Sie, wie sich skalierungsinvariante Merkmale verdicken.)

tile2

Und so sieht es mit 4 Zeilen aus:

Fliese

Aus der Hand!

Es scheint mir , dass skaleninvarianten Features, wie Pfeilspitzen, werden im Verhältnis zu dem skalierten Bereich des Bildes. In diesem Fall muss ich mein Diagramm jedoch vergrößern, ohne diese Funktionen neu zu skalieren. Wie kann ich das erreichen?

Ignat Insarov
quelle

Antworten:

5

Das Benutzerhandbuch zu Maßeinheiten ist das, was Sie sich ansehen möchten. Dinge wie Pfeilspitzen werden standardmäßig in "normalisierten" Einheiten gemessen, die so skaliert sind, dass sie immer einen konstanten Anteil an der Größe des gesamten Bildes haben. Wenn ich Ihren Anwendungsfall richtig verstehe, möchten Sie wahrscheinlich stattdessen lokale Einheiten verwenden. Verwenden Sie die vorbereitete Variante der von Ihnen verwendeten Pfeilfunktion und geben Sie ihr einen Optionsdatensatz wie

(with & headLength .~ local 0.1)

Mit welcher Nummer auch immer, Ihre Bilder sehen so aus, wie Sie es möchten. Weitere Informationen zu Pfeiloptionen finden Sie im Pfeil-Tutorial .

Brent Yorgey
quelle