算法 {最小覆盖圆}
@LOC: 0
最小覆盖圆
定义
最小覆盖圆/Smallest-circle problem
;
平面内有若干个点, 求一个半径最小的圆 可以覆盖(在圆{上/内})所有的点;
.
可证明答案一定唯一;
性质
错误
算法
代码
__Geometry2D::Circle __MinimumCircleCoverage( const vector< __Geometry2D::Point> & _points){
const int N = _points.size();
vector< int> Ind( N); iota( Ind.begin(), Ind.end(), 0); shuffle( Ind.begin(), Ind.end(), Tools::MT_rand);
__Geometry2D::Circle ANS( _points[ Ind[0]], 0);
for( int i = 1; i < N; ++i){
const auto & pi = _points[ Ind[i]];
if( pi.Get_relation_withCircle( ANS) <= 0){ continue;}
ANS.Center = pi, ANS.Radius = 0;
for( int j = 0; j < i; ++j){
const auto & pj = _points[ Ind[j]];
if( pj.Get_relation_withCircle( ANS) <= 0){ continue;}
ANS.Center = (((__Geometry2D::FreeVector)pi + pj) / 2).End, ANS.Radius = pi.Get_distance( pj) / 2;
for( int k = 0; k < j; ++k){
const auto & pk = _points[ Ind[k]];
if( pk.Get_relation_withCircle( ANS) <= 0){ continue;}
ANS = __Geometry2D::Circle( pi, pj, pk);
}
}
}
return ANS;
} // __MinimumCircleCoverage