--- /dev/null
+module MatchingEllipses
+
+open System
+open System.Linq
+open System.Collections.Generic
+
+open Types
+open Utils
+
+
+type EllipseScore = { mutable matchingScore: float; e: Ellipse }
+
+let matchingScoreThreshold1 = 0.5
+let matchingScoreThreshold2 = 2.0
+
+let ellipseArea e = e.a * e.b * Math.PI
+
+type MatchingEllipses () =
+ let ellipses = List<EllipseScore>()
+
+ member this.Add (e: Ellipse) =
+
+ // dprintfn "new ellipse: %A, nb: %A" e ellipses.Count
+
+ let areaE = ellipseArea e
+
+ let mutable matchingScoreE = 0.0
+
+ for other in ellipses do
+ let areaOther = ellipseArea other.e
+ let commonArea = EEOver.EEOverlapArea e other.e
+ let matchingScore = (2.0 * commonArea / (areaE + areaOther)) ** 2.0
+ if matchingScore >= matchingScoreThreshold1
+ then
+ other.matchingScore <- other.matchingScore + matchingScore
+ matchingScoreE <- matchingScoreE + matchingScore
+ printfn "Score"
+
+ ellipses.Add({ matchingScore = matchingScoreE; e = e })
+
+ member this.Ellipses : Ellipse list =
+ dprintfn "Number of ellipse: %A" ellipses.Count
+
+ (*let sortedEllipses =
+ List.filter (fun e -> e.matchingScore >= matchingScoreThreshold2) (List.ofSeq ellipses)
+ |> List.sortWith (fun e1 e2 -> e2.matchingScore.CompareTo(e1.matchingScore))*)
+
+ List.filter (fun e -> e.matchingScore >= matchingScoreThreshold2) (List.ofSeq ellipses)
+ |> List.sortWith (fun e1 e2 -> e2.matchingScore.CompareTo(e1.matchingScore))
+ |> List.map (fun { e = e } -> e)
+
+ // ellipses.Where(fun e -> e.matchingScore >= matchingScoreThreshold2)
+ // ([], fun acc { matchingScore = score; e = e } -> if score >= matchingScoreThreshold2 then e :: acc else acc)
+
+
+
+