From 5ee27e786a3f1ed3eecc1e5c36f6e1e551388451 Mon Sep 17 00:00:00 2001 From: Sébastien Dailly Date: Sun, 10 Jan 2021 21:28:35 +0100 Subject: Correction in the bezier drawing --- layer/fillPrinter.ml | 132 +++++++++++++++++++++++---------------------------- 1 file changed, 60 insertions(+), 72 deletions(-) (limited to 'layer/fillPrinter.ml') diff --git a/layer/fillPrinter.ml b/layer/fillPrinter.ml index 19f0ac4..9b6546c 100755 --- a/layer/fillPrinter.ml +++ b/layer/fillPrinter.ml @@ -1,47 +1,7 @@ module Point = Path.Point - - module Make(Repr: Repr.PRINTER) = struct - (* Divide a curve in subelements *) - let rec divide level p0 ctrl0 ctrl1 p1 path = - - let bezier = - { Shapes.Bezier.p0 = Path.Point.get_coord p0 - ; ctrl0 - ; ctrl1 - ; p1 = Path.Point.get_coord p1 - } in - - let ratio = 0.5 in - let bezier0, bezier1 = Shapes.Bezier.slice ratio bezier in - let point = Path.Point.mix ratio bezier0.Shapes.Bezier.p1 p0 p1 in - - let ctrl0_0 = Point.copy p0 bezier0.Shapes.Bezier.ctrl0 - and ctrl0_1 = Point.copy point bezier0.Shapes.Bezier.ctrl1 - - and ctrl1_0 = Point.copy point bezier1.Shapes.Bezier.ctrl0 - and ctrl1_1 = Point.copy p1 bezier1.Shapes.Bezier.ctrl1 in - - - match level with - | 0 -> - path := - Repr.quadratic_to - (Point.get_coord' @@ ctrl1_1) - (Point.get_coord' @@ ctrl1_0) - (Point.get_coord' point) !path; - - path := - Repr.quadratic_to - (Point.get_coord' @@ ctrl0_1) - (Point.get_coord' @@ ctrl0_0) - (Point.get_coord' p0) !path; - | n -> - divide (n-1) point (Point.get_coord ctrl1_0) (Point.get_coord ctrl1_1) p1 path; - divide (n-1) p0 (Point.get_coord ctrl0_0) (Point.get_coord ctrl0_1) point path; - type t = Point.t type repr = @@ -57,55 +17,83 @@ module Make(Repr: Repr.PRINTER) = struct } (* Start a new path. *) - let start - : Path.Point.t -> repr -> repr - = fun t {close ; path } -> - let path = Repr.move_to (Point.get_coord t) path in + + let start' + : Gg.v2 -> Gg.v2 -> repr -> repr + = fun p1 _ {close ; path } -> + let path = Repr.move_to p1 path in { close ; path } - let line_to - : Point.t -> Point.t -> repr -> repr - = fun p0 p1 t -> + let start + : Path.Point.t -> repr -> repr + = fun pt t -> + let p = (Point.get_coord pt) in + start' p p t + + let line_to' + : (Gg.v2 * Gg.v2) -> (Gg.v2 * Gg.v2) -> repr -> repr + = fun (p0, p1) (p0', p1') t -> let path = - Repr.move_to (Point.get_coord p1) t.path - |> Repr.line_to (Point.get_coord' p1) - |> Repr.line_to (Point.get_coord' p0) - |> Repr.line_to (Point.get_coord p0) - |> Repr.line_to (Point.get_coord p1) + Repr.move_to p1 t.path + |> Repr.line_to p1' + |> Repr.line_to p0' + |> Repr.line_to p0 + |> Repr.line_to p1 |> Repr.close in let path = t.close path in { t with path} - let quadratic_to - : (t * Gg.v2 * Gg.v2 * t) -> repr -> repr - = fun (p0, ctrl0, ctrl1, p1) t -> + let line_to + : Point.t -> Point.t -> repr -> repr + = fun p0 p1 t -> - let ctrl0' = Point.copy p1 ctrl0 - and ctrl1' = Point.copy p1 ctrl1 in + line_to' + ( Point.get_coord p0 + , Point.get_coord p1 ) + ( Point.get_coord' p0 + , Point.get_coord' p1 ) + t - let path = Repr.move_to (Point.get_coord p1) t.path - |> Repr.line_to (Point.get_coord' p1) in - let path = ref path in + let quadratic_to' + : (Gg.v2 * Gg.v2 * Gg.v2 * Gg.v2) -> (Gg.v2 * Gg.v2 * Gg.v2 * Gg.v2) -> repr -> repr + = fun (p0, ctrl0, ctrl1, p1) (p0', ctrl0', ctrl1', p1') t -> - (* Backward *) - divide 3 p0 ctrl0 ctrl1 p1 path ; - path := Repr.line_to (Point.get_coord p0) !path; - (* Forward *) - path := Repr.quadratic_to - (Point.get_coord ctrl0') - (Point.get_coord ctrl1') - (Point.get_coord p1) !path; + let path = + Repr.move_to p1 t.path + |> Repr.line_to p1' - let path = !path in + (* Backward *) + |> Repr.quadratic_to + ctrl1' + ctrl0' + p0' + |> Repr.line_to p0 - let path = Repr.close path in + (* Forward *) + |> Repr.quadratic_to + ctrl0 + ctrl1 + p1 + |> Repr.close + |> t.close in + + + { t with path } + + let quadratic_to + : (t * Gg.v2 * Gg.v2 * t) -> repr -> repr + = fun (p0, ctrl0, ctrl1, p1) t -> - let path = t.close path in - { t with path} + let ctrl0' = Point.get_coord' @@ Point.copy p0 ctrl0 + and ctrl1' = Point.get_coord' @@ Point.copy p1 ctrl1 in + quadratic_to' + (Point.get_coord p0, ctrl0, ctrl1, Point.get_coord p1) + (Point.get_coord' p0, ctrl0', ctrl1', Point.get_coord' p1) + t let stop : repr -> repr -- cgit v1.2.3