Minimum Width and Area AnnuliThe functions discussed here are direct applications of Voronoi diagrams. The function bool MIN_AREA_ANNULUS (const list<POINT>& L, POINT& center,
POINT& ipoint, POINT& opoint, LINE& l1)
computes the minimum area annulus containing the points
of L. The function returns false if all points
in L are collinear, true otherwise. In the former case a line
passing through the points
in L is returned in l1, and in the latter case the annulus is
returned by its center and a point on the inner and the outer circle,
respectively.
The function bool MIN_WIDTH_ANNULUS (const list<POINT>& L, POINT& center,
POINT& ipoint, POINT& opoint, LINE& l1,LINE& l2)
computes the minimum width annulus containing the points
of L. The function returns false if the minimum width annulus
is a stripe, true otherwise. In the former case the boundaries of the stripe
are returned in l1 and l2, and in the latter case the annulus
is returned by its center and a point on the inner and the outer circle, respectively.
We use the notation Running TimeBoth functions have a running time O(|L|*|L|). They should only be used for small input size.Example Program for Computing Minimum AnnuliThe following program computes the minimum are and minimum width annuli of a set of random points and uses a window to display the result. #include <LEDA/core/list.h>
#include <LEDA/geo/point.h>
#include <LEDA/geo/line.h>
#include <LEDA/geo/circle.h>
#include <LEDA/geo/random_point.h>
#include <LEDA/graphics/window.h>
#include <LEDA/geo/geo_alg.h>
using namespace leda;
int main()
{
list<point> L;
random_points_in_square(100,50,L);
point acenter, aipoint, aopoint;
line al1;
bool not_collinear=MIN_AREA_ANNULUS(L,acenter,aipoint,aopoint,al1);
if (!not_collinear) cout << "All points in L are collinear!" << endl;
point wcenter, wipoint,wopoint;
line wl1,wl2;
bool not_stripe=MIN_WIDTH_ANNULUS(L,wcenter,wipoint,wopoint,wl1,wl2);
if (!not_stripe)
std::cout << "MIN_WIDTH_ANNULUS is stripe!" << std::endl;
window W;
W.init(-110,110,-110);
W.open(); W.display();
W.set_node_width(2);
W.set_line_width(2);
point p;
forall(p,L) W.draw_filled_node(p.to_point());
if (!not_collinear) W.draw_line(al1.to_line(),red);
else {
W.draw_circle(circle(acenter,aipoint),red);
W.draw_circle(circle(acenter,aopoint),red);
}
if (!not_stripe) {
W.draw_line(wl1.to_line(),green);
W.draw_line(wl2.to_line(),green);
}
else {
W.draw_circle(circle(wcenter,wipoint),green);
W.draw_circle(circle(wcenter,wopoint),green);
}
W.read_mouse();
W.screenshot("minimum_annulus");
return 0;
}
|
See also:Writing Kernel Independent Code Manual Entries |