From: <jpi...@us...> - 2011-10-09 01:37:48
|
Revision: 8714 http://octave.svn.sourceforge.net/octave/?rev=8714&view=rev Author: jpicarbajal Date: 2011-10-09 01:37:39 +0000 (Sun, 09 Oct 2011) Log Message: ----------- geometry. Adding matgeom Rays and vectors Modified Paths: -------------- trunk/octave-forge/main/geometry/DESCRIPTION trunk/octave-forge/main/geometry/INDEX trunk/octave-forge/main/geometry/doc/NEWS Added Paths: ----------- trunk/octave-forge/main/geometry/geom2d/inst/createRay.m trunk/octave-forge/main/geometry/geom2d/inst/drawEdge.m trunk/octave-forge/main/geometry/geom2d/inst/drawRay.m trunk/octave-forge/main/geometry/geom2d/inst/isParallel.m trunk/octave-forge/main/geometry/geom2d/inst/isPerpendicular.m trunk/octave-forge/main/geometry/geom2d/inst/isPointOnRay.m trunk/octave-forge/main/geometry/geom2d/inst/normalizeVector.m trunk/octave-forge/main/geometry/geom2d/inst/rays2d.m trunk/octave-forge/main/geometry/geom2d/inst/rotateVector.m trunk/octave-forge/main/geometry/geom2d/inst/transformVector.m trunk/octave-forge/main/geometry/geom2d/inst/vectorNorm.m trunk/octave-forge/main/geometry/geom2d/inst/vectors2d.m Removed Paths: ------------- trunk/octave-forge/main/geometry/matGeom_raw/Tests/geom2d/testCreateRay.m trunk/octave-forge/main/geometry/matGeom_raw/geom2d/createRay.m trunk/octave-forge/main/geometry/matGeom_raw/geom2d/drawEdge.m trunk/octave-forge/main/geometry/matGeom_raw/geom2d/drawRay.m trunk/octave-forge/main/geometry/matGeom_raw/geom2d/isParallel.m trunk/octave-forge/main/geometry/matGeom_raw/geom2d/isPerpendicular.m trunk/octave-forge/main/geometry/matGeom_raw/geom2d/isPointOnRay.m trunk/octave-forge/main/geometry/matGeom_raw/geom2d/normalizeVector.m trunk/octave-forge/main/geometry/matGeom_raw/geom2d/rays2d.m trunk/octave-forge/main/geometry/matGeom_raw/geom2d/rotateVector.m trunk/octave-forge/main/geometry/matGeom_raw/geom2d/transformVector.m trunk/octave-forge/main/geometry/matGeom_raw/geom2d/vectorNorm.m trunk/octave-forge/main/geometry/matGeom_raw/geom2d/vectors2d.m Modified: trunk/octave-forge/main/geometry/DESCRIPTION =================================================================== --- trunk/octave-forge/main/geometry/DESCRIPTION 2011-10-08 12:59:54 UTC (rev 8713) +++ trunk/octave-forge/main/geometry/DESCRIPTION 2011-10-09 01:37:39 UTC (rev 8714) @@ -1,5 +1,5 @@ Name: Geometry -Version: 1.1.1 +Version: 1.1.2 Date: 2011-10-06 Author: David Legland <dav...@gr...>, Juan Pablo Carbajal <car...@if...> Maintainer: Juan Pablo Carbajal <car...@if...> Modified: trunk/octave-forge/main/geometry/INDEX =================================================================== --- trunk/octave-forge/main/geometry/INDEX 2011-10-08 12:59:54 UTC (rev 8713) +++ trunk/octave-forge/main/geometry/INDEX 2011-10-09 01:37:39 UTC (rev 8714) @@ -6,27 +6,32 @@ angleDiff angles2d angleSort - createLine - deg2rad - edgeAngle - lineAngle - normalizeAngle - rad2deg - vectorAngle + boxes2d cbezier2poly - boxes2d clipEdge clipLine clipPoints + clipRay + createLine + createRay + deg2rad drawBezierCurve drawBox - clipRay + drawEdge + drawLine + drawRay + edgeAngle intersectBoxes intersectLines + isPointOnRay + lineAngle linePosition mergeBoxes + normalizeAngle + rad2deg randomPointInBox - drawLine + rays2d + vectorAngle Input svgload svgnormalize @@ -36,5 +41,3 @@ Geometry 3D Graphs - - Modified: trunk/octave-forge/main/geometry/doc/NEWS =================================================================== --- trunk/octave-forge/main/geometry/doc/NEWS 2011-10-08 12:59:54 UTC (rev 8713) +++ trunk/octave-forge/main/geometry/doc/NEWS 2011-10-09 01:37:39 UTC (rev 8714) @@ -50,4 +50,20 @@ mergeBoxes.m randomPointInBox.m drawLine.m + =============================================================================== +geometry-1.1.2 Release Date: 2011-10-xx Release Manager: Juan Pablo Carbajal +=============================================================================== + +* Continue to add geom2d from matGeom (rays and vectors) + createRay + drawRay + isPointOnRay + drawEdge + rays2d + vectors2d + vectorNorm + isParallel + isPerpendicular + +=============================================================================== Copied: trunk/octave-forge/main/geometry/geom2d/inst/createRay.m (from rev 8710, trunk/octave-forge/main/geometry/matGeom_raw/geom2d/createRay.m) =================================================================== --- trunk/octave-forge/main/geometry/geom2d/inst/createRay.m (rev 0) +++ trunk/octave-forge/main/geometry/geom2d/inst/createRay.m 2011-10-09 01:37:39 UTC (rev 8714) @@ -0,0 +1,104 @@ +%% Copyright (c) 2011, INRA +%% 2007-2011, David Legland <dav...@gr...> +%% 2011 Adapted to Octave by Juan Pablo Carbajal <car...@if...> +%% +%% All rights reserved. +%% (simplified BSD License) +%% +%% Redistribution and use in source and binary forms, with or without +%% modification, are permitted provided that the following conditions are met: +%% +%% 1. Redistributions of source code must retain the above copyright notice, this +%% list of conditions and the following disclaimer. +%% +%% 2. Redistributions in binary form must reproduce the above copyright notice, +%% this list of conditions and the following disclaimer in the documentation +%% and/or other materials provided with the distribution. +%% +%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +%% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +%% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +%% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +%% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +%% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +%% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +%% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +%% POSSIBILITY OF SUCH DAMAGE. +%% +%% The views and conclusions contained in the software and documentation are +%% those of the authors and should not be interpreted as representing official +%% policies, either expressed or implied, of copyright holder. + +%% -*- texinfo -*- +%% @deftypefn {Function File} { @var{ray} = } createRay (@var{point}, @var{angle}) +%% @deftypefnx {Function File} { @var{ray} = } createRay (@var{x0},@var{y0}, @var{angle}) +%% @deftypefnx {Function File} { @var{ray} = } createRay (@var{p1}, @var{p2}) +%% Create a ray (half-line), from various inputs. +%% +%% A Ray is represented in a parametric form: [x0 y0 dx dy]. +%% x = x0 + t*dx +%% y = y0 + t*dy; +%% for all t>0. +%% +%% @var{point} is a Nx2 array giving the starting point of the ray, and @var{angle} is the +%% orientation of the ray respect to the positive x-axis. The ray origin can be specified with 2 input arguments @var{x0},@var{y0}. +%% +%% If two points @var{p1}, @var{p2} are given, creates a ray starting from point @var{p1} and going in the direction of point +%% @var{p2}. +%% +%% Example +%% @example +%% origin = [3 4]; +%% theta = pi/6; +%% ray = createRay(origin, theta); +%% axis([0 10 0 10]); +%% drawRay(ray); +%% @end example +%% +%% @seealso{rays2d, createLine, points2d} +%% @end deftypefn + +function ray = createRay(varargin) + + if length(varargin)==2 + p0 = varargin{1}; + arg = varargin{2}; + if size(arg, 2)==1 + % second input is the ray angle + ray = [p0 cos(arg) sin(arg)]; + else + % second input is another point + ray = [p0 arg-p0]; + end + + elseif length(varargin)==3 + x = varargin{1}; + y = varargin{2}; + theta = varargin{3}; + ray = [x y cos(theta) sin(theta)]; + + else + error("Wrong number of arguments in 'createRay'. "); + end + +endfunction + +%!shared p1,p2,ray +%! p1 = [1 1]; +%! p2 = [2 3]; +%! ray = createRay(p1, p2); + +%!assert (p1, ray(1,1:2), 1e-6); +%!assert (p2-p1, ray(1,3:4), 1e-6); + +%!shared p1,p2,ray +%! p1 = [1 1;1 1]; +%! p2 = [2 3;2 4]; +%! ray = createRay(p1, p2); + +%!assert (2, size(ray, 1)); +%!assert (p1, ray(:,1:2), 1e-6); +%!assert (p2-p1, ray(:,3:4), 1e-6); + Copied: trunk/octave-forge/main/geometry/geom2d/inst/drawEdge.m (from rev 8710, trunk/octave-forge/main/geometry/matGeom_raw/geom2d/drawEdge.m) =================================================================== --- trunk/octave-forge/main/geometry/geom2d/inst/drawEdge.m (rev 0) +++ trunk/octave-forge/main/geometry/geom2d/inst/drawEdge.m 2011-10-09 01:37:39 UTC (rev 8714) @@ -0,0 +1,164 @@ +%% Copyright (c) 2011, INRA +%% 2004-2011, David Legland <dav...@gr...> +%% 2011 Adapted to Octave by Juan Pablo Carbajal <car...@if...> +%% +%% All rights reserved. +%% (simplified BSD License) +%% +%% Redistribution and use in source and binary forms, with or without +%% modification, are permitted provided that the following conditions are met: +%% +%% 1. Redistributions of source code must retain the above copyright notice, this +%% list of conditions and the following disclaimer. +%% +%% 2. Redistributions in binary form must reproduce the above copyright notice, +%% this list of conditions and the following disclaimer in the documentation +%% and/or other materials provided with the distribution. +%% +%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +%% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +%% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +%% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +%% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +%% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +%% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +%% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +%% POSSIBILITY OF SUCH DAMAGE. +%% +%% The views and conclusions contained in the software and documentation are +%% those of the authors and should not be interpreted as representing official +%% policies, either expressed or implied, of copyright holder. + +%% -*- texinfo -*- +%% @deftypefn {Function File} {@var{h} = } drawEdge (@var{x1}, @var{y1}, @var{x2}, @var{y2}) +%% @deftypefnx {Function File} {@var{h} = } drawEdge ([@var{x1} @var{y1} @var{x2} @var{y2}]) +%% @deftypefnx {Function File} {@var{h} = } drawEdge ([@var{x1} @var{y1}], [@var{x2} @var{y2}]) +%% @deftypefnx {Function File} {@var{h} = } drawEdge (@var{x1}, @var{y1}, @var{z1}, @var{x2}, @var{y2}, @var{z2}) +%% @deftypefnx {Function File} {@var{h} = } drawEdge ([@var{x1} @var{y1} @var{z1} @var{x2} @var{y2} @var{z2}]) +%% @deftypefnx {Function File} {@var{h} = } drawEdge ([@var{x1} @var{y1} @var{z1}], [@var{x2} @var{y2} @var{z2}]) +%% @deftypefnx {Function File} {@var{h} = } drawEdge (@dots, @var{opt}) +%% Draw an edge given by 2 points. +%% +%% Draw an edge between the points (x1 y1) and (x2 y2). Data can be bundled as an edge. +%% The function supports 3D edges. +%% Arguments can be single values or array of size [Nx1]. In this case, +%% the function draws multiple edges. +%% @var{opt}, being a set of pairwise options, can +%% specify color, line width and so on. These are passed to function @code{line}. +%% The function returns handle(s) to created edges(s). +%% +%% @seealso{edges2d, drawCenteredEdge, drawLine, line} +%% @end deftypefn + +function varargout = drawEdge(varargin) + + % separate edge and optional arguments + [edge options] = parseInputArguments(varargin{:}); + + % draw the edges + if size(edge, 2)==4 + h = drawEdge_2d(edge, options); + else + h = drawEdge_3d(edge, options); + end + + % eventually return handle to created edges + if nargout>0 + varargout{1}=h; + end + +endfunction + +function h = drawEdge_2d(edge, options) + + h = -1*ones(size(edge, 1), 1); + + for i=1:size(edge, 1) + if isnan(edge(i,1)) + continue; + end + h(i) = line(... + [edge(i, 1) edge(i, 3)], ... + [edge(i, 2) edge(i, 4)], options{:}); + end + +endfunction + +function h = drawEdge_3d(edge, options) + + h = -1*ones(size(edge, 1), 1); + + for i=1:size(edge, 1) + if isnan(edge(i,1)) + continue; + end + h(i) = line( ... + [edge(i, 1) edge(i, 4)], ... + [edge(i, 2) edge(i, 5)], ... + [edge(i, 3) edge(i, 6)], options{:}); + end + +endfunction + +function [edge options] = parseInputArguments(varargin) + + % default values for parameters + edge = []; + + % find the number of arguments defining edges + nbVal=0; + for i=1:nargin + if isnumeric(varargin{i}) + nbVal = nbVal+1; + else + % stop at the first non-numeric value + break; + end + end + + % extract drawing options + options = varargin(nbVal+1:end); + + % ensure drawing options have correct format + if length(options)==1 + options = [{'color'}, options]; + end + + % extract edges characteristics + if nbVal==1 + % all parameters in a single array + edge = varargin{1}; + + elseif nbVal==2 + % parameters are two points, or two arrays of points, of size N*2. + p1 = varargin{1}; + p2 = varargin{2}; + edge = [p1 p2]; + + elseif nbVal==4 + % parameters are 4 parameters of the edge : x1 y1 x2 and y2 + edge = [varargin{1} varargin{2} varargin{3} varargin{4}]; + + elseif nbVal==6 + % parameters are 6 parameters of the edge : x1 y1 z1 x2 y2 and z2 + edge = [varargin{1} varargin{2} varargin{3} varargin{4} varargin{5} varargin{6}]; + end + +endfunction + +%!demo +%! close +%! points = rand(4,4); +%! colorstr = 'rgbm'; +%! for i=1:4 +%! drawEdge (points(i,:),'color',colorstr(i),'linewidth',2); +%! end +%! axis tight; + +%!demo +%! close +%! drawEdge (rand(10,4),'linewidth',2); +%! axis tight; + Copied: trunk/octave-forge/main/geometry/geom2d/inst/drawRay.m (from rev 8710, trunk/octave-forge/main/geometry/matGeom_raw/geom2d/drawRay.m) =================================================================== --- trunk/octave-forge/main/geometry/geom2d/inst/drawRay.m (rev 0) +++ trunk/octave-forge/main/geometry/geom2d/inst/drawRay.m 2011-10-09 01:37:39 UTC (rev 8714) @@ -0,0 +1,66 @@ +%% Copyright (c) 2011, INRA +%% 2003-2011, David Legland <dav...@gr...> +%% 2011 Adapted to Octave by Juan Pablo Carbajal <car...@if...> +%% +%% All rights reserved. +%% (simplified BSD License) +%% +%% Redistribution and use in source and binary forms, with or without +%% modification, are permitted provided that the following conditions are met: +%% +%% 1. Redistributions of source code must retain the above copyright notice, this +%% list of conditions and the following disclaimer. +%% +%% 2. Redistributions in binary form must reproduce the above copyright notice, +%% this list of conditions and the following disclaimer in the documentation +%% and/or other materials provided with the distribution. +%% +%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +%% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +%% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +%% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +%% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +%% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +%% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +%% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +%% POSSIBILITY OF SUCH DAMAGE. +%% +%% The views and conclusions contained in the software and documentation are +%% those of the authors and should not be interpreted as representing official +%% policies, either expressed or implied, of copyright holder. + +%% -*- texinfo -*- +%% @deftypefn {Function File} {@var{h} = } drawRay (@var{ray}) +%% @deftypefnx {Function File} {@var{h} = } drawRay (@var{ray}, @var{param}, @var{value}) +%% Draw a ray on the current axis. +%% +%% With @var{ray} having the syntax: [x0 y0 dx dy], draws the ray starting from +%% point (x0 y0) and going to direction (dx dy), clipped with the current +%% window axis. @var{param}, @var{value} pairs are passed to function @code{line}. +%% +%% @seealso{rays2d, drawLine, line} +%% @end deftypefn + +function varargout = drawRay(ray, varargin) + + % get bounding box limits + bb = axis(gca); + + % compute clipped shapes + [clipped isInside] = clipRay(ray, bb); + + % allocate memory for handle + h = -ones(size(ray, 1), 1); + + % draw visible rays + h(isInside) = drawEdge(clipped(isInside, :), varargin{:}); + + % process output + if nargout>0 + varargout = {h}; + end + +endfunction + Copied: trunk/octave-forge/main/geometry/geom2d/inst/isParallel.m (from rev 8713, trunk/octave-forge/main/geometry/matGeom_raw/geom2d/isParallel.m) =================================================================== --- trunk/octave-forge/main/geometry/geom2d/inst/isParallel.m (rev 0) +++ trunk/octave-forge/main/geometry/geom2d/inst/isParallel.m 2011-10-09 01:37:39 UTC (rev 8714) @@ -0,0 +1,97 @@ +%% Copyright (c) 2011, INRA +%% 2006-2011, David Legland <dav...@gr...> +%% 2011 Adapted to Octave by Juan Pablo Carbajal <car...@if...> +%% +%% All rights reserved. +%% (simplified BSD License) +%% +%% Redistribution and use in source and binary forms, with or without +%% modification, are permitted provided that the following conditions are met: +%% +%% 1. Redistributions of source code must retain the above copyright notice, this +%% list of conditions and the following disclaimer. +%% +%% 2. Redistributions in binary form must reproduce the above copyright notice, +%% this list of conditions and the following disclaimer in the documentation +%% and/or other materials provided with the distribution. +%% +%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +%% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +%% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +%% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +%% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +%% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +%% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +%% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +%% POSSIBILITY OF SUCH DAMAGE. +%% +%% The views and conclusions contained in the software and documentation are +%% those of the authors and should not be interpreted as representing official +%% policies, either expressed or implied, of copyright holder. + +%% -*- texinfo -*- +%% @deftypefn {Function File} {@var{b} = } isParallel (@var{v1}, @var{v2}) +%% @deftypefnx {Function File} {@var{b} = } isParallel (@var{v1}, @var{v2},@var{tol}) +%% Check parallelism of two vectors +%% +%% @var{v1} and @var{v2} are 2 row vectors of length Nd, Nd being the dimension, +%% returns @code{true} if the vectors are parallel, and @code{false} otherwise. +%% +%% Also works when @var{v1} and @var{v2} are two [NxNd] arrays with same number of +%% rows. In this case, return a [Nx1] array containing @code{true} at the positions +%% of parallel vectors. +%% +%% @var{tol} specifies the accuracy of numerical computation. Default value is 1e-14. +%% +%% Example +%% +%% @example +%% isParallel([1 2], [2 4]) +%% ans = +%% 1 +%% isParallel([1 2], [1 3]) +%% ans = +%% 0 +%% @end example +%% +%% @seealso{vectors2d, isPerpendicular, lines2d} +%% @end deftypefn + +%% FIXME or erase me +%% Also works when one of @var{v1} or @var{v2} is scalar and the other one is [NxNd] +%% array, in this case return [Nx1] results. + +function b = isParallel(v1, v2, varargin) + + % default accuracy + acc = 1e-14; + if ~isempty(varargin) + acc = abs(varargin{1}); + end + + % adapt size of inputs if needed + n1 = size(v1, 1); + n2 = size(v2, 1); + if n1 ~= n2 + if n1 == 1 + v1 = v1(ones(n2,1), :); + elseif n2 == 1 + v2 = v2(ones(n1,1), :); + end + end + + % performs computation + if size(v1, 2) == 2 + b = abs(v1(:, 1) .* v2(:, 2) - v1(:, 2) .* v2(:, 1)) < acc; + else + % computation in space + b = vectorNorm(cross(v1, v2, 2)) < acc; + end + +endfunction + +%!assert (isParallel ([1 2], [2 4])) +%!assert (!isParallel ([1 2], [1 3])) +%!error (isParallel (3, rand(4,2))) Copied: trunk/octave-forge/main/geometry/geom2d/inst/isPerpendicular.m (from rev 8713, trunk/octave-forge/main/geometry/matGeom_raw/geom2d/isPerpendicular.m) =================================================================== --- trunk/octave-forge/main/geometry/geom2d/inst/isPerpendicular.m (rev 0) +++ trunk/octave-forge/main/geometry/geom2d/inst/isPerpendicular.m 2011-10-09 01:37:39 UTC (rev 8714) @@ -0,0 +1,95 @@ +%% Copyright (c) 2011, INRA +%% 2006-2011, David Legland <dav...@gr...> +%% 2011 Adapted to Octave by Juan Pablo Carbajal <car...@if...> +%% +%% All rights reserved. +%% (simplified BSD License) +%% +%% Redistribution and use in source and binary forms, with or without +%% modification, are permitted provided that the following conditions are met: +%% +%% 1. Redistributions of source code must retain the above copyright notice, this +%% list of conditions and the following disclaimer. +%% +%% 2. Redistributions in binary form must reproduce the above copyright notice, +%% this list of conditions and the following disclaimer in the documentation +%% and/or other materials provided with the distribution. +%% +%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +%% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +%% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +%% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +%% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +%% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +%% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +%% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +%% POSSIBILITY OF SUCH DAMAGE. +%% +%% The views and conclusions contained in the software and documentation are +%% those of the authors and should not be interpreted as representing official +%% policies, either expressed or implied, of copyright holder. + +%% -*- texinfo -*- +%% @deftypefn {Function File} {@var{b} = } isPerpendicular (@var{v1}, @var{v2}) +%% @deftypefnx {Function File} {@var{b} = } isPerpendicula (@var{v1}, @var{v2},@var{tol}) +%% heck orthogonality of two vectors. +%% +%% @var{v1} and @var{v2} are 2 row vectors of length Nd, Nd being the dimension, +%% returns @code{true} if the vectors are perpendicular, and @code{false} otherwise. +%% +%% Also works when @var{v1} and @var{v2} are two [NxNd] arrays with same number of +%% rows. In this case, return a [Nx1] array containing @code{true} at the positions +%% of parallel vectors. +%% +%% @var{tol} specifies the accuracy of numerical computation. Default value is 1e-14. +%% +%% Example +%% +%% @example +% isPerpendicular([1 2 0], [0 0 2]) +%% ans = +%% 1 +% isPerpendicular([1 2 1], [1 3 2]) +%% ans = +%% 0 +%% @end example +%% +%% @seealso{vectors2d, isParallel, lines2d} +%% @end deftypefn + +%% FIXME or erase me +%% Also works when one of @var{v1} or @var{v2} is scalar and the other one is [NxNd] +%% array, in this case return [Nx1] results. + +function b = isPerpendicular(v1, v2, varargin) + + % default accuracy + acc = 1e-14; + if ~isempty(varargin) + acc = abs(varargin{1}); + end + + % adapt size of inputs + n1 = size(v1, 1); + n2 = size(v2, 1); + if n1~=n2 + if n1==1 + v1 = v1(ones(n2, 1), :); + elseif n2==1 + v2 = v2(ones(n1, 1), :); + else + error('Inputs must either have same size, or one must be scalar'); + end + end + + % performs test + b = abs(dot(v1, v2, 2)) < acc; + +endfunction + +%!assert (isPerpendicular ([1 2 0], [0 0 2])) +%!assert (!isPerpendicular([1 2 1], [1 3 2])) +%!error (isPerpendicular(1, rand(4,3))) + Copied: trunk/octave-forge/main/geometry/geom2d/inst/isPointOnRay.m (from rev 8710, trunk/octave-forge/main/geometry/matGeom_raw/geom2d/isPointOnRay.m) =================================================================== --- trunk/octave-forge/main/geometry/geom2d/inst/isPointOnRay.m (rev 0) +++ trunk/octave-forge/main/geometry/geom2d/inst/isPointOnRay.m 2011-10-09 01:37:39 UTC (rev 8714) @@ -0,0 +1,94 @@ +%% Copyright (c) 2011, INRA +%% 2007-2011, David Legland <dav...@gr...> +%% 2011 Adapted to Octave by Juan Pablo Carbajal <car...@if...> +%% +%% All rights reserved. +%% (simplified BSD License) +%% +%% Redistribution and use in source and binary forms, with or without +%% modification, are permitted provided that the following conditions are met: +%% +%% 1. Redistributions of source code must retain the above copyright notice, this +%% list of conditions and the following disclaimer. +%% +%% 2. Redistributions in binary form must reproduce the above copyright notice, +%% this list of conditions and the following disclaimer in the documentation +%% and/or other materials provided with the distribution. +%% +%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +%% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +%% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +%% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +%% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +%% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +%% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +%% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +%% POSSIBILITY OF SUCH DAMAGE. +%% +%% The views and conclusions contained in the software and documentation are +%% those of the authors and should not be interpreted as representing official +%% policies, either expressed or implied, of copyright holder. + +%% -*- texinfo -*- +%% @deftypefn {Function File} {@var{b} = } isPointOnRay (@var{point}, @var{ray}) +%% @deftypefnx {Function File} {@var{b} = } isPointOnRay (@var{point}, @var{ray}, @var{tol}) +%% Test if a point belongs to a ray +%% +%% @var{b} = isPointOnRay(@var{point}, @var{ray}); +%% Returns @code{true} if point @var{point} belongs to the ray @var{ray}. +%% @var{point} is given by [x y] and RAY by [x0 y0 dx dy]. @var{tol} gives the +%% tolerance for the calculations. +%% +%% @seealso{rays2d, points2d, isPointOnLine} +%% @end deftypefn + +function b = isPointOnRay(point, ray, varargin) + + % extract computation tolerance + tol = 1e-14; + if ~isempty(varargin) + tol = varargin{1}; + end + + % number of rays and points + Nr = size(ray, 1); + Np = size(point, 1); + + % if several rays or several points, adapt sizes of arrays + x0 = repmat(ray(:,1)', Np, 1); + y0 = repmat(ray(:,2)', Np, 1); + dx = repmat(ray(:,3)', Np, 1); + dy = repmat(ray(:,4)', Np, 1); + xp = repmat(point(:,1), 1, Nr); + yp = repmat(point(:,2), 1, Nr); + + % test if points belongs to the supporting line + b1 = abs ( (xp-x0).*dy - (yp-y0).*dx ) ./ hypot(dx, dy) < tol; + + % check if points lie the good direction on the rays + ind = abs (dx) > abs (dy); + t = zeros (size (b1)); + t(ind) = (xp(ind)-x0(ind))./dx(ind); + t(~ind) = (yp(~ind)-y0(~ind))./dy(~ind); + + % combine the two tests + b = b1 & (t >= 0); + +endfunction + +%!shared ray +%! p1 = [10 20]; +%! p2 = [80 20]; +%! ray = createRay (p1, p2); + +%!assert (isPointOnRay([10 20], ray)); +%!assert (isPointOnRay([80 20], ray)); +%!assert (isPointOnRay([50 20], ray)); +%!assert (isPointOnRay([50 20+1e-3], ray,1e-2)); +%!assert ( !isPointOnRay([50 20+1e-3], ray,1e-4)); +%!assert ( !isPointOnRay([9.99 20], ray)); +%!assert ( !isPointOnRay([80 20.01], ray)); +%!assert ( !isPointOnRay([50 21], ray)); +%!assert ( !isPointOnRay([79 19], ray)); Copied: trunk/octave-forge/main/geometry/geom2d/inst/normalizeVector.m (from rev 8713, trunk/octave-forge/main/geometry/matGeom_raw/geom2d/normalizeVector.m) =================================================================== --- trunk/octave-forge/main/geometry/geom2d/inst/normalizeVector.m (rev 0) +++ trunk/octave-forge/main/geometry/geom2d/inst/normalizeVector.m 2011-10-09 01:37:39 UTC (rev 8714) @@ -0,0 +1,72 @@ +%% Copyright (c) 2011, INRA +%% 2004-2011, David Legland <dav...@gr...> +%% 2011 Adapted to Octave by Juan Pablo Carbajal <car...@if...> +%% +%% All rights reserved. +%% (simplified BSD License) +%% +%% Redistribution and use in source and binary forms, with or without +%% modification, are permitted provided that the following conditions are met: +%% +%% 1. Redistributions of source code must retain the above copyright notice, this +%% list of conditions and the following disclaimer. +%% +%% 2. Redistributions in binary form must reproduce the above copyright notice, +%% this list of conditions and the following disclaimer in the documentation +%% and/or other materials provided with the distribution. +%% +%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +%% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +%% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +%% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +%% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +%% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +%% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +%% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +%% POSSIBILITY OF SUCH DAMAGE. +%% +%% The views and conclusions contained in the software and documentation are +%% those of the authors and should not be interpreted as representing official +%% policies, either expressed or implied, of copyright holder. + +%% -*- texinfo -*- +%% @deftypefn {Function File} {@var{vn} = } normalizeVector (@var{v}) +%% Normalize a vector to have norm equal to 1 +%% +%% Returns the normalization of vector @var{v}, such that ||@var{v}|| = 1. +%% @var{v} can be either a row or a column vector. +%% +%% When @var{v} is a MxN array, normalization is performed for each row of the +%% array. +%% +%% Example: +%% +%% @example +%% vn = normalizeVector([3 4]) +%% vn = +%% 0.6000 0.8000 +%% vectorNorm(vn) +%% ans = +%% 1 +%% @end example +%% +%% @seealso{vectors2d, vectorNorm} +%% @end deftypefn + +function vn = normalizeVector(v) + + dim = size(v); + + if dim(1)==1 || dim(2)==1 + vn = v / sqrt(sum(v.^2)); + else + %same as: vn = v./repmat(sqrt(sum(v.*v, 2)), [1 dim(2)]); + vn = bsxfun(@rdivide, v, sqrt(sum(v.^2, 2))); + end + +endfunction + +%!assert (1,vectorNorm (normalizeVector ([3 4]))) + Copied: trunk/octave-forge/main/geometry/geom2d/inst/rays2d.m (from rev 8710, trunk/octave-forge/main/geometry/matGeom_raw/geom2d/rays2d.m) =================================================================== --- trunk/octave-forge/main/geometry/geom2d/inst/rays2d.m (rev 0) +++ trunk/octave-forge/main/geometry/geom2d/inst/rays2d.m 2011-10-09 01:37:39 UTC (rev 8714) @@ -0,0 +1,60 @@ +%% Copyright (c) 2011, INRA +%% 2008-2011, David Legland <dav...@gr...> +%% 2011 Adapted to Octave by Juan Pablo Carbajal <car...@if...> +%% +%% All rights reserved. +%% (simplified BSD License) +%% +%% Redistribution and use in source and binary forms, with or without +%% modification, are permitted provided that the following conditions are met: +%% +%% 1. Redistributions of source code must retain the above copyright notice, this +%% list of conditions and the following disclaimer. +%% +%% 2. Redistributions in binary form must reproduce the above copyright notice, +%% this list of conditions and the following disclaimer in the documentation +%% and/or other materials provided with the distribution. +%% +%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +%% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +%% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +%% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +%% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +%% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +%% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +%% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +%% POSSIBILITY OF SUCH DAMAGE. +%% +%% The views and conclusions contained in the software and documentation are +%% those of the authors and should not be interpreted as representing official +%% policies, either expressed or implied, of copyright holder. + +%% -*- texinfo -*- +%% @deftypefn {Function File} rays2d () +%% Description of functions operating on planar rays +%% +%% A ray is defined by a point (its origin), and a vector (its +%% direction). The different parameters are bundled into a row vector: +%% @code{RAY = [x0 y0 dx dy];} +%% +%% The ray contains all the points (x,y) such that: +%% x = x0 + t*dx +%% y = y0 + t*dy; +%% for all t>0 +%% +%% Contrary to a (straight) line, the points located before the origin do +%% not belong to the ray. +%% However, as rays and lines have the same representation, some functions +%% working on lines are also working on rays (like @code{transformLine}). +%% +%% @seealso{points2d, vectors2d, lines2d, createRay, bisector, isPointOnRay, +%% clipRay, drawRay} +%% @end deftypefn + +function rays2d(varargin) + + help('rays2d'); + +endfunction Copied: trunk/octave-forge/main/geometry/geom2d/inst/rotateVector.m (from rev 8713, trunk/octave-forge/main/geometry/matGeom_raw/geom2d/rotateVector.m) =================================================================== --- trunk/octave-forge/main/geometry/geom2d/inst/rotateVector.m (rev 0) +++ trunk/octave-forge/main/geometry/geom2d/inst/rotateVector.m 2011-10-09 01:37:39 UTC (rev 8714) @@ -0,0 +1,64 @@ +%% Copyright (c) 2011, INRA +%% 2007-2011, David Legland <dav...@gr...> +%% 2011 Adapted to Octave by Juan Pablo Carbajal <car...@if...> +%% +%% All rights reserved. +%% (simplified BSD License) +%% +%% Redistribution and use in source and binary forms, with or without +%% modification, are permitted provided that the following conditions are met: +%% +%% 1. Redistributions of source code must retain the above copyright notice, this +%% list of conditions and the following disclaimer. +%% +%% 2. Redistributions in binary form must reproduce the above copyright notice, +%% this list of conditions and the following disclaimer in the documentation +%% and/or other materials provided with the distribution. +%% +%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +%% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +%% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +%% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +%% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +%% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +%% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +%% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +%% POSSIBILITY OF SUCH DAMAGE. +%% +%% The views and conclusions contained in the software and documentation are +%% those of the authors and should not be interpreted as representing official +%% policies, either expressed or implied, of copyright holder. + +%% -*- texinfo -*- +%% @deftypefn {Function File} {@var{vr} = } rotateVector (@var{v}, @var{theta}) +%% Rotate a vector by a given angle +%% +%% Rotate the vector @var{v} by an angle @var{theta}, given in radians. +%% +%% Example +%% +%% @example +%% rotateVector([1 0], pi/2) +%% ans = +%% 0 1 +%% @end example +%% +%% @seealso{vectors2d, transformVector, createRotation} +%% @end deftypefn + +function vr = rotateVector(v, angle) + + % precomputes angles + cot = cos(angle); + sit = sin(angle); + + % compute rotated coordinates + vr = [cot * v(:,1) - sit * v(:,2) , sit * v(:,1) + cot * v(:,2)]; + +endfunction + +%!assert ([0 1],rotateVector([1 0],pi/2), 1e-6) +%!assert (sqrt([0.5 0.5]),rotateVector([1 0],pi/4), 1e-6) + Copied: trunk/octave-forge/main/geometry/geom2d/inst/transformVector.m (from rev 8713, trunk/octave-forge/main/geometry/matGeom_raw/geom2d/transformVector.m) =================================================================== --- trunk/octave-forge/main/geometry/geom2d/inst/transformVector.m (rev 0) +++ trunk/octave-forge/main/geometry/geom2d/inst/transformVector.m 2011-10-09 01:37:39 UTC (rev 8714) @@ -0,0 +1,108 @@ +%% Copyright (c) 2011, INRA +%% 2007-2011, David Legland <dav...@gr...> +%% 2011 Adapted to Octave by Juan Pablo Carbajal <car...@if...> +%% +%% All rights reserved. +%% (simplified BSD License) +%% +%% Redistribution and use in source and binary forms, with or without +%% modification, are permitted provided that the following conditions are met: +%% +%% 1. Redistributions of source code must retain the above copyright notice, this +%% list of conditions and the following disclaimer. +%% +%% 2. Redistributions in binary form must reproduce the above copyright notice, +%% this list of conditions and the following disclaimer in the documentation +%% and/or other materials provided with the distribution. +%% +%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +%% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +%% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +%% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +%% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +%% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +%% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +%% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +%% POSSIBILITY OF SUCH DAMAGE. +%% +%% The views and conclusions contained in the software and documentation are +%% those of the authors and should not be interpreted as representing official +%% policies, either expressed or implied, of copyright holder. + +%% -*- texinfo -*- +%% @deftypefn {Function File} {@var{v2} = } transformVector (@var{v}, @var{T}) +%% @deftypefnx {Function File} {[@var{x2} @var{y2}] = } transformVector (@var{x},@var{y}, @var{T}) +%% Transform a vector with an affine transform +%% +%% @var{v} has the form [xv yv], and @var{T} is a [2x2], [2x3] or [3x3] +%% matrix, returns the vector transformed with affine transform @var{T}. +%% +%% Format of @var{T} can be one of : +%% @group +%% [a b] , [a b c] , or [a b c] +%% [d e] [d e f] [d e f] +%% [0 0 1] +%% @end group +%% +%% Also works when @var{v} is a [Nx2] array of double. In this case, @var{v2} has +%% the same size as @var{v}. +%% +%% Also works when @var{x} and @var{y} are arrays the same size. The function +%% transform each couple of (@var{x}, @var{y}), and return the result in +%% (@var{x2}, @var{y2}), which is the same size as (@var{x}, @var{y}). +%% +%% @seealso{vectors2d, transforms2d, rotateVector, transformPoint} +%% @end deftypefn + +function varargout = transformVector(varargin) + + if length(varargin)==2 + var = varargin{1}; + vx = var(:,1); + vy = var(:,2); + trans = varargin{2}; + elseif length(varargin)==3 + vx = varargin{1}; + vy = varargin{2}; + trans = varargin{3}; + else + error('wrong number of arguments in "transformVector"'); + end + + + % compute new position of vector + vx2 = vx*trans(1,1) + vy*trans(1,2); + vy2 = vx*trans(2,1) + vy*trans(2,2); + + if size(trans, 2) == 3 + vx2 = vx2 + trans(1,3); + vy2 = vy2 + trans(2,3); + end + + % format output + if nargout==0 || nargout==1 + varargout{1} = [vx2 vy2]; + elseif nargout==2 + varargout{1} = vx2; + varargout{2} = vy2; + end + +endfunction + +%!demo +%! t1 = [2 0 0; 0 2 0]; +%! t2 = [1 0 1; 0 1 1]; +%! t3 = [0.5 0 1; 0 0.5 1; 0 0 1]; +%! +%! triangle = [-0.5 -1/3; 0.5 -1/3; 0 2/3; -0.5 -1/3]; +%! tr1 = transformVector(triangle,t1); +%! tr2 = transformVector(triangle,t2); +%! tr3 = transformVector(triangle,t3); +%! +%! plot(triangle(:,1),triangle(:,2),'k-', ... +%! tr1(:,1),tr1(:,2),'g-;scaled up;', ... +%! tr2(:,1),tr2(:,2),'m-;translated;', ... +%! tr3(:,1),tr3(:,2),'b-;scaled down and translated;') + Copied: trunk/octave-forge/main/geometry/geom2d/inst/vectorNorm.m (from rev 8713, trunk/octave-forge/main/geometry/matGeom_raw/geom2d/vectorNorm.m) =================================================================== --- trunk/octave-forge/main/geometry/geom2d/inst/vectorNorm.m (rev 0) +++ trunk/octave-forge/main/geometry/geom2d/inst/vectorNorm.m 2011-10-09 01:37:39 UTC (rev 8714) @@ -0,0 +1,114 @@ +%% Copyright (c) 2011, INRA +%% 2007-2011, David Legland <dav...@gr...> +%% 2011 Adapted to Octave by Juan Pablo Carbajal <car...@if...> +%% +%% All rights reserved. +%% (simplified BSD License) +%% +%% Redistribution and use in source and binary forms, with or without +%% modification, are permitted provided that the following conditions are met: +%% +%% 1. Redistributions of source code must retain the above copyright notice, this +%% list of conditions and the following disclaimer. +%% +%% 2. Redistributions in binary form must reproduce the above copyright notice, +%% this list of conditions and the following disclaimer in the documentation +%% and/or other materials provided with the distribution. +%% +%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +%% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +%% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +%% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +%% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +%% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +%% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +%% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +%% POSSIBILITY OF SUCH DAMAGE. +%% +%% The views and conclusions contained in the software and documentation are +%% those of the authors and should not be interpreted as representing official +%% policies, either expressed or implied, of copyright holder. + +%% -*- texinfo -*- +%% @deftypefn {Function File} {@var{nm} = } vectorNorm (@var{v}) +%% @deftypefnx {Function File} {@var{nm} = } vectorNorm (@var{v},@var{n}) +%% Compute norm of a vector, or of a set of vectors +%% +%% Without extra arguments, returns the euclidean norm of vector V. +%% Optional argument @var{n} specifies the norm to use. N can be any value +%% greater than 0. +%% @table +%% @item N=1 +%% City lock norm. +%% @item N=2 +%% Euclidean norm. +%% @item N=inf +%% Compute max coord. +%% @end table +%% +%% When @var{v} is a MxN array, compute norm for each vector of the array. +%% Vector are given as rows. Result is then a Mx1 array. +%% +%% Example +%% +%% @example +%% n1 = vectorNorm([3 4]) +%% n1 = +%% 5 +%% +%% n2 = vectorNorm([1, 10], inf) +%% n2 = +%% 10 +%% @end example +%% +%% @seealso{vectors2d, vectorAngle} +%% @end deftypefn + +function n = vectorNorm(v, varargin) + + % size of vector + dim = size(v); + + % extract the type of norm to compute + d = 2; + if ~isempty(varargin) + d = varargin{1}; + end + + if d==2 + % euclidean norm: sum of squared coordinates, and take square root + if dim(1)==1 || dim(2)==1 + n = sqrt(sum(v.*v)); + else + n = sqrt(sum(v.*v, 2)); + end + elseif d==1 + % absolute norm: sum of absolute coordinates + if dim(1)==1 || dim(2)==1 + n = sum(abs(v)); + else + n = sum(abs(v), 2); + end + elseif d==inf + % infinite norm: uses the maximal corodinate + if dim(1)==1 || dim(2)==1 + n = max(v); + else + n = max(v, [], 2); + end + else + % Other norms, use explicit but slower expression + if dim(1)==1 || dim(2)==1 + n = power(sum(power(v, d)), 1/d); + else + n = power(sum(power(v, d), 2), 1/d); + end + end + +endfunction + +%!assert (5, vectorNorm ([3 4])) +%!assert(10, vectorNorm ([1, 10], inf)) + Copied: trunk/octave-forge/main/geometry/geom2d/inst/vectors2d.m (from rev 8710, trunk/octave-forge/main/geometry/matGeom_raw/geom2d/vectors2d.m) =================================================================== --- trunk/octave-forge/main/geometry/geom2d/inst/vectors2d.m (rev 0) +++ trunk/octave-forge/main/geometry/geom2d/inst/vectors2d.m 2011-10-09 01:37:39 UTC (rev 8714) @@ -0,0 +1,54 @@ +%% Copyright (c) 2011, INRA +%% 2008-2011, David Legland <dav...@gr...> +%% 2011 Adapted to Octave by Juan Pablo Carbajal <car...@if...> +%% +%% All rights reserved. +%% (simplified BSD License) +%% +%% Redistribution and use in source and binary forms, with or without +%% modification, are permitted provided that the following conditions are met: +%% +%% 1. Redistributions of source code must retain the above copyright notice, this +%% list of conditions and the following disclaimer. +%% +%% 2. Redistributions in binary form must reproduce the above copyright notice, +%% this list of conditions and the following disclaimer in the documentation +%% and/or other materials provided with the distribution. +%% +%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +%% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +%% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +%% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +%% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +%% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +%% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +%% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +%% POSSIBILITY OF SUCH DAMAGE. +%% +%% The views and conclusions contained in the software and documentation are +%% those of the authors and should not be interpreted as representing official +%% policies, either expressed or implied, of copyright holder. + +%% -*- texinfo -*- +%% @deftypefn {Function File} vectors2d () +%% Description of functions operating on plane vectors +%% +%% A vector is defined by its two cartesian coordinates, put into a row +%% vector of 2 elements: +%% @code{V = [vx vy];} +%% +%% Several vectors are stored in a matrix with two columns, one for the +%% x-coordinate, one for the y-coordinate. +%% @voce{VS = [vx1 vy1 ; vx2 vy2 ; vx3 vy3];} +%% +%% @seealso{vectorNorm, vectorAngle, isPerpendicular, isParallel, +%% normalizeVector, transformVector, rotateVector} +%% @end deftypefn + +function vectors2d + + help('vectors2d'); + +endfunction Deleted: trunk/octave-forge/main/geometry/matGeom_raw/Tests/geom2d/testCreateRay.m =================================================================== --- trunk/octave-forge/main/geometry/matGeom_raw/Tests/geom2d/testCreateRay.m 2011-10-08 12:59:54 UTC (rev 8713) +++ trunk/octave-forge/main/geometry/matGeom_raw/Tests/geom2d/testCreateRay.m 2011-10-09 01:37:39 UTC (rev 8714) @@ -1,38 +0,0 @@ -function test_suite = testCreateRay(varargin) -%testCreateRay One-line description here, please. -% output = testCreateRay(input) -% -% Example -% testCreateRay -% -% See also -% -% -% ------ -% Author: David Legland -% e-mail: dav...@gr... -% Created: 2009-04-22, using Matlab 7.7.0.471 (R2008b) -% Copyright 2009 INRA - Cepia Software Platform. -% Licensed under the terms of the LGPL, see the file "license.txt" - -initTestSuite; - -function testCreateRay2Points - -p1 = [1 1]; -p2 = [2 3]; -ray = createRay(p1, p2); - -assertElementsAlmostEqual(p1, ray(1,1:2)); -assertElementsAlmostEqual(p2-p1, ray(1,3:4)); - -function testCreateRay2Arrays - -p1 = [1 1;1 1]; -p2 = [2 3;2 4]; -ray = createRay(p1, p2); - -assertEqual(2, size(ray, 1)); -assertElementsAlmostEqual(p1, ray(:,1:2)); -assertElementsAlmostEqual(p2-p1, ray(:,3:4)); - Deleted: trunk/octave-forge/main/geometry/matGeom_raw/geom2d/createRay.m =================================================================== --- trunk/octave-forge/main/geometry/matGeom_raw/geom2d/createRay.m 2011-10-08 12:59:54 UTC (rev 8713) +++ trunk/octave-forge/main/geometry/matGeom_raw/geom2d/createRay.m 2011-10-09 01:37:39 UTC (rev 8714) @@ -1,90 +0,0 @@ -%% Copyright (c) 2011, INRA -%% 2007-2011, David Legland <dav...@gr...> -%% 2011 Adapted to Octave by Juan Pablo Carbajal <car...@if...> -%% -%% All rights reserved. -%% (simplified BSD License) -%% -%% Redistribution and use in source and binary forms, with or without -%% modification, are permitted provided that the following conditions are met: -%% -%% 1. Redistributions of source code must retain the above copyright notice, this -%% list of conditions and the following disclaimer. -%% -%% 2. Redistributions in binary form must reproduce the above copyright notice, -%% this list of conditions and the following disclaimer in the documentation -%% and/or other materials provided with the distribution. -%% -%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -%% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -%% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -%% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -%% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -%% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -%% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -%% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -%% POSSIBILITY OF SUCH DAMAGE. -%% -%% The views and conclusions contained in the software and documentation are -%% those of the authors and should not be interpreted as representing official -%% policies, either expressed or implied, of copyright holder. - - -function ray = createRay(varargin) -%CREATERAY Create a ray (half-line), from various inputs -% -% RAY = createRay(POINT, ANGLE) -% POINT is a N*2 array giving starting point of the ray, and ANGLE is the -% orientation of the ray. -% -% RAY = createRay(X0, Y0, ANGLE) -% Specify ray origin with 2 input arguments. -% -% RAY = createRay(P1, P2) -% Create a ray starting from point P1 and going in the direction of point -% P2. -% -% Ray is represented in a parametric form: [x0 y0 dx dy] -% x = x0 + t*dx -% y = y0 + t*dy; -% for all t>0 -% -% Example -% origin = [3 4]; -% theta = pi/6; -% ray = createRay(origin, theta); -% figure(1); clf; hold on; -% axis([0 10 0 10]); -% drawRay(ray); -% -% See also: -% rays2d, createLine, points2d -% -% ------ -% Author: David Legland -% e-mail: dav...@gr... -% Created: 2007-10-18 -% Copyright 2007 INRA - BIA PV Nantes - MIAJ Jouy-en-Josas. - -if length(varargin)==2 - p0 = varargin{1}; - arg = varargin{2}; - if size(arg, 2)==1 - % second input is the ray angle - ray = [p0 cos(arg) sin(arg)]; - else - % second input is another point - ray = [p0 arg-p0]; - end - -elseif length(varargin)==3 - x = varargin{1}; - y = varargin{2}; - theta = varargin{3}; - ray = [x y cos(theta) sin(theta)]; - -else - error('Wrong number of arguments in ''createRay'' '); -end Deleted: trunk/octave-forge/main/geometry/matGeom_raw/geom2d/drawEdge.m =================================================================== --- trunk/octave-forge/main/geometry/matGeom_raw/geom2d/drawEdge.m 2011-10-08 12:59:54 UTC (rev 8713) +++ trunk/octave-forge/main/geometry/matGeom_raw/geom2d/drawEdge.m 2011-10-09 01:37:39 UTC (rev 8714) @@ -1,162 +0,0 @@ -%% Copyright (c) 2011, INRA -%% 2007-2011, David Legland <dav...@gr...> -%% 2011 Adapted to Octave by Juan Pablo Carbajal <car...@if...> -%% -%% All rights reserved. -%% (simplified BSD License) -%% -%% Redistribution and use in source and binary forms, with or without -%% modification, are permitted provided that the following conditions are met: -%% -%% 1. Redistributions of source code must retain the above copyright notice, this -%% list of conditions and the following disclaimer. -%% -%% 2. Redistributions in binary form must reproduce the above copyright notice, -%% this list of conditions and the following disclaimer in the documentation -%% and/or other materials provided with the distribution. -%% -%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -%% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -%% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -%% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -%% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -%% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -%% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -%% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -%% POSSIBILITY OF SUCH DAMAGE. -%% -%% The views and conclusions contained in the software and documentation are -%% those of the authors and should not be interpreted as representing official -%% policies, either expressed or implied, of copyright holder. - - -function varargout = drawEdge(varargin) -%DRAWEDGE Draw an edge given by 2 points -% -% drawEdge(x1, y1, x2, y2); -% draw an edge between the points (x1 y1) and (x2 y2). -% -% drawEdge([x1 y1 x2 y2]) ; -% drawEdge([x1 y1], [x2 y2]); -% specify data either as bundled edge, or as 2 points -% -% The function supports 3D edges: -% drawEdge([x1 y1 z1 x2 y2 z2]); -% drawEdge([x1 y1 z1], [x2 y2 z2]); -% drawEdge(x1, y1, z1, x2, y2, z2); -% -% Arguments can be single values or array of size [N*1]. In this case, -% the function draws multiple edges. -% -% H = drawEdge(..., OPT), with OPT being a set of pairwise options, can -% specify color, line width and so on... -% -% H = drawEdge(...) return handle(s) to created edges(s) -% -% See also: -% edges2d, drawCenteredEdge, drawLine -% -% --------- -% author : David Legland -% INRA - TPV URPOI - BIA IMASTE -% created the 31/10/2003. -% - -% HISTORY -% 19/02/2004 add support for arrays of edges. -% 31/03/2004 change format of edges to [P1 P2] and variants. -% 28/11/2004 add support for 3D edges -% 01/08/2005 add support for drawing options -% 31/05/2007 update doc, and code makeup -% 03/08/2010 re-organize code - -% separate edge and optional arguments -[edge options] = parseInputArguments(varargin{:}); - -% draw the edges -if size(edge, 2)==4 - h = drawEdge_2d(edge, options); -else - h = drawEdge_3d(edge, options); -end - -% eventually return handle to created edges -if nargout>0 - varargout{1}=h; -end - - -function h = drawEdge_2d(edge, options) - -h = -1*ones(size(edge, 1), 1); - -for i=1:size(edge, 1) - if isnan(edge(i,1)) - continue; - end - h(i) = line(... - [edge(i, 1) edge(i, 3)], ... - [edge(i, 2) edge(i, 4)], options{:}); -end - - -function h = drawEdge_3d(edge, options) - -h = -1*ones(size(edge, 1), 1); - -for i=1:size(edge, 1) - if isnan(edge(i,1)) - continue; - end - h(i) = line( ... - [edge(i, 1) edge(i, 4)], ... - [edge(i, 2) edge(i, 5)], ... - [edge(i, 3) edge(i, 6)], options{:}); -end - - -function [edge options] = parseInputArguments(varargin) - -% default values for parameters -edge = []; - -% find the number of arguments defining edges -nbVal=0; -for i=1:nargin - if isnumeric(varargin{i}) - nbVal = nbVal+1; - else - % stop at the first non-numeric value - break; - end -end - -% extract drawing options -options = varargin(nbVal+1:end); - -% ensure drawing options have correct format -if length(options)==1 - options = [{'color'}, options]; -end - -% extract edges characteristics -if nbVal==1 - % all parameters in a single array - edge = varargin{1}; - -elseif nbVal==2 - % parameters are two points, or two arrays of points, of size N*2. - p1 = varargin{1}; - p2 = varargin{2}; - edge = [p1 p2]; - -elseif nbVal==4 - % parameters are 4 parameters of the edge : x1 y1 x2 and y2 - edge = [varargin{1} varargin{2} varargin{3} varargin{4}]; - -elseif nbVal==6 - % parameters are 6 parameters of the edge : x1 y1 z1 x2 y2 and z2 - edge = [varargin... [truncated message content] |