Получить верхнюю границу выпуклой оболочки как функцию в 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
Выход: