평면 위에서 주어진 점집합을 포함하는 가장 작은 원을 찾는 문제는 가장 단순하게는 임의의 두 점이 지름이 되는 원과 임의의 세 점이 만드는 외접원을 모두 조사하여 찾으면 된다. 따라서 $O(n^4)$의 복잡도를 가질 것이다. 그러나 이 문제는 점집합의 갯수에 비례하는 시간 복잡도($O(n)$)를 가지는 알고리즘이 알려져 있고, 여기서는 재귀적 방법을 이용한 Welzl's algorithm을 구현한다.
int MinEncCir ( CfPt *P, int n, CfPt* boundary, int b, CfPt& center, double& rad ) {
// exiting cases
if ( b == 3 ) CalcCircle3 ( boundary, center, rad ); // a circle passing 3 points;
else if ( ( n == 1 ) && ( b == 0 ) ) {
rad = 0; b = 1;
center = boundary[0] = P[0];
}
else if ( ( n == 2 ) && ( b == 0 ) ) {
boundary[0] = P[0]; boundary[1] = P[1]; b = 2;
CalcCircle2 (boundary, center, rad ); // a circle with diagonal consisting of 2 points;
}
else if ( ( n == 0 ) && ( b == 2 ) ) {
CalcCircle2 ( boundary, center, rad );
}
else if ( ( n == 1 ) && ( b == 1 ) ) {
boundary[1] = P[0]; b = 2;
CalcCircle2 ( boundary, center, rad );
}
else {// general case; ( b < 3 ) && ( n + b > 2 )
// choose a random pivot;
int k = rand() % n;
if ( k != 0 ) SWAP( P[0], P[k] );
int b1 = MinEncCir ( &P[1], n - 1, boundary, b, center, rad );
if (!InCircle(P[0], center, rad) ) {
// Now, P[0] belongs to the boundary.
boundary[b++] = P[0];
return MinEncCir ( &P[1], n - 1, boundary, b, center, rad );
} else return b1;
}
return b;
}
728x90
'Computational Geometry' 카테고리의 다른 글
Approximate Minimum Enclosing Circle (1) | 2021.03.18 |
---|---|
Minimum Bounding Rectangle (3) | 2021.03.15 |
Creating Simple Polygons (0) | 2021.01.25 |
단순 다각형의 Convex Hull (0) | 2021.01.24 |
단순 다각형의 무게중심 (0) | 2021.01.24 |