Проблемы с данными 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.