Code covered by the BSD License  

Highlights from
geom2d

image thumbnail

geom2d

by

 

13 Jun 2005 (Updated )

Geometry library for matlab. Performs geometric computations on points, lines, circles, polygons...

polygonExpand(polygon, dist)
function poly2 = polygonExpand(polygon, dist)
%POLYGONEXPAND 'expand' a polygon with a given distance
%
%   EXPOLY = polygonExpand(POLYGON, D);
%   Associates each edge of POLYGON to an edge located at distance D, and
%   computes polygon given by growing edges. 
%   This is a kind of dilatation, but behaviour on corners is different.
%   This function keeps angles of polygons, but there is no direct relation
%   between length of 2 polygons.
%
%   It works fine for convex polygons, or for polygons whose complexity is
%   not too high (self intersection of result polygon is not tested).
%
%   It is also possible to specify negative distance, and get all points
%   inside the polygon. If the polygon is convex, the result equals
%   morphological erosion of polygon by a ball with radius equal to the
%   given distance.
%
%   See also:
%   polygons2d
%

%   ---------
%   author : David Legland 
%   INRA - TPV URPOI - BIA IMASTE
%   created the 14/05/2005.
%

%   HISTORY :
%   31/07/2005 : change algo for negative distance : use clipping of
%   polygon by half-planes
%   17/06/2009 deprecate

% deprecation warning
warning('geom2d:deprecated', ...
    '''polygonExpand'' is deprecated, use ''expandPolygon'' instead');

% eventually copy first point at the end
if sum(polygon(end, :)==polygon(1,:))~=2
    polygon = [polygon; polygon(1,:)];
end

% number of vertics of polygon
N = size(polygon, 1)-1;

% find lines parallel to polygon edges with distance DIST
line = zeros(N, 4);
for i=1:N
    side = createLine(polygon(i,:), polygon(i+1,:));
    %perp = orthogonalLine(side, polygon(i,:));
    %pts2 = pointOnLine(perp, -dist);
    line(i, 1:4) = parallelLine(side, -dist);
end


if dist>0
    % compute intersection points of consecutive lines
    line = [line;line(1,:)];
    poly2 = zeros(N, 2);
    for i=1:N
        poly2(i,1:2) = intersectLines(line(i,:), line(i+1,:));
    end
else
    poly2 = polygon;
    % clip polygon with all lines parallel to edges
    for i=1:N
        poly2 = clipPolygonHP(poly2, line(i,:));
    end
end

Contact us