From 979be5f588a1ffd6e1d060cd794e87526d517b7a Mon Sep 17 00:00:00 2001 From: Sébastien Dailly Date: Mon, 11 Jan 2021 05:36:46 +0100 Subject: Layer review --- layer/ductusPrinter.ml | 52 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 21 deletions(-) (limited to 'layer/ductusPrinter.ml') diff --git a/layer/ductusPrinter.ml b/layer/ductusPrinter.ml index 8f796b4..db34481 100755 --- a/layer/ductusPrinter.ml +++ b/layer/ductusPrinter.ml @@ -1,45 +1,52 @@ module Make(Repr: Repr.PRINTER) = struct - type t = Path.Point.t + type point = Path.Point.t - type repr = + type t = { path: (Repr.t) } + type repr = Repr.t + let create_path - : 'b -> repr + : 'b -> t = fun _ -> { path = Repr.create () } - (* Start a new path. *) let start - : Path.Point.t -> repr -> repr - = fun t {path} -> - let path = Repr.move_to (Path.Point.get_coord t) path in - let path = Repr.line_to (Path.Point.get_coord' t) path in + : point -> point -> t -> t + = fun p1 p2 { path } -> + let path = + Repr.move_to (Path.Point.get_coord p1) path + |> Repr.line_to (Path.Point.get_coord p2) in { path } let line_to - : Path.Point.t -> Path.Point.t -> repr -> repr - = fun _ t {path} -> - let path = Repr.move_to (Path.Point.get_coord t) path in - let path = Repr.line_to (Path.Point.get_coord' t) path in + : (point * point) -> (point * point) -> t -> t + = fun (_, p1) (_, p1') {path} -> + let path = Repr.move_to (Path.Point.get_coord p1) path in + let path = Repr.line_to (Path.Point.get_coord p1') path in { path } let quadratic_to - : (t * Gg.v2 * Gg.v2 * t) -> repr -> repr - = fun (p0, ctrl0, ctrl1, p1) { path } -> - - let path = ref path in + : (point * Gg.v2 * Gg.v2 * point) -> (point * Gg.v2 * Gg.v2 * point) -> t -> t + = fun (p0, ctrl0, ctrl1, p1) (p0', ctrl0', ctrl1', p1') {path} -> let bezier = { Shapes.Bezier.p0 = Path.Point.get_coord p0 ; ctrl0 ; ctrl1 ; p1 = Path.Point.get_coord p1 + } + + and bezier' = + { Shapes.Bezier.p0 = Path.Point.get_coord p0' + ; ctrl0 = ctrl0' + ; ctrl1 = ctrl1' + ; p1 = Path.Point.get_coord p1' } in (* Mark each point on the bezier curve. The first point is the most @@ -48,25 +55,28 @@ module Make(Repr: Repr.PRINTER) = struct ((Path.Point.get_stamp p0) -. (Path.Point.get_stamp p1)) *. 30. in + let path = ref path in for i = 0 to ((Int.of_float delay) ) do let ratio = (Float.of_int i) /. delay in - let bezier', _ = Shapes.Bezier.slice ratio bezier in + let bezier, _ = Shapes.Bezier.slice ratio bezier + and bezier', _ = Shapes.Bezier.slice ratio bezier' in - let point = Path.Point.mix ratio bezier'.Shapes.Bezier.p1 p0 p1 in + let point = Path.Point.mix ratio bezier.Shapes.Bezier.p1 p0 p1 + and point' = Path.Point.mix ratio bezier'.Shapes.Bezier.p1 p0' p1' in path := Repr.move_to (Path.Point.get_coord point) !path; - path := Repr.line_to (Path.Point.get_coord' point) !path; + path := Repr.line_to (Path.Point.get_coord point') !path; done; { path = !path } let stop - : repr -> repr + : t -> t = fun path -> path let get - : repr -> Repr.t + : t -> Repr.t = fun {path; _} -> path end -- cgit v1.2.3