open System
open System.Drawing
+open System.Collections.Generic
open Emgu.CV
open Emgu.CV.Structure
open Const
+type Points = HashSet<Point>
+
type Ellipse (cx: float32, cy: float32, a: float32, b: float32, alpha: float32) =
member this.Cx = cx
member this.Cy = cy
member this.Alpha = alpha
member this.Area = a * b * PI
- // Does the ellipse contain the point (x, y)?.
+ // Does the ellipse contain the point (x, y)?
member this.Contains x y =
((x - cx) * cos alpha + (y - cy) * sin alpha) ** 2.f / a ** 2.f + ((x - cx) * sin alpha - (y - cy) * cos alpha) ** 2.f / b ** 2.f <= 1.f
this.CutAVericalLine 0.f || this.CutAVericalLine width ||
this.CutAnHorizontalLine 0.f || this.CutAnHorizontalLine height
- member this.Scale (factor: float32) =
+ member this.Scale (factor: float32) : Ellipse =
Ellipse(this.Cx, this.Cy, this.A * factor, this.B * factor, alpha)
// Approximation of Ramanujan.
type Cell = {
cellClass: CellClass
center: Point
- infectedArea: int
- stainArea: int
+ nucleusArea: int
+ parasiteArea: int
elements: Matrix<byte> }
[<Struct>]
type Line (a: float32, b: float32) =
member this.A = a
member this.B = b
- member this.Valid = not (Single.IsInfinity this.A)
-[<Struct>]
-type PointF (x: float32, y: float32) =
- member this.X = x
- member this.Y = y
+type MaybeBuilder () =
+ member this.Bind (x, f) =
+ match x with
+ | None -> None
+ | Some a -> f a
+
+ member this.ReturnFrom (x) = x
+
+ member this.TryFinally (body, compensation) =
+ try
+ this.ReturnFrom(body())
+ finally
+ compensation()
+
+ member this.Using (disposable: 'a when 'a :> IDisposable, body) =
+ let body' = fun () -> body disposable
+ this.TryFinally(body', fun () ->
+ match disposable with
+ | null -> ()
+ | disp -> disp.Dispose())
+
+ member this.Zero () =
+ None
+
+ member this.Return (x) =
+ Some x
+let maybe = MaybeBuilder()
\ No newline at end of file