I want to find all of the largest empty circles, which pass through any 3 points in a large list of points (~50). I have a code already, with which I have attempted to arrive at a proper solution, but my algorithm does not check for all empty circles accurately. It only checks if there are circles in a sequence of 3 points starting at the highest y-value and continuing all the way down the list of points in this manner.
i.e. first check (1,2,3); second check (2,3,4); third check (3,4,5); etc.
This is not feasible since we could have an empty circle corresponding to points (1,3,6) for example. This is not a sequence of three indices.
What is the proper algorithm to use in this case?
I am not sure what you mean by "largest empty circles". Empty of what? However, if the actual question you are asking is how to list all possible combinations of three points chosen from a set of about 50, that is easily done. I assume the numerals you used to identify the points are indices. Just call on matlab's 'nchoosek' function to get all possible combinations of three indices out of a set.
c = nchoosek(1:n,3);
where n is the number of points. The output 'c' will be an array of size n*(n-1)*(n-2)/6 by 3. Each row will have a different combination of three distinct indices ranging from 1 to n.
You don't have to try all combinations. You just need to calculate the Delaunay triangulation. Assuming that no 4 points lie on the same circle (which is a very reasonable assumption, since you could always just slighly perturb them if they do), then every triangle that does not contain any other points in it is part of the Delaunay triangulation, and this Delaunay triangulation is unique.
In other words, given some points in a plane, the Delaunay triangulation consists of all the triangles whose circumcircles do not contain other points, and any triangle whose circumcircle does not contain other points, must be part of the Delaunay triangulation.
n = 50; x = rand(n,1); y = rand(n,1); dt = delaunayTriangulation(x,y) triplot(dt); hold all; plot(x,y,'ko');