I'm trying to generate an artificial grain structure for simulation purposes. Therefore I used a Voronoi tesselation. It didn't look bad but when I looked into details, some parts did not satisfy.
When plotting a histogram of the area-sizes of the Voronoi mesh that are 100% within specified borders, the results will be a lognormal distribution. Plotting the radius of equisized circles of those areas, the result is a normal distribution.
In reality, this is not the case. In reality the area probability function is also lognormal but much wider. For Voronoi, the ratio between the peak and maximum value is like 2.5-3, but in reality this ratio is more like 6-7, which results that even the radii distribution, which is ~sqrt(A), is a lognormal distribution instead of a normal distribution as in the voronoi case.
I tried very much to get a Voronoi tesselation where the radii distribution matches my desired lognormal distribution.
My best results so far, was done by packing random sized spheres (between a minimum and maximum radius) in a specific area, which will results in a hyperbolic size distribution, and to use those seeds as input for the Voronoi tesselation. With this technique the results look like this:
Spheres in Area for Voronoi seed input:
Voronoi tesselation of sphere seeds:
The problem now is following: The Voronoi algorithm draws the normal half way the connecting line between the lines connecting the seeds (I know its connecting the middle points of the spheres from Delaunay). Since that half way split is not the same point where the original spheres touched, original large spheres become smaller and original small spheres become larger polygons, but the worst part is that, since a large sphere has many neighbours in most cases, that the Voronoi polygons of those neighbours are stretched in radius direction of the large sphere due to the fact that small spheres come enlarged polygons and larger ones become smaller ones.
To compensate for the size discrepancy between spheres and Voronoi I have to use larger spheres then intended to compensate the "Voronoi shrink" of the larger ones which leads even more to this tendency of polygon stretching.
You can see this in my example picture below:
Example picture of polygon stretching near large neighbours:
This can also be observed in my second image, the Voronoi tesselation. The smaller poygons beneath the largest ones always tend to have a distinct shape anisotropy along the radius of the large grains and this is not intended to be. I want a Voronoi mesh, matching my desired distribution but the mesh itself should be homogeneous without any shape anisotropy or any clustering.
Does anybody has an idea how to modify my resent approach or a totally different approach which leads to the desired result? Maybe just some hinds how to proceed since it seems to be not a trivial problem.
If you construct the Power Diagram (which is closely related to the Voronoi diagram), you can associated weights to the vertices of the diagram and the boundaries between the cells are shifted according to the relative weights. In your case, you can weight your cells by the size of the circles/spheres that you are packing and you should get the result you are looking for.
One implementation of this is in CGAL (called regular triangulation which is the dual generalization of the Delaunay triangulation): you can see an example specifying weights with the vertices here.
If you look Figure 7 (below) from this paper Larysa Burtseva by Frank Werner shows the power diagram in a situation very similar to yours.