summaryrefslogtreecommitdiff
path: root/draw/point.ml
blob: 150bc8e68068b48198914305436f32de02926926 (plain)
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
open StdLabels

type t =
  { p: Gg.v2
  ; size : float
  ; angle: float
  }

let create x y =
  { p = Gg.V2.v x y
  ; size = 0.1
  ; angle = Gg.Float.pi_div_4
  }

let (+) p1 p2 =
  { p1 with p = Gg.V2.(+) p1.p p2 }

let get_coord { p; _ } = p

let get_coord'
  : t -> Gg.v2
  = fun t ->
    let open Gg.V2 in
    let trans = of_polar @@ v t.size t.angle in
    t.p + trans

let return_segment
  : Curves.Bezier.t -> Curves.Bezier.t list -> Curves.Bezier.t list
  = fun bezier beziers ->
    (* We gave the points in reverse order, so we have to revert the
       curve *)
    let bezier' = Curves.Bezier.reverse bezier in
    bezier'::beziers


let get_new_segment connexion0 p5 p4 p3 p2 p1 =
  let p5' = get_coord p5
  and p4' = get_coord p4
  and p3' = get_coord p3
  and p2' = get_coord p2
  and p1' = get_coord p1 in

  let points_to_link =
    [ p1'
    ; p2'
    ; p3'
    ; p4'
    ; p5' ] in
  Curves.Bspline.to_bezier ?connexion0 points_to_link

let add_point_in_path
  : float -> float -> t list -> Curves.Bezier.t list -> t list * Curves.Bezier.t list
  = fun x y path beziers ->
    let lastClick = create x y in
    let (let*) v f =
      match v with
      | Ok bezier ->
        if Array.length bezier > 0 then
          f (Array.get bezier 0)
        else
          lastClick::path, beziers
      | _ ->
        lastClick::path, beziers
    in

    let connexion0 = match beziers with
      | hd::_ -> Some hd.Curves.Bezier.p1
      | _ -> None in

    match path with
    | p4::p3::p2::p1::_ ->
      let* bezier = get_new_segment connexion0
          lastClick p4 p3 p2 p1 in
      (* We remove the last point and add the bezier curve in the list*)
      let firsts = lastClick::p4::p3::p2::[] in
      firsts, return_segment bezier beziers
    | _ ->
      lastClick::path, beziers