Как контролировать масштабную инвариантность? - PullRequest
9 голосов
/ 28 октября 2019

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

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

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

one

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

hcat

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

tile2

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

tile

Out of hand!

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

1 Ответ

5 голосов
/ 29 октября 2019

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

(with & headLength .~ local 0.1)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...