Проблемы с данными 2D патча qhull voronoi

Я пытаюсь написать код для патчей Вороного. Это прекрасно работает с Matlab, как показано ниже:

<!-- 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

что на самом деле то, что я хочу!

Однако, поскольку Matlab вызывает qhull, я хотел использовать его напрямую, чтобы создать бесплатную версию для своих друзей. Поэтому я использовал qhull непосредственно из командной строки и использовал ее вывод для построения графиков. Это результат:

Теперь это явно неправильно. Таким образом, соответствующий код для получения этого выглядит следующим образом:

Команда, которую я использую в командной строке (для того же набора точек данных), выглядит следующим образом:

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

Как видно, некоторые вершины не верны, хотя большинство вершин в порядке...

Релаксантная часть кода, используемого для этого сюжета, выглядит следующим образом:

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()

Здесь pData - это информация о "патче", которая выглядит следующим образом:

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]] 

В то время как vData - это вершины, которые выглядят так:

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]]

Эта информация явно не верна. Я предполагаю, что проблема в том, как я называю qhull. Может быть, я не использую правильные флаги? Может кто-нибудь пролить свет на эту тему, пожалуйста??

Некоторые характеристики системы, над которой я работаю: Windows 7 Matlab версия R2010A Python 2.7

Я на самом деле использую модуль подпроцесса Python для запуска команды оболочки DOS, чтобы получить значения непосредственно из Qhull. Эта часть выглядит следующим образом:

# 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()

Тем не менее, эта часть работает правильно. Я уже подтвердил это.

Примечание: я не могу публиковать изображения. Видимо, это "репутация". Если вы хотите увидеть изображения, пожалуйста, не стесняйтесь спрашивать...

1 ответ

Оказывается, что последняя версия SciPy содержит вороной в модуле scipy.spatial. Как сказано в документации, она новая в версии 0.12.0. Теперь вы можете скачать последнюю версию Scipy и напрямую использовать эту функцию. быстрое примечание: это вернет некоторые вершины с -1 для бесконечных вершин и может вернуть пустые массивы, что немного раздражает.

К сожалению, я до сих пор не знаю, как правильно использовать Qhull.

Другие вопросы по тегам