module Types open System open System.Drawing open Emgu.CV open Emgu.CV.Structure type Ellipse (cx: float, cy: float, a: float, b: float, alpha: float) = member this.Cx = cx member this.Cy = cy member this.A = a member this.B = b member this.Alpha = alpha member this.Area = a * b * Math.PI // Does the ellipse contain the point (x, y)?. member this.Contains x y = ((x - cx) * cos alpha + (y - cy) * sin alpha) ** 2.0 / a ** 2.0 + ((x - cx) * sin alpha - (y - cy) * cos alpha) ** 2.0 / b ** 2.0 <= 1.0 member this.CutAVericalLine (y: float) : bool = a ** 2.0 + b ** 2.0 - 2.0 * y ** 2.0 + 4.0 * y * cx - 2.0 * cx ** 2.0 + a ** 2.0 * cos (2.0 * alpha) - b ** 2.0 * cos (2.0 * alpha) > 0.0 member this.CutAnHorizontalLine (x: float) : bool = a ** 2.0 + b ** 2.0 - 2.0 * x ** 2.0 + 4.0 * x * cy - 2.0 * cy ** 2.0 - a ** 2.0 * cos (2.0 * alpha) + b ** 2.0 * cos (2.0 * alpha) > 0.0 member this.isOutside (width: float) (height: float) = this.Cx < 0.0 || this.Cx >= width || this.Cy < 0.0 || this.Cy >= height || this.CutAVericalLine 0.0 || this.CutAVericalLine width || this.CutAnHorizontalLine 0.0 || this.CutAnHorizontalLine height type CellClass = HealthyRBC | InfectedRBC | Peculiar type Cell = { cellClass: CellClass center: Point elements: Matrix } [] type Line (a: float, b: float) = member this.A = a member this.B = b [] type PointD (x: float, y: float) = member this.X = x member this.Y = y