I am working with Voronoi diagrams limited to a section of plane (so that I can measure areas of regions, and they don't go off to infinity), and I'm considering only integer co-ordintes in this exercise.
Here's the problem:
I have an existing Voronoi tessellation and I want to add a new point (xi, yi) such that the new region created by this point has the maximum possible area.
Now, what I came up with was a brute force solution, which will run for each possible point (considering integers only), and calculate area of new region.
I wrote the code in python and here is one example I tested:
I have 5 vertices: [[-5, 7], [ 2, 5], [-6, -2], [ 7, 2], [-4, 6]] and their Voronoi tessellation is (numbers in red denote area of that region):
I tried brute force approach for vertices in range [-5,5) along X-axis and [-5,5) along Y-axis, and calculated that with vertex (1, -5) we get maximum possible area: 47.81
I tried to search a lot on how to optimize my approach further from brute force, but couldn't find any direction. Could someone kindly guide me on the mathematical and programming strategies to address this problem? Any insights would be greatly appreciated.


I suggest to - instead of considering each possible allowed point as a candidate for the new point and calculating the area for each of those precisely (which would be the naive brute-force approach, most definitely infeasible for any reasonably "large" planes/grids) - simply choose granularity levels for which you deem the trade-off between runtime and accuracy/optimality of results to be good.
The following code allows to control both the sparsity of the candidates to consider for the new point (controllable via the parameter
alpha, meaning considering only pixels at indices divisible byalpha, e.g.alpha=1means every pixel is considered,alpha=2means only a quarter of the pixels are considered, etc.) as well as the granularity of the area calculation (controllable via the parameterbeta, meaning only using pixels at indices divisible bybetato assign to clusters for the purpose of area calculation, e.g.beta=1would give full precision). I.e. higher values give worse but faster results. The algorithm simply picks whichever candidate point results in the highest area (approximated as the share of pixels assigned to it).For the sake of demonstration, the additional constraint of "integer coordinates" is ignored (as the adaptation should be straight-forward & that wasn't what I wanted to focus on here), and only a small number of points as well as only a small plane is considered.
The original voronoi diagram looks as follows:
To visualize the effects of the two "degrees of freedom" for this approach, I chose to visualize each combination of 4 different values for
alpha(a, varying across columns) andbeta(b, varying across rows) (32, 16, 8 and 4). The red dots show the points considered (effect of alpha), and the red line shows the boundary of the points used for the area calculation (effect of beta). The value p is percentage of the pixels that belong to the new point, and the value t is the time it took to compute the new point, in miliseconds. As you can see, the percentage is overall increasing as alpha and beta are decreased, as expected.