blob: b8a473f5d0a5bc8f3f432564a05a991f8f0e571c (
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
|
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
|