File: img_doc.ml

package info (click to toggle)
mlpost 0.8.1-3
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 1,776 kB
  • sloc: ml: 17,440; makefile: 469
file content (129 lines) | stat: -rw-r--r-- 4,193 bytes parent folder | download | duplicates (5)
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
open Mlpost
open Command
open Box
open Num

module Forms = struct
  let circle = draw (circle (empty ~height:(bp 5.) ~width:(bp 5.) ()))
  let rect = draw (rect (empty ~height:(bp 5.) ~width:(bp 5.) ()))
  let round_rect = draw (round_rect (empty ~height:(bp 5.) ~width:(bp 5.) ()))
  let ellipse = draw (ellipse (empty ~width:(bp 5.) ()))
  let patatoid = draw (patatoid (empty ~height:(bp 5.) ~width:(bp 10.) ()))
  let tex = draw (tex "text")
end

let brect = Box.rect (empty ~height:(bp 5.) ~width:(bp 5.) ())

module Dirs = struct
  let dot p = Command.draw ~pen:(Pen.scale (bp 4.) Pen.circle) (Path.pathp [p])

  let ctr = seq [ draw brect; dot (ctr brect) ]
  let north = seq [ draw brect; dot (north brect) ]
  let south = seq [ draw brect; dot (south brect) ]
  let west = seq [ draw brect; dot (west brect) ]
  let east = seq [ draw brect; dot (east brect) ]
  let north_west = seq [ draw brect; dot (north_west brect) ]
  let south_west = seq [ draw brect; dot (south_west brect) ]
  let north_east = seq [ draw brect; dot (north_east brect) ]
  let south_east = seq [ draw brect; dot (south_east brect) ]
end

let cpic c = Box.pic ~stroke:None (Picture.make c)

module Size = struct
  open Arrow
  let head = head_triangle_full
  let kind = add_foot ~head (add_head ~head (add_line empty))

  let dbl_arrow = 
    let ar = 
      Arrow.point_to_point ~kind Point.origin (Point.pt (bp 10.,Num.zero))
    in
    cpic ar
  let width = Box.draw (Box.vbox [ brect; dbl_arrow; ])
  let height = Box.draw (Box.hbox [ Box.rotate 90. dbl_arrow;  brect ])
end

module Move = struct
  let fnstex s = Picture.tex (Format.sprintf "{\\footnotesize %s}" s)

  let shift = 
    let pt = Point.pt (bp 40., bp 25.) in
    let vec = 
      cpic (
        seq [Arrow.point_to_point Point.origin pt; 
            Command.dotlabel ~pos:`Top (fnstex "pt") pt;
            Command.dotlabel ~pos:`Bot (fnstex "(0,0)") Point.origin;
  ]) in
    let b = brect in
    let b' = Box.shift pt b in
    let shift = 
      cpic ( seq [Box.draw b; Box.draw b';
               Arrow.point_to_point (Box.ctr b) (Box.ctr b')])
    in
    Box.draw (Box.hbox [vec; shift])

  let center = 
    let pt = Point.pt (bp 40., bp 25.) in
    let vec = 
        seq [Arrow.point_to_point Point.origin pt; 
            Command.dotlabel ~pos:`Top (fnstex "pt") pt; ] in
    let b = brect in
    let b' = Box.center pt b in
    seq [vec; Box.draw b; Box.draw b']
end

module Align = struct
  let dist = 20.
  let p1 = Point.p (-.dist, dist)
  let p2 = Point.sub Point.origin p1

  let mkb s = round_rect (tex s)
  let a, b , c =
    let a = mkb "A" and borig = mkb "B" and corig = mkb "C" in 
    let b = shift p1 borig in
    let c = shift p2 corig in
    a, b, c

  let all = [a;b;c]
  let orig = group all

  let sidebyside l = 
    let b = group l in
    let s = hbox ~padding:(Num.bp 50.) [orig; b] in
    seq 
      [ draw s;
        Helpers.box_arrow ~sep:(Num.bp 20.) ~within:s ~pen:Pen.circle 
                          ~color:Color.red orig b
      ]
  let origfig = draw orig

  let halign = sidebyside (halign Num.zero all)
  let hplace = sidebyside (hplace all)
  let hbox = sidebyside (hbox_list all)
end

let _ = Metapost.emit "circle" Forms.circle
let _ = Metapost.emit "rect" Forms.rect
let _ = Metapost.emit "round_rect" Forms.round_rect
let _ = Metapost.emit "ellipse" Forms.ellipse
let _ = Metapost.emit "patatoid" Forms.patatoid
let _ = Metapost.emit "tex" Forms.tex
let _ = Metapost.emit "ctr" Dirs.ctr
let _ = Metapost.emit "north" Dirs.north
let _ = Metapost.emit "south" Dirs.south
let _ = Metapost.emit "west" Dirs.west  
let _ = Metapost.emit "east" Dirs.east  
let _ = Metapost.emit "north_west" Dirs.north_west
let _ = Metapost.emit "south_west" Dirs.south_west
let _ = Metapost.emit "north_east" Dirs.north_east
let _ = Metapost.emit "south_east" Dirs.south_east
let _ = Metapost.emit "width" Size.width
let _ = Metapost.emit "height" Size.height
let _ = Metapost.emit "shift" Move.shift
let _ = Metapost.emit "center" Move.center
let _ = Metapost.emit "halign" Align.halign
let _ = Metapost.emit "hplace" Align.hplace
let _ = Metapost.emit "hbox" Align.hbox

let () = Mlpost.Metapost.dump "img_doc"