function demoVoronoiCell(varargin)
%DEMOVORONOICELL Compute and display voronoi polyhedron using geom3d library
%   This demo show how to manipulate polyhedra, using matlab's voronoin
%   function and the geom3d library.
%   This demo generate some points in a unit cube, computes the 3D voronoi
%   diagram from the germs, and isolate the central cell.
%   This cell is a bounded polyhedron, with polygonal faces. For a better
%   representation of the polyhedron, coplanar faces are merged and a new
%   polyhedron is created and displayed.
%   Usage
%   demoVoronoiCell
%   See also
%   voronoin, delaunayn, convhulln
%   meshReduce, drawPolyhedron
% ------
% Author: David Legland
% e-mail:
% Created: 2009-06-22,    using Matlab (R2008b)
% Copyright 2009 INRA - Cepia Software Platform.

Creation of germs

% germ of the cell of interest, in the center of the unit cube
germ0  = [.5 .5 .5];

% create random germs, and add corners of unit cube to ensure finiteness of
% voronoi pattern
[corners faces] = createCube; %#ok<NASGU>
germs   = [germ0;rand(10, 3);corners];

% dispay the germs
figure(1); clf; hold on;

% graphical settings
axis equal;

Display Voronoi polyhedron associated with germ

% compute voronoi diagram in 3D using Matlab standard function
[V C]   = voronoin(germs);

% the polyhedron corresponding to first germ is given by vertices in C{1}
indVert = C{1};
vertices = V(indVert, :);

% triangular faces can be obtained from convhulln
K = convhulln(vertices);

% draw the polyhedron
drawMesh(vertices, K);

Compute and display minimal polyhedron

% merge some faces to reduce total number of faces.
% new faces are 3D polygons
% K2 is a cell array, each cell containing a row vector with indices of
% 'points' corresponding to vertices of each face.
[V2 F2] = mergeCoplanarFaces(vertices, K);

% display the germs
figure(2); clf; hold on;
set(gcf, 'renderer', 'opengl');

% draw the polyhedron
drawMesh(V2, F2);

% graphical settings
axis equal;