2013-04-15 6 views
2

Мне приходилось вычислять любые полигоны, заданные в виде «х-вектора», «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 

Функция работает с любым выпуклым многоугольником, но есть вогнутые многоугольники это работать (как «звезды») например. Что можно улучшить в моем решении? спасибо

+0

Вы также хотите, чтобы иметь возможность рассчитать вогнутые полигоны? Непонятно (по крайней мере для меня), что вам нужно больше. Если вам нужны вогнутые полигоны, вы можете триангулировать .. – Acorbe

+1

Кроме того, мне кажется, что у вас есть только рекурсивный звонок, не так ли? Всегда верно, что любое рекурсивное отношение может быть записано в итеративных терминах; это особенно верно, когда у вас есть только один рекурсивный вызов. Итеративный алгоритм здесь определенно будет более эффективным. – Acorbe

+0

Если было не ясно (поскольку мой ник говорит, что я не проффессиональный) миссия сказывается только на рекурсивных вызовах (не итеративно, так как практик дал задание об рекурсивных вызовах). Функция должна иметь возможность вычислять площадь каждого многоугольника (как вогнутых многоугольников, так и выпуклых многоугольников) с n кординатами (n - число в сети, не превышающее 2). –

ответ

1

Я думаю, что вам нужно изменить эту строку:

farea=prevsum+abs(det(mat))/2; 

к

farea=prevsum+det(mat)/2; 

Подобно этому, вогнутости в вашем многоугольник будет добавлять или вычитать участки в соответствии с тем, что направление их подметать 0 ..2 π область. Чтобы обеспечить окончательные положительные значения для вашего региона, должно быть что-то вроде areaofit=abs(prevsum);

+0

Это работает. Как я могу объяснить это практикующему? –

+0

Ну, аналитическая формула для площади треугольника «содержит» порядок сканирования углов. Если вы поместите углы треугольника в порядке против часовой стрелки в своей матрице, область будет положительной, в противном случае она будет отрицательной. Теперь, если вы посмотрите на свой вогнутый многоугольник, «полные» - то есть выпуклые углы всегда находятся в порядке против часовой стрелки, а «пустые» - то есть вогнутые углы - по часовой стрелке. Подобно этому вы вычитаете из области выпуклой оболочки все вогнутые отверстия. – 2013-04-15 19:59:59

+0

Спасибо, что ответили так быстро. Я не уверен, что «вогнутые углы» поставлены в порядке против часовой стрелки, но, кроме того, почему площадь углов по часовой стрелке положительна, а углы против часовой стрелки отрицательны? еще раз спасибо :) –

Смежные вопросы