aboutsummaryrefslogtreecommitdiff
path: root/script.it/path/point.ml
diff options
context:
space:
mode:
Diffstat (limited to 'script.it/path/point.ml')
-rwxr-xr-xscript.it/path/point.ml77
1 files changed, 77 insertions, 0 deletions
diff --git a/script.it/path/point.ml b/script.it/path/point.ml
new file mode 100755
index 0000000..ec6f8ad
--- /dev/null
+++ b/script.it/path/point.ml
@@ -0,0 +1,77 @@
+let internal_id = ref 0
+
+type t =
+ { p: Gg.v2
+ ; size : float
+ ; angle: float
+ ; stamp : float
+ ; id : int
+ }
+
+let empty =
+ { p = Gg.V2.of_tuple (0., 0.)
+ ; size = 0.
+ ; angle = 0.
+ ; stamp = 0.
+ ; id = 0
+ }
+
+let create ~angle ~width ~stamp ~x ~y =
+
+ incr internal_id;
+ { p = Gg.V2.v x y
+ ; size = width
+ ; angle = Gg.Float.rad_of_deg (180. -. angle )
+ ; stamp
+ ; id = !internal_id
+ }
+
+let copy point p =
+ { point with
+ p
+ }
+
+let set_angle p angle =
+ { p with angle = Gg.Float.rad_of_deg (180. -. angle) }
+
+let get_angle { angle; _} = 180. -. (Gg.Float.deg_of_rad angle)
+
+let set_width p size =
+ { p with size }
+
+let get_width { size; _} = size
+
+let (+) p1 p2 =
+ { p1 with p = Gg.V2.(+) p1.p p2 }
+
+let get_coord { p; _ } = p
+
+let get_stamp { stamp; _} = stamp
+
+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 mix
+ : float -> Gg.v2 -> t -> t -> t
+ = fun f point p0 p1 ->
+ let angle0 = p0.angle
+ and angle1 = p1.angle
+ and width0 = get_width p0
+ and width1 = get_width p1
+ and stamp0 = get_stamp p0
+ and stamp1 = get_stamp p1 in
+ let angle = angle0 +. f *. ( angle1 -. angle0 ) in
+ let width = width0 +. f *. ( width1 -. width0 ) in
+ let stamp = stamp0 +. f *. ( stamp1 -. stamp0 ) in
+ { p = point
+ ; size = width
+ ; angle
+ ; stamp
+ ; id = !internal_id
+ }
+
+let id { id; _} = id