diff options
author | Rafael Laboissière <rafael@debian.org> | 2020-02-09 05:51:46 -0300 |
---|---|---|
committer | Rafael Laboissière <rafael@debian.org> | 2020-02-09 05:51:46 -0300 |
commit | a45e15f167ef0a7cba3e9ed572209f3522658320 (patch) | |
tree | 481982ed20977db86d2e3309ee5e709da54e2b79 /inst/transformShape.m | |
parent | 87f1c69f10eb490ae5bdfbd551ba386b58e199e3 (diff) |
New upstream version 4.0.0
Diffstat (limited to 'inst/transformShape.m')
-rw-r--r-- | inst/transformShape.m | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/inst/transformShape.m b/inst/transformShape.m new file mode 100644 index 0000000..4a48ccc --- /dev/null +++ b/inst/transformShape.m @@ -0,0 +1,108 @@ +## Copyright (C) 2012-2017 (C) Juan Pablo Carbajal +## +## This program is free software; you can redistribute it and/or modify it under +## the terms of the GNU General Public License as published by the Free Software +## Foundation; either version 3 of the License, or (at your option) any later +## version. +## +## This program is distributed in the hope that it will be useful, but WITHOUT +## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +## details. +## +## You should have received a copy of the GNU General Public License along with +## this program; if not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{nshape} = } transformShape (@var{shape}, @var{T}) +## Applies transformation to a shape defined by piecewise smooth polynomials. +## +## @var{shape} is a cell where each elements is a 2-by-(poly_degree+1) matrix +## containing a pair of polynomials. +## +## Format of @var{T} can be one of : +## @example +## @group +## [c] , [a b] , [a b c] or [a b c] +## [f] [d e] [d e f] [d e f] +## [0 0 1] +## @end group +## @end example +## +## @seealso{shape2polygon, plotShape} +## @end deftypefn + +function nshape = transformShape (shape, Trans) + + if size(Trans,1) < 2 + error("geometry:invalid-input-arg", ... + "Transformation can be 2x1, 2x2, 2x3 or 3x3. See help."); + end + + if ~iscell(shape) + error("geometry:invalid-input-arg", "Shape must be a cell of 2D polynomials."); + end + + A =[]; + v = []; + + switch size(Trans,2) + case 1 + # Just translation + v = Trans; + + case 2 + # Just linear transformation + A = Trans; + + case 3 + # Affine transform + A = Trans(1:2,1:2); + v = Trans(1:2,3); + end + + nshape = cellfun (@(x)polytransform (x,A,v), shape, 'UniformOutput',false); + +endfunction + +function np = polytransform(p,A,v) + + np = p; + if ~isempty (A) + np = A*np; + end + if ~isempty (v) + np(:,end) = np(:,end) + v; + end + +endfunction + +%!demo +%! shape = {[-93.172 606.368 -476.054 291.429; ... +%! -431.196 637.253 11.085 163.791]; ... +%! [-75.3626 -253.2337 457.1678 328.5714; ... +%! 438.7659 -653.6278 -7.9953 380.9336]; ... +%! [-89.5841 344.9716 -275.3876 457.1429; ... +%! -170.3613 237.8858 1.0469 158.0765];... +%! [32.900 -298.704 145.804 437.143; ... +%! -243.903 369.597 -34.265 226.648]; ... +%! [-99.081 409.127 -352.903 317.143; ... +%! 55.289 -114.223 -26.781 318.076]; ... +%! [-342.231 191.266 168.108 274.286; ... +%! 58.870 -38.083 -89.358 232.362]}; +%! warning ("off", 'geom2d:cw-shape',"local"); +%! A = shapeArea (shape); +%! T = eye(2)/sqrt(A); +%! shape = transformShape (shape,T); +%! T = shapeCentroid (shape)(:); +%! shape = transformShape (shape,-T + [2; 0]); +%! +%! close +%! plotShape (shape,'-r','linewidth',2); +%! hold on +%! for i = 1:9 +%! T = createRotation (i*pi/5)(1:2,1:2)/exp(0.3*i); +%! plotShape (transformShape(shape, T), 'color',rand(1,3),'linewidth',2); +%! end +%! hold off +%! axis image |