--- a +++ b/combinedDeepLearningActiveContour/functions/polygonCentroid.m @@ -0,0 +1,62 @@ +function [centroid area] = polygonCentroid(varargin) +%POLYGONCENTROID Compute the centroid (center of mass) of a polygon +% +% CENTROID = polygonCentroid(POLY) +% CENTROID = polygonCentroid(PTX, PTY) +% Computes center of mass of a polygon defined by POLY. POLY is a N-by-2 +% array of double containing coordinates of vertices. +% +% [CENTROID AREA] = polygonCentroid(POLY) +% Also returns the (signed) area of the polygon. +% +% Example +% % Draws the centroid of a paper hen +% x = [0 10 20 0 -10 -20 -10 -10 0]; +% y = [0 0 10 10 20 10 10 0 -10]; +% poly = [x' y']; +% centro = polygonCentroid(poly); +% drawPolygon(poly); +% hold on; axis equal; +% drawPoint(centro, 'bo'); +% +% References +% algo adapted from P. Bourke web page +% +% See also: +% polygons2d, polygonArea, drawPolygon +% +% --------- +% author : David Legland +% INRA - TPV URPOI - BIA IMASTE +% created the 05/05/2004. +% + +% Algorithme P. Bourke, vectorized version + +% HISTORY +% 2012.02.24 vectorize code + + +% parse input arguments +if nargin == 1 + var = varargin{1}; + px = var(:,1); + py = var(:,2); +elseif nargin == 2 + px = varargin{1}; + py = varargin{2}; +end + +% vertex indices +N = length(px); +iNext = [2:N 1]; + +% compute cross products +common = px .* py(iNext) - px(iNext) .* py; +sx = sum((px + px(iNext)) .* common); +sy = sum((py + py(iNext)) .* common); + +% area and centroid +area = sum(common) / 2; +centroid = [sx sy] / 6 / area; +end \ No newline at end of file