Как контролировать масштабную инвариантность?

9

Я пытаюсь составить несколько диаграмм в виде таблицы. Я думаю, что это называется «индексная печать» , фотографы делают это, когда им приходится просматривать много фотографий одновременно. Во всяком случае, это код:

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

Это не работает, как я ожидаю. Но давайте подойдем к этому постепенно. Во-первых, вот рендер одной плитки:

один

Теперь давайте hcatвместе четыре плитки.

hcat

Добавьте вторую строку: (Посмотрите, как сгущаются инвариантные объекты масштаба .)

tile2

И вот как это выглядит с 4 рядами:

плитка

Из рук!

Мне кажется, что масштабные инвариантные элементы, такие как наконечники стрел, масштабируются пропорционально площади изображения. Но в этом случае мне нужно увеличить диаграмму, не масштабируя эти функции. Как я могу этого достичь?

Игнат Инсаров
источник

Ответы:

5

Раздел руководства пользователя по единицам измерения - это то, на что вы хотите обратить внимание. Такие вещи, как стрелки, по умолчанию измеряются в «нормализованных» единицах, которые масштабируются таким образом, чтобы они всегда были постоянной пропорцией размера всего изображения. Если я правильно понимаю ваш вариант использования, я думаю, что вы, вероятно, хотите использовать вместо этого локальные модули. Используйте загрунтованный вариант любой функции стрелки, которую вы используете, и дайте ему возможность записать что-то вроде

(with & headLength .~ local 0.1)

но с любым числом заставляет ваши фотографии выглядеть так, как вы хотите. См. Руководство по стрелке для получения дополнительной информации о параметрах стрелки.

Брент Йорги
источник