From: <jpi...@us...> - 2011-10-21 19:22:19
|
Revision: 8827 http://octave.svn.sourceforge.net/octave/?rev=8827&view=rev Author: jpicarbajal Date: 2011-10-21 19:22:12 +0000 (Fri, 21 Oct 2011) Log Message: ----------- geometry. all edge* functions Modified Paths: -------------- trunk/octave-forge/main/geometry/doc/NEWS Added Paths: ----------- trunk/octave-forge/main/geometry/geom2d/inst/edgeLength.m trunk/octave-forge/main/geometry/geom2d/inst/edgePosition.m trunk/octave-forge/main/geometry/geom2d/inst/edgeToLine.m Removed Paths: ------------- trunk/octave-forge/main/geometry/matGeom_raw/geom2d/edgeLength.m trunk/octave-forge/main/geometry/matGeom_raw/geom2d/edgePosition.m trunk/octave-forge/main/geometry/matGeom_raw/geom2d/edgeToLine.m Modified: trunk/octave-forge/main/geometry/doc/NEWS =================================================================== --- trunk/octave-forge/main/geometry/doc/NEWS 2011-10-21 19:17:25 UTC (rev 8826) +++ trunk/octave-forge/main/geometry/doc/NEWS 2011-10-21 19:22:12 UTC (rev 8827) @@ -142,6 +142,9 @@ isPointInEllipse.m isPointOnCircle.m isPointOnLine.m + edgeLength.m + edgePosition.m + edgeToLine.m =============================================================================== Copied: trunk/octave-forge/main/geometry/geom2d/inst/edgeLength.m (from rev 8818, trunk/octave-forge/main/geometry/matGeom_raw/geom2d/edgeLength.m) =================================================================== --- trunk/octave-forge/main/geometry/geom2d/inst/edgeLength.m (rev 0) +++ trunk/octave-forge/main/geometry/geom2d/inst/edgeLength.m 2011-10-21 19:22:12 UTC (rev 8827) @@ -0,0 +1,60 @@ +%% 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{len} = } edgeLength (@var{edge}) +%% Return length of an edge +%% +%% L = edgeLength(EDGE); +%% Returns the length of an edge, with parametric representation: +%% [x1 y1 x2 y2]. +%% +%% The function also works for several edges, in this case input is a +%% [N*4] array, containing parametric representation of each edge, and +%% output is a [N*1] array containing length of each edge. +%% +%% @seealso{edges2d, edgeAngle} +%% @end deftypefn + +function len = edgeLength(varargin) + + % TODO : specify norm (euclidian, taxi, ...). + + nargs = length(varargin); + if nargs == 1 + edge = varargin{1}; + len = sqrt(power(edge(:,3)-edge(:,1), 2) + power(edge(:,4)-edge(:,2), 2)); + end + +endfunction + Copied: trunk/octave-forge/main/geometry/geom2d/inst/edgePosition.m (from rev 8818, trunk/octave-forge/main/geometry/matGeom_raw/geom2d/edgePosition.m) =================================================================== --- trunk/octave-forge/main/geometry/geom2d/inst/edgePosition.m (rev 0) +++ trunk/octave-forge/main/geometry/geom2d/inst/edgePosition.m 2011-10-21 19:22:12 UTC (rev 8827) @@ -0,0 +1,91 @@ +%% 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{d} = } edgePosition (@var{point}, @var{edge}) +%% Return position of a point on an edge +%% +%% POS = edgePosition(POINT, EDGE); +%% Computes position of point POINT on the edge EDGE, relative to the +%% position of edge vertices. +%% EDGE has the form [x1 y1 x2 y2], +%% POINT has the form [x y], and is assumed to belong to edge. +%% The position POS has meaning: +%% POS<0: POINT is located before the first vertex +%% POS=0: POINT is located on the first vertex +%% 0<POS<1: POINT is located between the 2 vertices (on the edge) +%% POS=1: POINT is located on the second vertex +%% POS<0: POINT is located after the second vertex +%% +%% POS = edgePosition(POINT, EDGES); +%% If EDGES is an array of NL edges, return NL positions, corresponding to +%% each edge. +%% +%% POS = edgePosition(POINTS, EDGE); +%% If POINTS is an array of NP points, return NP positions, corresponding +%% to each point. +%% +%% POS = edgePosition(POINTS, EDGES); +%% If POINTS is an array of NP points and edgeS is an array of NL edges, +%% return an array of [NP NL] position, corresponding to each couple +%% point-edge. +%% +%% @seealso{edges2d, createEdge, onEdge} +%% @end deftypefn + +function d = edgePosition(point, edge) + + % number of points and of edges + Nl = size(edge, 1); + Np = size(point, 1); + + if Np==Nl + dxl = edge(:, 3)-edge(:,1); + dyl = edge(:, 4)-edge(:,2); + dxp = point(:, 1) - edge(:, 1); + dyp = point(:, 2) - edge(:, 2); + + d = (dxp.*dxl + dyp.*dyl)./(dxl.*dxl+dyl.*dyl); + + else + % expand one of the array to have the same size + dxl = repmat((edge(:,3)-edge(:,1))', Np, 1); + dyl = repmat((edge(:,4)-edge(:,2))', Np, 1); + dxp = repmat(point(:,1), 1, Nl) - repmat(edge(:,1)', Np, 1); + dyp = repmat(point(:,2), 1, Nl) - repmat(edge(:,2)', Np, 1); + + d = (dxp.*dxl + dyp.*dyl)./(dxl.*dxl+dyl.*dyl); + end + +endfunction + Copied: trunk/octave-forge/main/geometry/geom2d/inst/edgeToLine.m (from rev 8818, trunk/octave-forge/main/geometry/matGeom_raw/geom2d/edgeToLine.m) =================================================================== --- trunk/octave-forge/main/geometry/geom2d/inst/edgeToLine.m (rev 0) +++ trunk/octave-forge/main/geometry/geom2d/inst/edgeToLine.m 2011-10-21 19:22:12 UTC (rev 8827) @@ -0,0 +1,56 @@ +%% Copyright (c) 2011, INRA +%% 2009-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{line} = } edgeToLine (@var{edge}) +%% Convert an edge to a straight line +%% +%% LINE = edgeToLine(EDGE); +%% Returns the line containing the edge EDGE. +%% +%% Example +%% edge = [2 3 4 5]; +%% line = edgeToLine(edge); +%% figure(1); hold on; axis([0 10 0 10]); +%% drawLine(line, 'color', 'g') +%% drawEdge(edge, 'linewidth', 2) +%% +%% @seealso{edges2d, lines2d} +%% @end deftypefn + +function line = edgeToLine(edge) + + line = [edge(:, 1:2) edge(:, 3:4)-edge(:, 1:2)]; + +endfunction + Deleted: trunk/octave-forge/main/geometry/matGeom_raw/geom2d/edgeLength.m =================================================================== --- trunk/octave-forge/main/geometry/matGeom_raw/geom2d/edgeLength.m 2011-10-21 19:17:25 UTC (rev 8826) +++ trunk/octave-forge/main/geometry/matGeom_raw/geom2d/edgeLength.m 2011-10-21 19:22:12 UTC (rev 8827) @@ -1,66 +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 len = edgeLength(varargin) -%EDGELENGTH Return length of an edge -% -% L = edgeLength(EDGE); -% Returns the length of an edge, with parametric representation: -% [x1 y1 x2 y2]. -% -% The function also works for several edges, in this case input is a -% [N*4] array, containing parametric representation of each edge, and -% output is a [N*1] array containing length of each edge. -% -% See also: -% edges2d, edgeAngle -% -% --------- -% -% author : David Legland -% INRA - TPV URPOI - BIA IMASTE -% created the 19/02/2004 -% - -% HISTORY -% 15/04/2005 changes definition for edge, uses [x1 y1 x2 y2] instead of -% [x0 y0 dx dy]. - -% TODO : specify norm (euclidian, taxi, ...). - -nargs = length(varargin); -if nargs == 1 - edge = varargin{1}; - len = sqrt(power(edge(:,3)-edge(:,1), 2) + power(edge(:,4)-edge(:,2), 2)); -end Deleted: trunk/octave-forge/main/geometry/matGeom_raw/geom2d/edgePosition.m =================================================================== --- trunk/octave-forge/main/geometry/matGeom_raw/geom2d/edgePosition.m 2011-10-21 19:17:25 UTC (rev 8826) +++ trunk/octave-forge/main/geometry/matGeom_raw/geom2d/edgePosition.m 2011-10-21 19:22:12 UTC (rev 8827) @@ -1,97 +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 d = edgePosition(point, edge) -%EDGEPOSITION Return position of a point on an edge -% -% POS = edgePosition(POINT, EDGE); -% Computes position of point POINT on the edge EDGE, relative to the -% position of edge vertices. -% EDGE has the form [x1 y1 x2 y2], -% POINT has the form [x y], and is assumed to belong to edge. -% The position POS has meaning: -% POS<0: POINT is located before the first vertex -% POS=0: POINT is located on the first vertex -% 0<POS<1: POINT is located between the 2 vertices (on the edge) -% POS=1: POINT is located on the second vertex -% POS<0: POINT is located after the second vertex -% -% POS = edgePosition(POINT, EDGES); -% If EDGES is an array of NL edges, return NL positions, corresponding to -% each edge. -% -% POS = edgePosition(POINTS, EDGE); -% If POINTS is an array of NP points, return NP positions, corresponding -% to each point. -% -% POS = edgePosition(POINTS, EDGES); -% If POINTS is an array of NP points and edgeS is an array of NL edges, -% return an array of [NP NL] position, corresponding to each couple -% point-edge. -% -% See also: -% edges2d, createEdge, onEdge -% -% --------- -% -% author : David Legland -% INRA - TPV URPOI - BIA IMASTE -% created the 25/05/2004. -% - -% HISTORY: -% 06/12/2009 created from linePosition - -% number of points and of edges -Nl = size(edge, 1); -Np = size(point, 1); - -if Np==Nl - dxl = edge(:, 3)-edge(:,1); - dyl = edge(:, 4)-edge(:,2); - dxp = point(:, 1) - edge(:, 1); - dyp = point(:, 2) - edge(:, 2); - - d = (dxp.*dxl + dyp.*dyl)./(dxl.*dxl+dyl.*dyl); - -else - % expand one of the array to have the same size - dxl = repmat((edge(:,3)-edge(:,1))', Np, 1); - dyl = repmat((edge(:,4)-edge(:,2))', Np, 1); - dxp = repmat(point(:,1), 1, Nl) - repmat(edge(:,1)', Np, 1); - dyp = repmat(point(:,2), 1, Nl) - repmat(edge(:,2)', Np, 1); - - d = (dxp.*dxl + dyp.*dyl)./(dxl.*dxl+dyl.*dyl); -end - Deleted: trunk/octave-forge/main/geometry/matGeom_raw/geom2d/edgeToLine.m =================================================================== --- trunk/octave-forge/main/geometry/matGeom_raw/geom2d/edgeToLine.m 2011-10-21 19:17:25 UTC (rev 8826) +++ trunk/octave-forge/main/geometry/matGeom_raw/geom2d/edgeToLine.m 2011-10-21 19:22:12 UTC (rev 8827) @@ -1,57 +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 line = edgeToLine(edge) -%EDGETOLINE Convert an edge to a straight line -% -% LINE = edgeToLine(EDGE); -% Returns the line containing the edge EDGE. -% -% Example -% edge = [2 3 4 5]; -% line = edgeToLine(edge); -% figure(1); hold on; axis([0 10 0 10]); -% drawLine(line, 'color', 'g') -% drawEdge(edge, 'linewidth', 2) -% -% See also -% edges2d, lines2d -% -% ------ -% Author: David Legland -% e-mail: dav...@gr... -% Created: 2009-07-23, using Matlab 7.7.0.471 (R2008b) -% Copyright 2009 INRA - Cepia Software Platform. - -line = [edge(:, 1:2) edge(:, 3:4)-edge(:, 1:2)]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |