- 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
\ No newline at end of file
+ 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
+
+ member this.Scale (factor: float) =
+ Ellipse(this.Cx, this.Cy, this.A * factor, this.B * factor, alpha)
+
+ // Approximation of Ramanujan.
+ member this.Perimeter =
+ Math.PI * (3.0 * (this.A + this.B) - sqrt ((3.0 * this.A + this.B) * (this.A + 3.0 * this.B)))
+
+ override this.ToString () =
+ sprintf "(cx: %A, cy: %A, a: %A, b: %A, alpha: %A)" this.Cx this.Cy this.A this.B this.Alpha
+
+
+type CellClass = HealthyRBC | InfectedRBC | Peculiar
+
+type Cell = {
+ cellClass: CellClass
+ center: Point
+ elements: Matrix<byte> }
+
+[<Struct>]
+type Line (a: float, b: float) =
+ member this.A = a
+ member this.B = b
+ member this.Valid = not (Double.IsInfinity this.A)
+
+[<Struct>]
+type PointD (x: float, y: float) =
+ member this.X = x
+ member this.Y = y
+