Мне приходилось вычислять любые полигоны, заданные в виде «х-вектора», «y-vector» (только я знаю, что кординаты упорядочены по часовой стрелке, а полигоны, такие как песочные часы, не включены). Я пытался писать этот код:Вычислить область многоугольника рекурсивно
function [areaofit] = Polygarea(xs,ys,cor,prevsum)
if(length(xs)~=length(ys))
disp('dimentions error!please try again');
end
if(nargin==2)
cor=1;
prevsum=0;
end
if(cor==length(xs)-1)
areaofit=prevsum;
figure(1);
fill(xs,ys,'r');
title(['Area = ' num2str(areaofit)]);
end
if(cor~=length(xs)-1)
mat=[xs(1) ys(1) 1;zeros(2,3)];
for k=2:3
mat(k,1)=xs(cor+k-1);
mat(k,2)=ys(cor+k-1);
mat(k,3)=1;
end
farea=prevsum+abs(det(mat))/2;
Polygarea(xs,ys,cor+1,farea);
end
Функция работает с любым выпуклым многоугольником, но есть вогнутые многоугольники это работать (как «звезды») например. Что можно улучшить в моем решении? спасибо
Вы также хотите, чтобы иметь возможность рассчитать вогнутые полигоны? Непонятно (по крайней мере для меня), что вам нужно больше. Если вам нужны вогнутые полигоны, вы можете триангулировать .. – Acorbe
Кроме того, мне кажется, что у вас есть только рекурсивный звонок, не так ли? Всегда верно, что любое рекурсивное отношение может быть записано в итеративных терминах; это особенно верно, когда у вас есть только один рекурсивный вызов. Итеративный алгоритм здесь определенно будет более эффективным. – Acorbe
Если было не ясно (поскольку мой ник говорит, что я не проффессиональный) миссия сказывается только на рекурсивных вызовах (не итеративно, так как практик дал задание об рекурсивных вызовах). Функция должна иметь возможность вычислять площадь каждого многоугольника (как вогнутых многоугольников, так и выпуклых многоугольников) с n кординатами (n - число в сети, не превышающее 2). –