aboutsummaryrefslogtreecommitdiff
path: root/script.it/shapes/tools
diff options
context:
space:
mode:
authorSébastien Dailly <sebastien@chimrod.com>2021-02-05 09:08:39 +0100
committerSébastien Dailly <sebastien@dailly.me>2022-02-07 14:39:30 +0100
commit561d0f0155f4906d90eb7e73a3ff9cb28909126f (patch)
tree9a606c2d7832272ea33d7052512a5fa59805d582 /script.it/shapes/tools
parent86ec559f913c389e8dc055b494630f21a45e039b (diff)
Update project structure
Diffstat (limited to 'script.it/shapes/tools')
-rwxr-xr-xscript.it/shapes/tools/dune6
-rwxr-xr-xscript.it/shapes/tools/utils.ml63
-rwxr-xr-xscript.it/shapes/tools/utils.mli21
3 files changed, 90 insertions, 0 deletions
diff --git a/script.it/shapes/tools/dune b/script.it/shapes/tools/dune
new file mode 100755
index 0000000..a2c3fdb
--- /dev/null
+++ b/script.it/shapes/tools/dune
@@ -0,0 +1,6 @@
+(library
+ (name tools)
+ (libraries
+ gg
+ )
+ )
diff --git a/script.it/shapes/tools/utils.ml b/script.it/shapes/tools/utils.ml
new file mode 100755
index 0000000..b8a473f
--- /dev/null
+++ b/script.it/shapes/tools/utils.ml
@@ -0,0 +1,63 @@
+open Gg.V2
+
+let norm_angle vect =
+ mod_float
+ ((angle vect) +. Gg.Float.two_pi)
+ Gg.Float.two_pi
+
+
+let intersection
+ : (Gg.v2 * Gg.v2) -> (Gg.v2 * Gg.v2) -> Gg.v2 option
+ = fun (p0, p1) (p2, p3) ->
+ let i = p1 - p0
+ and j = p3 - p2 in
+
+ let d = (x i *. y j) -. (y i *. x j) in
+ if Float.( (abs d) <= 0.01 ) then
+ None
+ else
+ let m = ((x i) *. (y p0)
+ -. (x i) *. (y p2)
+ -. (y i) *. (x p0)
+ +. (y i) *. (x p2)) /. d in
+ Some (p2 + m * j)
+ (*
+ let k = ((x j) *. (y p0)
+ -. (x j) *. (y p2)
+ -. (y j) *. (x p0)
+ +. (y j) *. (x p2)) /. d in
+ Some (p0 + k * i)
+ *)
+
+
+let center
+ : Gg.v2 -> Gg.v2 -> Gg.v2 -> Gg.v2 option
+ = fun p0 p1 p2 ->
+ (* deltas *)
+ let d1 = p1 - p0
+ and d2 = p2 - p1 in
+
+ (* perpendiculars *)
+ let d1p = ortho d1
+ and d2p = ortho d2 in
+
+ (* Chord midpoints *)
+ let m1 = half (p0 + p1)
+ and m2 = half (p1 + p2) in
+
+ (* midpoint offsets *)
+ let m1n = m1 + d1p
+ and m2n = m2 + d2p in
+
+ intersection (m1, m1n) (m2, m2n)
+
+let rotate
+ : Gg.v2 -> float -> Gg.v2
+ = fun p0 theta ->
+ let r = x (to_polar p0) in
+ of_polar (v r theta)
+
+let equal_point
+ : float -> Gg.v2 -> Gg.v2 -> bool
+ = fun eps p0 p1 ->
+ Gg.V2.equal_f (fun v0 v1 -> (Float.abs (v1 -. v0)) <= eps ) p0 p1
diff --git a/script.it/shapes/tools/utils.mli b/script.it/shapes/tools/utils.mli
new file mode 100755
index 0000000..4e12906
--- /dev/null
+++ b/script.it/shapes/tools/utils.mli
@@ -0,0 +1,21 @@
+(** Return a normalize angle *)
+val norm_angle
+ : Gg.v2 -> float
+
+(** return the interesction for two segments *)
+val intersection
+ : (Gg.v2 * Gg.v2) -> (Gg.v2 * Gg.v2) -> Gg.v2 option
+
+(** Return the center of the cercle for three points
+ None if the point cannot be evaluated
+*)
+val center
+ : Gg.v2 -> Gg.v2 -> Gg.v2 -> Gg.v2 option
+
+(** Rotate the vector by the given angle *)
+val rotate
+ : Gg.v2 -> float -> Gg.v2
+
+(** Test equality between two points *)
+val equal_point
+ : float -> Gg.v2 -> Gg.v2 -> bool