Use float32 to reduce memory footprint.
[master-thesis.git] / Parasitemia / Parasitemia / Utils.fs
index de16664..b30e9ac 100644 (file)
@@ -2,7 +2,9 @@
 
 open System.Diagnostics
 
-let roundInt = int << round
+open Types
+
+let inline roundInt v = v |> round |> int
 
 let inline dprintfn fmt =
     Printf.ksprintf System.Diagnostics.Debug.WriteLine fmt
@@ -16,4 +18,31 @@ let logTime (m: string) (f: unit -> 'a) : 'a =
     let res = f ()
     sw.Stop()
     log <| sprintf "%A (time: %A ms)" m sw.ElapsedMilliseconds
-    res 
\ No newline at end of file
+    res
+
+let inline lineFromTwoPoints (p1: PointD) (p2: PointD) : Line =
+    let a = (p1.Y - p2.Y) / (p1.X - p2.X)
+    let b = -(p2.X * p1.Y - p1.X * p2.Y) / (p1.X - p2.X)
+    Line(a, b)
+
+let inline pointFromTwoLines (l1: Line) (l2: Line) : PointD =
+    let x = -(l1.B - l2.B) / (l1.A - l2.A)
+    let y = -(l2.A * l1.B - l1.A * l2.B) / (l1.A - l2.A)
+    PointD(x, y)
+
+let inline linePassThroughSegment (l: Line) (p1: PointD) (p2: PointD) : bool =
+    let p = pointFromTwoLines l (lineFromTwoPoints p1 p2)
+    sign (p.X - p1.X) <> sign (p.X - p2.X)
+
+let inline squaredDistanceTwoPoints (p1: PointD) (p2: PointD) =
+    (p1.X - p2.X) ** 2.f + (p1.Y - p2.Y) ** 2.f
+
+let distanceTwoPoints (p1: PointD) (p2: PointD) =
+    squaredDistanceTwoPoints p1 p2 |> sqrt
+
+let countCells (cells: Cell list) : int * int =
+    cells |> List.fold (fun (total, infected) { cellClass = cellClass } ->
+        match cellClass with
+        | HealthyRBC -> (total + 1, infected)
+        | InfectedRBC -> (total + 1, infected + 1)
+        | Peculiar -> (total, infected)) (0, 0)
\ No newline at end of file