Рассчитать площадь ячейки Вороного

Я пытаюсь рассчитать площадь каждой ячейки Вороного в Matlab, но я застрял. Я нашел этот код в Интернете:

[v , c] = voronoin(sdata);
for i = 1 : size(c ,1)
  ind = c{i}';
  tess_area(i,1) = polyarea( v(ind,1) , v(ind,2) );
end

Этот код не работает, потому что одна из точек в v — это [Inf,Inf]. Это точка в бесконечности. Как я могу обойти эту проблему?


person user1380978    schedule 08.05.2012    source источник


Ответы (3)


Согласно примеру в документации для voronoin, первой точкой v всегда будет [Inf, Inf]. Вот цитата:

Первая строка V — это бесконечно удаленная точка. Если какой-либо индекс в ячейке массива ячеек равен 1, то соответствующая ячейка Вороного содержит первую точку в V, точку в бесконечности. Это означает, что ячейка Вороного неограничена.

Если вы хотите использовать 'polyarea' в вершинах v без получения NaN, тогда мой наивный ответ состоит в том, чтобы отрезать первую строку v, прежде чем вводить ее в 'polyarea':

 sdata = [ 0.5    0
      0      0.5
     -0.5   -0.5
     -0.2   -0.1
     -0.1    0.1
      0.1   -0.1
      0.1    0.1 ]
[v , c] = voronoin(sdata);
for i = 1 : size(c ,1)
  ind = c{i}';
  tess_area(i,1) = polyarea( v(2:end,1), v(2:end,2))
end

Но если это не то, что вы имели в виду под «не работает», то, возможно, вы могли бы подробнее рассказать о том, что вы ожидали увидеть?

person kitchenette    schedule 08.05.2012

это может избежать NaN:

      [ v, c] = voronoin ( sdata );
       tess_area=zeros(size(c,1),1);

       for i = 1 : size(c ,1)
          ind = c{i}';
         if ind~=1
          tess_area(i,1) = polyarea( v(ind,1) , v(ind,2) );
         end
       end
person Sarah Al-Jawhari    schedule 24.10.2013

Вам необходимо определить границы интересующего вас пространства. Например, если вы нарисуете квадрат, окружающий ваши клетки вороного, в зависимости от размера вашего квадрата, клетки будут иметь разные площади.

Разбиение Вороного само по себе не может устанавливать внешние границы ячеек.

Если в Matlab есть функция пересечения полигонов, то это должно быть легко сделать. Некоторые соответствующие темы могут быть:

пересечение и объединение полигонов

Что такое простой способ вычислить перекрытие между изображением и многоугольником?

Если в Matlab этого нет, вы можете вручную вычислить пересечение между линиями Вороного и граничными линиями вашего многоугольника, а затем вычислить новый многоугольник на основе этого, из которого вы затем вычисляете площадь.

person user985366    schedule 01.06.2015