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"
|