X-Git-Url: http://git.euphorik.ch/?p=master-thesis.git;a=blobdiff_plain;f=Parasitemia%2FParasitemia%2FUtils.fs;h=b30e9ace4dc41a4ec39350824448bcfec4dba25f;hp=de166647bcc389add7c347196e66a453ce0b1f4b;hb=044b0ae69df3ac565432545b2fa934589016f9bd;hpb=ba64921fb9a0c36cd8cf802cbf1b2c0f79bc25f6 diff --git a/Parasitemia/Parasitemia/Utils.fs b/Parasitemia/Parasitemia/Utils.fs index de16664..b30e9ac 100644 --- a/Parasitemia/Parasitemia/Utils.fs +++ b/Parasitemia/Parasitemia/Utils.fs @@ -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