//類似度計算。 //アルゴリズム: //poly1とpoly2を「面積が1」になるように拡大・縮小する。 //外接円の半径r1, r2をそれぞれ求める。 //Abs(Log(r1 / r2))を返す。 private double EvalCircleRadiusLog(Poly poly1, Poly poly2) { if (Math.Abs(poly1.Area) < 1e-9 || Math.Abs(poly2.Area) < 1e-9) { return(1145141919); } Scaling(poly1, 1.0 / Math.Sqrt(Math.Abs(poly1.Area))); Scaling(poly2, 1.0 / Math.Sqrt(Math.Abs(poly2.Area))); FixPoly(poly1, 0.01); FixPoly(poly2, 0.01); Circle c1 = poly1.MinestCoverCircle(); Circle c2 = poly2.MinestCoverCircle(); double r1 = c1.r; double r2 = c2.r; if (r1 < 1e-9 || r2 < 1e-9) { return(1145141919); } return(Math.Abs(Math.Log(r1 / r2))); }