e27f7d0760dff6a765b15ce10c5b44358d8e84ee
9 type Ellipse (cx
: float, cy
: float, a
: float, b
: float, alpha
: float) =
14 member this
.Alpha = alpha
15 member this
.Area = a
* b
* Math.PI
17 // Does the ellipse contain the point (x, y)?.
18 member this
.Contains x y
=
19 ((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
21 member this
.CutAVericalLine (y
: float) : bool =
22 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
24 member this
.CutAnHorizontalLine (x: float) : bool =
25 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
27 member this
.isOutside
(width
: float) (height
: float) =
28 this
.Cx < 0.0 || this.Cx >= width
||
29 this.Cy < 0.0 || this.Cy >= height
||
30 this.CutAVericalLine 0.0
|| this.CutAVericalLine width ||
31 this.CutAnHorizontalLine 0.0
|| this.CutAnHorizontalLine height
33 member this.Scale (factor
: float) =
34 Ellipse(this.Cx, this.Cy, this.A * factor
, this.B * factor
, alpha)
36 // Approximation of Ramanujan.
37 member this.Perimeter =
38 Math.PI * (3.0 * (this.A + this.B) - sqrt
((3.0 * this.A + this.B) * (this.A + 3.0 * this.B)))
40 override this.ToString () =
41 sprintf
"(cx: %A, cy: %A, a: %A, b: %A, alpha: %A)" this.Cx this.Cy this.A this.B this.Alpha
44 type CellClass = HealthyRBC | InfectedRBC | Peculiar
49 elements
: Matrix<byte
> }
52 type Line (a
: float, b
: float) =
55 member this.Valid = not
(Double.IsInfinity this.A)
58 type PointD (x: float, y
: float) =