aboutsummaryrefslogtreecommitdiff
path: root/layer/fillPrinter.ml
diff options
context:
space:
mode:
authorSébastien Dailly <sebastien@chimrod.com>2021-01-10 21:28:35 +0100
committerSébastien Dailly <sebastien@chimrod.com>2021-01-11 13:55:42 +0100
commit5ee27e786a3f1ed3eecc1e5c36f6e1e551388451 (patch)
tree4c409aee4bcc1aa018207ef86c0b529ed4bce860 /layer/fillPrinter.ml
parent12e99cb08790b9e67913e4137da4a4dbcb82f362 (diff)
Correction in the bezier drawing
Diffstat (limited to 'layer/fillPrinter.ml')
-rwxr-xr-xlayer/fillPrinter.ml132
1 files changed, 60 insertions, 72 deletions
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