ccvt_reflect, a MATLAB code which allows the user to specify certain parameters, and then creates a Constrained Centroidal Voronoi Tessellation (CCVT) of points in a region, using a special reflection technique to try to attract some points to move to the boundary.

The standard CVT algorithm will tend to place points uniformly inside the region, but will never place points on the boundary. However, in many cases, it would be very desirable to smoothly modify the set of points so that some of them fall on the boundary. This is the case, for instance, when the points are to be used to triangulate the region and define a finite element grid.

The method for doing this relies on the observation that the generator points become uniformly distributed because they "push" each other away, by grabbing sample points. The generator points do not approach the boundary too closely, because there are no sample points on the other side of the boundary. In essence, the boundary also "pushes" the generator points away. By making "reflected" sample points whenever a generator is near the boundary, we essentially neutralize the boundary effect, allowing the generator points in the interior to push a layer of generators onto the boundary. In most cases, once a point hits the boundary, it will not leave, although it may continue to adjust its position on the boundary itself.

This program is a "work in progress". Currently, only a simple 2D box region has been examined. The next step is to work on more general 2D regions; then to make the natural extension to 3D or arbitrary dimension.

CCVT_REFLECT is an experimental code; so far, the experiment is not doing well. I haven't figured out yet how to make the points behave as well as they do for CCVT_BOX. The idea is, though, that the method of pulling points to the boundary seems fairly natural and flexible to me, so maybe I just need to find the right way to implement it.


The computer code and data files described and made available on this web page are distributed under the MIT license


ccvt_reflect is available in a MATLAB version.

Related Data and Programs:


cvt_1d_lloyd, a MATLAB code which computes an N-point Centroidal Voronoi Tessellation (CVT) within the interval [0,1], under a uniform density.

cvt_1d_sampling, a MATLAB code which computes an N-point Centroidal Voronoi Tessellation (CVT) within the interval [0,1], under a uniform density, using sampling to estimate the Voronoi regions.

florida_cvt_geo, MATLAB codes which explore the creation of a centroidal Voronoi Tessellation (CVT) of the state of Florida, based solely on geometric considerations.


  1. Franz Aurenhammer,
    Voronoi diagrams - a study of a fundamental geometric data structure,
    ACM Computing Surveys,
    Volume 23, Number 3, September 1991, pages 345-405.
  2. John Burkardt, Max Gunzburger, Janet Peterson, Rebecca Brannon,
    User Manual and Supporting Information for Library of Codes for Centroidal Voronoi Placement and Associated Zeroth, First, and Second Moment Determination,
    Sandia National Laboratories Technical Report SAND2002-0099,
    February 2002.
  3. Qiang Du, Vance Faber, Max Gunzburger,
    Centroidal Voronoi Tessellations: Applications and Algorithms,
    SIAM Review,
    Volume 41, Number 4, December 1999, pages 637-676.
  4. Qiang Du, Max Gunzburger, Lili Ju,
    Meshfree, Probabilistic Determination of Point Sets and Support Regions for Meshfree Computing,
    Computer Methods in Applied Mechanics in Engineering,
    Volume 191, 2002, pages 1349-1366.
  5. Lili Ju, Qiang Du, Max Gunzburger,
    Probabilistic methods for centroidal Voronoi tessellations and their parallel implementations,
    Parallel Computing,
    Volume 28, 2002, pages 1477-1500.

Source Code:

Last revised on 02 January 2019.