File: florence.ml

package info (click to toggle)
mlpost 0.9-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 3,844 kB
  • sloc: ml: 21,094; javascript: 4,047; makefile: 430; ansic: 34; lisp: 19; sh: 15
file content (96 lines) | stat: -rw-r--r-- 2,287 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
open Mlpost
open Command
open Path
open Point
open Plot
module T = Transform

let f1 i =
  let aux = function
    | 0 -> 1
    | 1 | 2 -> 2
    | 3 | 4 -> 3
    | 5 -> 4
    | 6 | 7 -> 5
    | 8 | 9 -> 6
    | 10 -> 7
    | 11 | 12 -> 8
    | 13 | 14 -> 9
    | 15 -> 10
    | 16 | 17 -> 11
    | 18 | 19 -> 12
    | 20 -> 13
    | _ -> 0
  in
  float_of_int (aux i)

let f2 i =
  let aux = function
    | 0 | 1 | 2 -> 0
    | 3 -> 1
    | 4 -> 2
    | 5 | 6 | 7 -> 3
    | 8 -> 4
    | 9 -> 5
    | 10 | 11 | 12 -> 6
    | 13 -> 7
    | 14 -> 8
    | 15 | 16 | 17 -> 9
    | 18 -> 10
    | 19 -> 11
    | 20 -> 12
    | _ -> 0
  in
  float_of_int (aux i)

let f3 i = float_of_int ((i + 3) / 5)

let flab i =
  ( Picture.transform [ Transform.scaled 1.7 ]
      (Picture.tex (Printf.sprintf "$f_{\\omega_%d}$" i)),
    Command.Ptop,
    19 )

let instants =
  let pen = Pen.default ~tr:[ Transform.scaled 2.5 ] () in
  let base =
    Command.draw ~pen (Path.path ~style:JLine [ (0., -65.); (280., -65.) ])
  in
  let tick i =
    let xi = float_of_int i *. 14. in
    let yi = if f1 i = f1 (i - 1) then -60. else -45. in
    let p = Path.path ~style:JLine [ (xi, -65.); (xi, yi) ] in
    Command.draw ~pen p
  in
  Command.seq
    [
      base;
      Command.iter 0 20 tick;
      Command.label
        (Picture.transform [ Transform.scaled 2. ] (Picture.tex "$\\omega_1$"))
        (pt (-20., -55.));
    ]

let florence =
  let sk = mk_skeleton 20 14 14. 20. in
  let pen = Pen.default ~tr:[ Transform.scaled 4. ] () in
  let pen2 = Pen.default ~tr:[ Transform.scaled 3. ] () in
  let dash _ = Dash.scaled 0.5 Dash.withdots in
  let dash2 = Dash.scaled 0.66 Dash.withdots in
  let dash3 = Dash.scaled 0.9 Dash.evenly in
  let vcaption, hcaption =
    let tr = [ Transform.scaled 1.5 ] in
    ( Picture.transform tr (Picture.tex "\\textsf{Number of ones}"),
      Picture.transform tr (Picture.tex "\\textsf{Instants}") )
  in
  let plot = draw_func ~drawing:Stepwise ~style:JLine in
  [
    draw_grid ~hdash:dash ~vdash:dash sk;
    draw_axes ~closed:true ~hcaption ~vcaption sk;
    plot ~pen ~label:(flab 1) f1 sk;
    plot ~pen:pen2 ~dashed:dash2 ~label:(flab 2) f2 sk;
    plot ~pen ~dashed:dash3 ~label:(flab 3) f3 sk;
    instants;
  ]

let _ = Metapost.emit "florence" florence