--- a +++ b/combinedDeepLearningActiveContour/functions/polycenter.m @@ -0,0 +1,79 @@ +function [area,cx,cy] = polycenter(x,y,dim) + +%POLYCENTER Area and centroid of polygon. +% [AREA,CX,CY] = POLYCENTER(X,Y) returns the area and the centroid +% coordinates of the polygon specified by the vertices in the vectors X +% and Y. If X and Y are matrices of the same size, then POLYCENTER +% returns the centroid and area of polygons defined by the columns X and +% Y. If X and Y are arrays, POLYCENTER returns the centroid and area of +% the polygons in the first non-singleton dimension of X and Y. +% +% POLYCENTER is an extended version of POLYAREA. +% +% The polygon edges must not intersect. If they do, POLYCENTER returns +% the values of the difference between the clockwise encircled parts and +% the counterclockwise ones. As with POLYAREA, the absolute value is used +% for the area. +% +% [AREA,CX,CY] = POLYCENTER(X,Y,DIM) returns the centroid and area of the +% polygons specified by the vertices in the dimension DIM. +% +% Example: +% ------- +% x0 = rand(1); y0 = rand(1); +% L = linspace(0,2.*pi,6); +% xv = cos(L)' + x0; yv = sin(L)' + y0; +% xv = [xv ; xv(1)]; yv = [yv ; yv(1)]; +% [A,cx,cy] = polycenter(xv,yv); +% plot(xv,yv,cx,cy,'k+') +% title(['Area = ' num2str(A)]), axis equal +% +% Damien Garcia, 08/2007, directly adapted from POLYAREA +% +% See also POLYAREA. + +if nargin==1 + error('MATLAB:polycenter:NotEnoughInputs','Not enough inputs.'); +end + +if ~isequal(size(x),size(y)) + error('MATLAB:polycenter:XYSizeMismatch','X and Y must be the same size.'); +end + +if nargin==2 + [x,nshifts] = shiftdim(x); + y = shiftdim(y); +elseif nargin==3 + perm = [dim:max(length(size(x)),dim) 1:dim-1]; + x = permute(x,perm); + y = permute(y,perm); +end + +warn0 = warning('query','MATLAB:divideByZero'); +warning('off','MATLAB:divideByZero') + +siz = size(x); +if ~isempty(x) + tmp = x(:,:).*y([2:siz(1) 1],:) - x([2:siz(1) 1],:).*y(:,:); + area = reshape(sum(tmp),[1 siz(2:end)])/2; + cx = reshape(sum((x(:,:)+x([2:siz(1) 1],:)).*tmp/6),[1 siz(2:end)])./area; + cy = reshape(sum((y(:,:)+y([2:siz(1) 1],:)).*tmp/6),[1 siz(2:end)])./area; + area = abs(area); +else + area = sum(x); % SUM produces the right value for all empty cases + cx = NaN(size(area)); + cy = cx; +end + +warning(warn0.state,'MATLAB:divideByZero') + +if nargin==2 + area = shiftdim(area,-nshifts); + cx = shiftdim(cx,-nshifts); + cy = shiftdim(cy,-nshifts); +elseif nargin==3 + area = ipermute(area,perm); + cx = ipermute(cx,perm); + cy = ipermute(cy,perm); +end +