Получить верхнюю границу выпуклой оболочки как функцию в MATLAB?

введите описание изображения здесь

На рисунке выше приведен график следующих функций:

  • выпуклый корпус в красном
  • граница синим цветом и
  • разбросать как фиолетовые точки.

Я хочу создать функцию, которая будет возвращать "у" для каждого "х", принимая выпуклый Hull в качестве математической функции.

Поскольку каждому x соответствует 2 точки, необходимо взять ту, которая имеет более высокое значение y.

1 ответ

Один из способов вычислить y для x - запустить цикл по выпуклым краям корпуса. Если вертикальная линия, расположенная в точке x, пересекает край, найдите координату y пересечения. В конце выведите максимум таких значений y. Некоторый код с комментариями:

vx = [3 7 4 8 5 9 2 6 5 3];   % test data
vy = [2 4 1 3 2 5 2 6 5 4];   % test data
cvx = convhull(vx, vy);
X = vx(cvx); Y = vy(cvx);     % boundary of convex hull

x = 4.2;                      % test point
y = min(vy);                  % y starts at minimal value of all y-coords
for (i=1:numel(cvx)-1)
    if sign(X(i)-x) ~= sign(X(i+1)-x)     % if x is between X(i) and X(i+1)
        yc = Y(i+1)*(X(i)-x)/(X(i)-X(i+1)) + Y(i)*(x-X(i+1))/(X(i)-X(i+1));  
        y = max(y, yc);       % compare to linear interpolant yc, take larger
    end
end

hold on
plot(vx, vy, 'o')            
plot(X, Y)
plot(x, y, 'r*')
hold off

Выход:

выпуклый

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