Problems with 2D qhull voronoi patch data

395 views Asked by At

I am trying to write code for Voronoi patches. This works fine with Matlab as seen below:

<!-- language: lang-Matlab -->
z = cat(2, x,y); 
[V, C] = voronoin(z);
for i = 1:length(C)
    if any( C{i} == 1)
        continue
    else
        Cnew = [Cnew, i];
    end
end

for i = 1:length(Cnew)
    xx = V( C{Cnew(i)} , 1);
    yy = V( C{Cnew(i)} , 2);
    disp(i), disp(xx), disp(yy)
    plot(xx,yy, 'Color', 'blue')
end

which is actually what I want!

However, since Matlab calls qhull, I wanted to use it directly, so that I can create a free version for my friends. So I used qhull directly from the commandline, and used its output to do the plotting. This is the result:

Now this is obviously wrong. So the relevant code for obtaining this is as follows:

The command that I use on the command line (for the same set of data points) is the following:

qvoronoi o QJ Fo < data.txt > output.txt

As can be seen, some the the vertices are not correct, although the majority of the vertices are ok ...

The relaxant part of the code used for this plot is the following:

for pD in pData:
    if 0 in pD: continue
    pD = pD + [pD[0]]
    x, y = np.array([vData[i] for i in pD]).T
    pl.plot(x,y, color='blue')
pl.show()

Here, pData are the "patch" information that looks like this:

In [6]: pData[:10]
Out[6]:
[[6, 312, 280, 228, 0, 163, 311],
 [4, 0, 228, 230, 229],
 [8, 0, 100, 101, 20, 21, 19, 70, 163],
 [5, 314, 281, 70, 163, 311],
 [4, 0, 18, 160, 229],
 [4, 282, 19, 70, 281],
 [4, 161, 157, 18, 160],
 [5, 103, 99, 101, 100, 102],
 [6, 101, 20, 76, 75, 37, 99],
 [6, 0, 100, 102, 41, 40, 356]] 

While vData are the vertices which look like that:

In [7]: vData[:10]
Out[7]:
[[-10.101, -10.101],
 [475.0000000012008, 522.999999964199],
 [465.1459330246624, 450.7368421188263],
 [537.1737804542415, 426.2004572957462],
 [477.2870813371678, 434.0427631710093],
 [484.6180167742115, 54.98463685526782],
 [433.9793388408901, 439.3090909117672],
 [399.2310513506661, 466.2359413331789],
 [417.877358491973, 465.8773584984193],
 [461.9861308542621, 410.6663110455131]]

This information is obviously not correct. I am guessing that the problem is with the way in which I am calling qhull. Maybe I am not using the right flags? Can someone throw some light on the subject please??

Some specifications about the system I am working on: Windows 7 Matlab version R2010A Python 2.7

I actually use Python's subprocess module to run a DOS shell command to get the values directly from Qhull. That part is as follows:

# Execute qvoronoi to get the vertices and patches
p = subP.Popen('bin\qvoronoi o %s < %s'%(params, fileName), \
                shell=True, \
                stdout=subP.PIPE, \
                stderr=subP.STDOUT)
lines  = p.stdout.readlines()
retval = p.wait()

However, this part is working properly. I have already verified this.

Note: I cannot post images. Apparently this is a "reputation" thing. If you want to see the images, please feel free to ask ...

1

There are 1 answers

0
ssm On

turns out that the latest version of SciPy contains voronoi in the scipy.spatial module. As the documentation says, it is new in version 0.12.0. Now you can download the latest version of Scipy and directly use this function. quick note: this is going to return some vertices with a -1 for infinite vertices, and may return empty arrays, which is a little annoying.

Unfortunately I still don't know how to use Qhull properly.