diagrams-contrib- Collection of user contributions to diagrams EDSL

Copyright(c) 2012 Brent Yorgey
LicenseBSD-style (see LICENSE)
Safe HaskellNone



Factorization diagrams, as seen at http://mathlesstraveled.com/2012/10/05/factorization-diagrams/ and http://mathlesstraveled.com/2012/11/05/more-factorization-diagrams/ and on the cover of Hacker Monthly (http://hackermonthly.com/issue-31.html): visually represent the prime factorization of n by drawing n dots recursively grouped according to the factors.



primeLayout :: (Renderable (Path V2 n) b, TypeableFloat n) => [Colour Double] -> Integer -> QDiagram b V2 n Any -> QDiagram b V2 n Any Source #

primeLayout takes a positive integer p (the idea is for it to be prime, though it doesn't really matter) and a diagram, and lays out p rotated copies of the diagram in a circular pattern.

There is a special case for p = 2: if the given diagram is taller than it is wide, then the two copies will be placed beside each other; if wider then tall, they will be placed one above the other.

The regular p-gon connecting the centers of the laid-out diagrams is also filled in with vertical bars of color representing the number p. In particular, there is one color for each decimal digit (the provided list should have length 10 and represents the digits 0-9), and the colors, read left to right, give the decimal expansion of p.

import Diagrams.TwoD.Factorization
  = pad 1.1 . centerXY
  . hsep 0.5
  . map (sized (mkWidth 1))
  $ [ primeLayout defaultColors 5 (circle 1 # fc black)
    , primeLayout defaultColors 103 (square 1 # fc green # lw none)
    , primeLayout (repeat white) 13 (circle 1 # lc orange)

colorBars :: (Renderable (Path V2 n) b, TypeableFloat n) => [Colour Double] -> Integer -> Path V2 n -> QDiagram b V2 n Any Source #

Draw vertical bars of color inside a polygon which represent the decimal expansion of p, using the provided list of colors to represent the digits 0-9.

import Diagrams.TwoD.Factorization
colorBarsEx = colorBars defaultColors 3526 (square 1)

defaultColors :: [Colour Double] Source #

A default set of digit colors, based very loosely on the color code for resistors (http://en.wikipedia.org/wiki/Electronic_color_code), lightened up a bit by blending with white.

factorDiagram' :: (Renderable (Path V2 n) b, TypeableFloat n) => [Integer] -> QDiagram b V2 n Any Source #

Create a centered factorization diagram from the given list of factors (intended to be primes, but again, any positive integers will do; note how the below example uses 6), by recursively folding according to primeLayout, with the defaultColors and a base case of a black circle.

import Diagrams.TwoD.Factorization
factorDiagram'Ex = factorDiagram' [2,5,6]

factorDiagram :: (Renderable (Path V2 n) b, TypeableFloat n) => Integer -> QDiagram b V2 n Any Source #

Create a default factorization diagram for the given integer, by factoring it and calling factorDiagram' on its prime factorization (with the factors ordered from smallest to biggest).

import Diagrams.TwoD.Factorization
factorDiagramEx = factorDiagram 700

ensquare :: (Renderable (Path V2 n) b, TypeableFloat n) => n -> QDiagram b V2 n Any -> QDiagram b V2 n Any Source #

Place a diagram inside a square with the given side length, centering and scaling it to fit with a bit of padding.

import Diagrams.TwoD.Factorization
ensquareEx = ensquare 1 (circle 25) ||| ensquare 1 (factorDiagram 30)

fdGrid :: (Renderable (Path V2 n) b, TypeableFloat n) => [[Integer]] -> QDiagram b V2 n Any Source #

fdGrid n creates a grid of factorization diagrams, given a list of lists of integers: the inner lists represent L-R rows, which are laid out from top to bottom.

import Diagrams.TwoD.Factorization
fdGridEx = fdGrid [[7,6,5],[4,19,200],[1,10,50]]

fdGridList :: (Renderable (Path V2 n) b, TypeableFloat n) => Integer -> QDiagram b V2 n Any Source #

fdGridList n creates a grid containing the factorization diagrams of all the numbers from 1 to n^2, ordered left to right, top to bottom (like the grid seen on the cover of Hacker Monthly, http://hackermonthly.com/issue-31.html).

import Diagrams.TwoD.Factorization
grid100 = fdGridList 10
grid100Big = grid100

fdMultTable :: (Renderable (Path V2 n) b, TypeableFloat n) => Integer -> QDiagram b V2 n Any Source #

fdTable n creates a "multiplication table" of factorization diagrams, with the diagrams for 1 to n along both the top row and left column, and the diagram for m*n in row m and column n.

import Diagrams.TwoD.Factorization
fdMultTableEx = fdMultTable 13