I don't have a complete answer, but wanted to make you aware of this package: https://github.com/Voxel8/Voronoi.jl
On Tue, Feb 2, 2016 at 7:23 AM, Robert DJ <[email protected]> wrote: > Hi, > > I am looking for way to work with Voronoi tesselations. I have a set of 2D > points where the stored order is not important, but has to be preserved in > the final result. > I would like to compute the bounded Voronoi tesselation of the points > (i.e., the Voronoi tesselation intersected with a bounding box) and > > - compute the corners of each Voronoi cell (which may be on the bounding > box). > - compute the area of each Voronoi cell; the vector of areas should be in > the same order as the Voronoi centers. > > (If the corners of the cells are returned in a data structure that is > ordered like the Voronoi centers, the second point is of course obsolete). > > The VoronoiDelaunay package computes the corners of each Voronoi cell, but > it would require post-processing to reorder and calculate the intersection > with a bounding box. > > I've looked into two alternatives that motivate the second part of the > title: > > - Qhull computes the corners of each Voronoi cell and as I recall from > Matlab they are ordered as I need. Unfortunately, I can't even figure out > how to compile Qhull and other posts around here suggest that Qhull is not > easy to work with... > > - The R package deldir is a wrapper for a Fortran library and (in R) it > returns exactly what I need. I've written a function that calls the Fortran > library, but Julia segfaults and I can't figure out why. > > If I can make it work easily, I think that calling an external library > would be a quick solution here and now. But maybe I have overlooked a > better way? > > Best, > > Robert > > > > The easiest way to get the shared Fortran library from deldir is probably > to install the R package: > install.package("deldir") > > The Julia function that calls the Fortran library gives a few warnings of > the type > WARNING: convert(::Type{Ptr}, ::Int64) methods should be converted to be > methods of unsafe_convert > Changing every integer and Int-type to Int32 doesn't remove the warning. > > All the variables needed by the Fortran "master" function are copied from > the R script/wrapper without dwelving into their background. I don't know > what the "master" function returns; first I just want it not to crash. > > # Mac > const libdeldir = > "/Library/Frameworks/R.framework/Versions/3.2/Resources/library/deldir/libs/deldir.so" > # Linux > const libdeldir = expanduser( > "~/R/x86_64-pc-linux-gnu-library/3.2/deldir/libs/deldir.so") > > function deldir(x::Vector{Float64}, y::Vector{Float64}; > sort::Int32=1, rw::Vector{Float64}=[0.0;1.0;0.0;1.0], > epsi::Float64=1e-9 ) > > @assert (num_points = length(x)) == length(y) "Coordinate vectors must > be of equal length" > @assert epsi >= eps(Float64) > > # Dummy points > num_dum_points = 0 > npd = num_points + num_dum_points > > # The total number of points > ntot = npd + 4 > > X = [zeros(4); x; zeros(4)] > Y = [zeros(4); y; zeros(4)] > > # Set up fixed dimensioning constants > ntdel = 4*npd > ntdir = 3*npd > > # Set up dimensioning constants which might need to be increased: > madj = max( 20, ceil(Int32,3*sqrt(ntot)) ) > tadj = (madj+1)*(ntot+4) > ndel = Int32( madj*(madj+1)/2 ) > tdel = 6*ndel > ndir = ndel > tdir = 8*ndir > > nadj = zeros(Int32, tadj) > ind = zeros(Int32, npd) > tx = zeros(Float64, npd) > ty = zeros(Float64, npd) > ilist = zeros(Int32, npd) > delsgs = zeros(Float64, tdel) > delsum = zeros(Float64, ntdel) > dirsgs = zeros(Float64, tdir) > dirsum = zeros(Float64, ntdir) > nerror = Int32[1] > > ccall( (:master_, libdeldir), Void, > (Ptr{Float64}, Ptr{Float64}, Ptr{Int32}, Ptr{Float64}, Ptr{Int32}, > Ptr{Int32}, Ptr{Int32}, Ptr{Int32}, Ptr{Int32}, Ptr{Float64}, Ptr{Float64 > }, > Ptr{Int32}, Ptr{Float64}, Ptr{Float64}, Ptr{Int32}, Ptr{Float64}, > Ptr{Float64}, Ptr{Int32}, Ptr{Float64}, Ptr{Int32}), > X, Y, &sort, rw, npd, > &ntot, nadj, &madj, ind, tx, ty, > ilist, &epsi, delsgs, ndel, delsum, > dirsgs, &ndir, dirsum, nerror > ) > end > > >
