Рисование многоугольника вокруг групп точек данных в MATLAB - PullRequest
6 голосов
/ 12 мая 2010

У меня есть набор точек данных, каждая из которых принадлежит определенному кластеру (группе). Мне нужно нарисовать многоугольник вокруг каждого из этих кластеров. Кто-нибудь знает как это сделать?

Неважно, использую я или нет фактические точки данных для рисования многоугольника. Мне просто нужно, чтобы они были завернуты в многоугольник.

Ответы [ 3 ]

7 голосов
/ 12 мая 2010

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

Например:

x=rand(1,100); %#generate x and y data for your clusters
y=rand(1,100);
k=convhull(x,y); %#generate indices marking the outermost points

hold on
plot(x,y,'b.') %# plot your cluster points
plot(x(k),y(k),'r-') %# plots only k indices, giving the convex hull

Это даст вам многоугольник, индексы которого совпадают с выбросами ваших кластеров.

1 голос
/ 18 сентября 2015

конвульс работает, только если у вас выпуклая форма (например, эллипсоид). Если в вашем распределении данных есть вогнутые кривые, такие как банановая форма, конвульс не будет работать. К счастью, в MATLAB есть функция для обработки этого: alphashape

в зависимости от значения «альфа», вы получите больше или меньше граней в полученном многоугольнике.

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

вместо интерполяции вы можете определить сетку x, y, z, в которой должны просматриваться данные, и спросить, находится ли x, y в альфа-форме? Если это так, присвойте ему значение z = 1, а если нет, присвойте ему значение z = 0., тогда просто обведите контур сетки, где z = 1.

Вы также можете использовать Impoly для рисования многоугольника вручную

hobbysplines на обмене файлами Matlab также позволяет сгладить края многоугольника

1 голос
/ 12 мая 2010

Я не уверен, есть ли готовое решение для этого, поскольку я не слишком знаком с MATLAB, однако, похоже, вам нужно решение с выпуклой оболочкой.

Надеюсь, это направит вас в правильном направлении.

...