diff options
author | Shashank | 2017-05-29 12:40:26 +0530 |
---|---|---|
committer | Shashank | 2017-05-29 12:40:26 +0530 |
commit | 0345245e860375a32c9a437c4a9d9cae807134e9 (patch) | |
tree | ad51ecbfa7bcd3cc5f09834f1bb8c08feaa526a4 /modules/graphics/macros/surf.sci | |
download | scilab_for_xcos_on_cloud-0345245e860375a32c9a437c4a9d9cae807134e9.tar.gz scilab_for_xcos_on_cloud-0345245e860375a32c9a437c4a9d9cae807134e9.tar.bz2 scilab_for_xcos_on_cloud-0345245e860375a32c9a437c4a9d9cae807134e9.zip |
CMSCOPE changed
Diffstat (limited to 'modules/graphics/macros/surf.sci')
-rwxr-xr-x | modules/graphics/macros/surf.sci | 634 |
1 files changed, 634 insertions, 0 deletions
diff --git a/modules/graphics/macros/surf.sci b/modules/graphics/macros/surf.sci new file mode 100755 index 000000000..a52b9d6c4 --- /dev/null +++ b/modules/graphics/macros/surf.sci @@ -0,0 +1,634 @@ +// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab +// Copyright (C) 2004-2006 - INRIA - Fabrice Leray +// This file must be used under the terms of the CeCILL. +// This source file is licensed as described in the file COPYING, which +// you should have received as part of this distribution. The terms +// are also available at +// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt + + +function surf(varargin) + [lhs,rhs]=argn(0); + + if ~rhs + Z= [ 0.0001 0.0013 0.0053 -0.0299 -0.1809 -0.2465 -0.1100 -0.0168 -0.0008 -0.0000; .. + 0.0005 0.0089 0.0259 -0.3673 -1.8670 -2.4736 -1.0866 -0.1602 -0.0067 0.0000; .. + 0.0004 0.0214 0.1739 -0.3147 -4.0919 -6.4101 -2.7589 -0.2779 0.0131 0.0020; .. + -0.0088 -0.0871 0.0364 1.8559 1.4995 -2.2171 -0.2729 0.8368 0.2016 0.0130; .. + -0.0308 -0.4313 -1.7334 -0.1148 3.0731 0.4444 2.6145 2.4410 0.4877 0.0301; .. + -0.0336 -0.4990 -2.3552 -2.1722 0.8856 -0.0531 2.6416 2.4064 0.4771 0.0294; .. + -0.0137 -0.1967 -0.8083 0.2289 3.3983 3.1955 2.4338 1.2129 0.2108 0.0125; .. + -0.0014 -0.0017 0.3189 2.7414 7.1622 7.1361 3.1242 0.6633 0.0674 0.0030; .. + 0.0002 0.0104 0.1733 1.0852 2.6741 2.6725 1.1119 0.1973 0.0152 0.0005; .. + 0.0000 0.0012 0.0183 0.1099 0.2684 0.2683 0.1107 0.0190 0.0014 0.0000]; + f=gcf(); + f.color_map = jetcolormap(64); + surf(Z,"edgeco","b","marker","d","markersiz",9,"markeredg","red","markerfac","k"); + return; + end + + X=[]; + Y=[]; + Z=[]; + C=[]; + + CurColor = 0; // current color used if no color specified via LineSpec + // nor PropertyName + + ListArg = varargin; + + //detect and set the current axes now: + if type(ListArg(1)) == 9 + hdle = ListArg(1); + if (hdle.type == "Axes") + sca(ListArg(1)); + ListArg(1) = null(); // remove this parameter from the list + else + error(msprintf(gettext("%s: Wrong type for input argument #%d: An ''Axes'' handle expected.\n"), "surf", 1)); + return; + end + end + + + nv = size(ListArg) + + + T=[]; + d=[]; + + typeOfPlot = "surf"; + //given_data = 2; + + for k=1:nv + T(k,1) = type(ListArg(k)) + end + + given_data = 0; + P1 = 0; + + for i=1:nv + if T(i) == 1 + given_data = given_data +1; + else + P1 = i; // Position of the first PropertyName field + break; + end + end + + + // delay the drawing commands + // smart drawlater + current_figure=gcf(); + cur_draw_mode = current_figure.immediate_drawing; + current_figure.immediate_drawing = "off"; + + colormap_size = size(current_figure.color_map,1); + + if given_data == 1 //surf(Z) with Z giving us data + color info. + // ---------------------------------------------------------- // + + if or(size(ListArg(1))==1) + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input argument #%d: A matrix of size greater than %d-by-%d expected.\n"), "surf", 1, 2, 2)); + return; + end + + X = 1:size(ListArg(1),2); + Y = 1:size(ListArg(1),1); + Z = ListArg(1)'; // here a transposition is needed + C = Z; + + [XX,YY,ZZ] = genfac3d(X,Y,Z); + CC = ZZ; // Add a color matrix based on Z values + + elseif given_data == 2 //surf(Z,COLOR) + // ---------------------------------------------------------- // + if or(size(ListArg(1))==1) + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input argument #%d: A matrix of size greater than %d-by-%d expected.\n"), "surf", 1, 2, 2)); + return; + end + + if ((size(ListArg(1)) <> size(ListArg(2))) & (size(ListArg(1))-1 <> size(ListArg(2)))) + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input argument #%d: A %d-by-%d or %d-by-%d matrix expected.\n"),.. + "surf", 2, size(ListArg(1),1), size(ListArg(1),2), size(ListArg(1),1) - 1, size(ListArg(1),2) -1 )); + return; + end + + X = 1:size(ListArg(1),2); + Y = 1:size(ListArg(1),1); + Z = ListArg(1)'; // here a transposition is needed + C = ListArg(2)'; + + [XX,YY,ZZ] = genfac3d(X,Y,Z); + + if (size(ListArg(2)) == size(ListArg(1))) // color number == zdata number + [XX,YY,CC] = genfac3d(X,Y,C); // CC must be a color matrix of size nf x n + elseif ((size(ListArg(2))) == size(ListArg(1))-1) // color number -1 == zdata number => ONLY flat mode can be enabled + Ctmp=[]; + Ctmp = [C [C(:,$)]] ; + Ctmp = [Ctmp; Ctmp($,:)]; + [XX,YY,CC] = genfac3d(X,Y,Ctmp); // CC must be a color matrix of size nf x n + end + + elseif given_data == 3 //surf(X,Y,Z) with Z giving us data + color info. + // ---------------------------------------------------------- // + + X = ListArg(1) + Y = ListArg(2); + Z = ListArg(3); + + // check if the call is OK + err = execstr("[XX,YY,ZZ,CC] = CreateFacetsFromXYZ(X,Y,Z,current_figure, cur_draw_mode)","errcatch","n"); + + if (err <> 0) then + // reset data + processSurfError(current_figure, cur_draw_mode); + end + + elseif given_data == 4 //surf(X,Y,Z,COLOR) + // ---------------------------------------------------------- // + if ((size(ListArg(3)) <> size(ListArg(4))) & (size(ListArg(3))-1 <> size(ListArg(4)))) + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input argument #%d: A %d-by-%d or %d-by-%d matrix expected.\n"),.. + "surf", 4, size(ListArg(3),1), size(ListArg(3),2), size(ListArg(3),1) - 1, size(ListArg(3),2) -1 )); + return; + end + + X = ListArg(1) + Y = ListArg(2); + Z = ListArg(3); + C = ListArg(4); + + // check if the call is OK + err = execstr("[XX,YY,ZZ,CC] = CreateFacetsFromXYZColor(X,Y,Z,C,current_figure, cur_draw_mode)","errcatch","n"); + if (err <> 0) then + // reset data + processSurfError(current_figure, cur_draw_mode); + end + end + + + // P1 is the position of the first PropertyName field. + Property = P1; + + while ((Property <> 0) & (Property <= nv-1)) + PropertyName = ListArg(Property); + PropertyValue = ListArg(Property+1); + + // Xdata + PName = getSurfPropertyName(PropertyName); + if (PName == "xdata") + + if (type(PropertyValue)<>1) + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong type for input argument ''%s'': A Real matrix expected.\n"), "surf", "xdata")); + return; + end + + X = PropertyValue; + [XX,tmp2,tmp3] = CreateFacetsFromXYZ(PropertyValue,Y,Z,current_figure, cur_draw_mode); + + // Ydata + elseif (PName == "ydata") + + if (type(PropertyValue)<>1) + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong type for input argument ''%s'': A Real matrix expected.\n"), "surf", "ydata")); + return; + end + + Y = PropertyValue; + [tmp1,YY,tmp3] = CreateFacetsFromXYZ(X,PropertyValue,Z,current_figure, cur_draw_mode); + + // Zdata + elseif (PName == "zdata") + + if (type(PropertyValue)<>1) then + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong type for input argument ''%s'': A Real matrix expected.\n"), "surf", "zdata")); + return; + end + if (or(size(PropertyValue)==1)) then + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A matrix of size greater than %d-by-%d expected.\n"), "surf", "zdata", 2, 2)); + return; + end + + Z = PropertyValue; + [tmp1,tmp2,ZZ] = CreateFacetsFromXYZ(X,Y,PropertyValue,current_figure, cur_draw_mode); + + end + + Property = Property+2; + end + + if isempty(XX) | isempty(YY) | isempty(ZZ) then + // Nothing will be drawn so return (see http://bugzilla.scilab.org/13180 ) + return + end + + // surf is made now ! + // with default option to simulate the Matlab mode + + err = execstr("plot3d(XX,YY,list(ZZ,CC))","errcatch","n"); + + if err <> 0 + processSurfError(current_figure, cur_draw_mode); + end + + a=gca(); + a.cube_scaling = "on"; + a.rotation_angles = [51 -125]; + e=gce(); + e.hiddencolor=0; // to avoid painting the hidden facets + e.color_flag=4; // Matlab special flat mode by default (different from mode 2) + e.cdata_mapping = "scaled" + + + // F.Leray + // Today: 17.03.05 + // XYZ-DataMode under Matlab seems really bugged (see following samples and read Matlab doc.): + // + // surf(X,Y,Z,'XDataMode','auto') + // surf(X,Y,Z,'XDataMode','auto') + // surf(X+20,Y,Z,'XDataMode','auto') + // surf(X+20,Y,Z,'XDataMode','man') + // surf(X+20,Y,Z,'XDataMode','auto') + // surf(X+20,Y,Z,'Xdata',X-100,'XDataMode','auto') + // surf(X+20,Y,Z,'Xdata',X-100,'XDataMode','man') + // surf(X+20,Y,Z,'XData',X-100,'XDataMode','auto') + // surf(X+20,Y,Z,'XData',X-100,'XDataMode','man') + // surf(Z,'XData',X-100,'XDataMode','man') + // surf(Z,'XData',X-100,'XDataMode','auto') + // surf(X+20,Y,Z,'XDataMode','man') + // surf(X+20,Y,Z,'XDataMode','auto') + // + // That is why I do not support those properties. + // Below and in comment is the code we could add to treat those properties. + // by giving XYZ-DataModeVal to setSurfProperty (to better treat XYZ-Data input). + // + // + //XdataModeVal=1; + //YdataModeVal=1; + //ZdataModeVal=1; + // + //if Property <> 0 + // XdataMode = getIndexInStringTable('xdatam',ListArg([Property nv])) + // if XdataMode <> [] + // XdataModeVal = getIndexInStringTable(ListArg(XdataMode+1),['auto','manual']) + // if size(XdataModeVal,'*') <> 1 + // disp("Error: Bad XdataMode selected"); + // return; + // end + // end + // + // YdataMode = getIndexInStringTable('ydatam',ListArg([Property nv])) + // if YdataMode <> [] + // YdataModeVal = getIndexInStringTable(ListArg(YdataMode+1),['auto','manual']) + // if size(YdataModeVal,'*') <> 1 + // disp("Error: Bad YdataMode selected"); + // return; + // end + // end + // + // ZdataMode = getIndexInStringTable('zdatam',ListArg([Property nv])) + // if ZdataMode <> [] + // ZdataModeVal = getIndexInStringTable(ListArg(ZdataMode+1),['auto','manual']) + // if size(ZdataModeVal,'*') <> 1 + // disp("Error: Bad ZdataMode selected"); + // return; + // end + // end + //end + // + + + /////////////////////////////////// + //Global Property treatment // + //PropertyName and PropertyValue // + /////////////////////////////////// + + + // P1 is the position of the first PropertyName field. + Property = P1; + + current_surface = gce(); // get the newly created fac3d + current_surface.mark_size_unit="point"; + + + + while ((Property <> 0) & (Property <= nv-1)) + setSurfProperty(ListArg(Property),ListArg(Property+1),current_surface,X,Y,Z,C,current_figure,cur_draw_mode) + + Property = Property+2; + end + + + //postponed drawings are done now ! + // smart drawnow + ResetFigureDDM(current_figure, cur_draw_mode); + +endfunction + +// +//function [C] = build_interp_color(C,colormap_size) +//// C is considered as a data value in Matlab +//MIN = min(C); +//MAX = max(C); +//NCOLMIN = 1; +//NCOLMAX = colormap_size; +// +//if MIN <> MAX +// C = (NCOLMIN-NCOLMAX)/(MIN-MAX) * C + (MIN*NCOLMAX - NCOLMIN*MAX)/(MIN-MAX); +// C = round(C); +//else +// C = ones(C) * (NCOLMIN+NCOLMAX)/2; +//end +//endfunction +// +// + + +function k=getIndexInStringTable(pattern,table) + + str = convstr(pattern); + k=find(part(table,1:length(str))==str); + +endfunction + +function [XX,YY,ZZ,CC] = CreateFacetsFromXYZ(X,Y,Z,current_figure, cur_draw_mode) + + if or(size(X)==1) & or(size(Y)==1) // X and Y are vector + + tmp = X; + X = Y; + Y = tmp; + + if size(X,"*") ~= size(Z,1) then + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A vector of size %d expected.\n"), "surf", "Y", size(Z,1))); + return; + end + + if size(Y,"*") ~= size(Z,2) then + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A vector of size %d expected.\n"), "surf", "X", size(Z,2))); + return; + end + + [XX,YY,ZZ] = genfac3d(Y,X,Z'); + + // COLOR treatment + CC = ZZ; + + elseif and(size(X)>1) & and(size(Y)>1) // X and Y are matrix + + if or(size(X) ~= size(Y)) then + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", "X", "Y")); + return; + end + + if or(size(X) ~= size(Z)) then + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", "X", "Z")); + return; + end + + [XX,YY,ZZ] = nf3d(X,Y,Z); + + // COLOR treatment + CC = ZZ; + + elseif or(size(X)==1) & and(size(Y)>1) // X is a vector and Y is a matrix + + if size(X,"*") ~= size(Z,2) then + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A vector of size %d expected.\n"), "surf", "X", size(Z,2))); + return; + end + + if or(size(Y) ~= size(Z)) then + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", "Y", "Z")); + return; + end + + // X vector + // Y matrix + // Z matrix + + X=X(:)'; // X is forced to be a row vector + XMAT=[]; + + for i=1:size(Z,2) + XMAT=[XMAT;X]; + end + + [XX,YY,ZZ] = nf3d(XMAT,Y,Z); + + // COLOR treatment + CC = ZZ; + + elseif or(size(Y)==1) & and(size(X)>1) // Y is a vector and X is a matrix + + if or(size(X) ~= size(Z)) then + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", "X", "Z")); + return; + end + + if size(Y,"*") ~= size(Z,2) then + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A vector of size %d expected.\n"), "surf", "Y", size(Z,2))); + return; + end + + // Y vector + // X matrix + // Z matrix + + Y=Y(:); // Y is forced to be a column vector + YMAT=[]; + + for i=1:size(Z,1) + YMAT=[YMAT,Y]; + end + + [XX,YY,ZZ] = nf3d(X,YMAT,Z); + + // COLOR treatment + CC = ZZ; + + else + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Same size expected.\n"), "surf", "X", "Y")); + return; + end + +endfunction + +function [XX,YY,ZZ,CC] = CreateFacetsFromXYZColor(X,Y,Z,C,current_figure, cur_draw_mode) + + if or(size(X)==1) & or(size(Y)==1) // X and Y are vector + + Z = Z'; // here a transposition is needed + C = C'; // here a transposition is needed + + if size(X,"*") ~= size(Z,1) then + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A vector of size %d expected.\n"), "surf", "X", size(Z,1))); + return; + end + + if size(Y,"*") ~= size(Z,2) then + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A vector of size %d expected.\n"), "surf", "Y", size(Z,2))); + return; + end + + [XX,YY,ZZ] = genfac3d(X,Y,Z); + + // COLOR treatment + if (size(C) == size(Z)) // color number == zdata number + [XX,YY,CC] = genfac3d(X,Y,C); // CC must be a color matrix of size nf x n + elseif (size(C) == size(Z)-1) // color number -1 == zdata number => ONLY flat mode can be enabled + Ctmp=[]; + Ctmp = [C [C(:,$)]] ; + Ctmp = [Ctmp; Ctmp($,:)]; + [XX,YY,CC] = genfac3d(X,Y,Ctmp); // CC must be a color matrix of size nf x n + end + + elseif and(size(X)>1) & and(size(Y)>1) // X and Y are matrices + + if or(size(X) ~= size(Y)) then + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", "X", "Y")); + return; + end + + if or(size(X) ~= size(Z)) then + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", "X", "Z")); + return; + end + + [XX,YY,ZZ] = nf3d(X,Y,Z); + + // COLOR treatment + if (size(C) == size(Z)) // color number == zdata number + [XX,YY,CC] = nf3d(X,Y,C); // CC must be a color matrix of size nf x n + elseif (size(C) == size(Z)-1) // color number -1 == zdata number => ONLY flat mode can be enabled + Ctmp=[]; + Ctmp = [C [C(:,$)]] ; + Ctmp = [Ctmp; Ctmp($,:)]; + [XX,YY,CC] = nf3d(X,Y,Ctmp); // CC must be a color matrix of size nf x n + end + + elseif or(size(X)==1) & and(size(Y)>1) // X is a vector and Y is a matrix + + if size(X,"*") ~= size(Z,2) then + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A vector of size %d expected.\n"), "surf", "X", size(Z,2))); + return; + end + + if or(size(Y) ~= size(Z)) then + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", "Y", "Z")); + return; + end + + // X vector + // Y matrix + // Z matrix + + X=X(:)'; // X is forced to be a row vector + XMAT=[]; + + for i=1:size(Z,2) + XMAT=[XMAT;X]; + end + + + + [XX,YY,ZZ] = nf3d(XMAT,Y,Z); + + // COLOR treatment + if (size(C) == size(Z)) // color number == zdata number + [XX,YY,CC] = nf3d(XMAT,Y,C); // CC must be a color matrix of size nf x n + elseif (size(C) == size(Z)-1) // color number -1 == zdata number => ONLY flat mode can be enabled + Ctmp=[]; + Ctmp = [C [C(:,$)]] ; + Ctmp = [Ctmp; Ctmp($,:)]; + [XX,YY,CC] = nf3d(XMAT,Y,Ctmp); // CC must be a color matrix of size nf x n + end + + elseif or(size(Y)==1) & and(size(X)>1) // Y is a vector and X is a matrix + + if or(size(X) ~= size(Z)) then + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", "X", "Z")); + return; + end + + if size(Y,"*") ~= size(Z,2) then + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A vector of size %d expected.\n"), "surf", "Y", size(Z,2))); + return; + end + + + // Y vector + // X matrix + // Z matrix + + Y=Y(:); // Y is forced to be a column vector + YMAT=[]; + + for i=1:size(Z,1) + YMAT=[YMAT,Y]; + end + + [XX,YY,ZZ] = nf3d(X,YMAT,Z); + + // COLOR treatment + if (size(C) == size(Z)) // color number == zdata number + [XX,YY,CC] = nf3d(X,YMAT,C); // CC must be a color matrix of size nf x n + elseif (size(C) == size(Z)-1) // color number -1 == zdata number => ONLY flat mode can be enabled + Ctmp=[]; + Ctmp = [C [C(:,$)]] ; + Ctmp = [Ctmp; Ctmp($,:)]; + [XX,YY,CC] = nf3d(X,YMAT,Ctmp); // CC must be a color matrix of size nf x n + end + + else + ResetFigureDDM(current_figure, cur_draw_mode); + error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", "X", "Y")); + return; + end + +endfunction + +// If an error occurs in the surf code, we need to catch it +// order to reset some default values +function processSurfError(cur_figure, cur_draw_mode) + // reset data + ResetFigureDDM(current_figure, cur_draw_mode); + + // get the error + [err_message, err_number, err_line, err_func] = lasterror(%t); + + // rethrow it + + // for now error can only have a single string as input. + // If there are several lines we need to concatane them. + err_message_nbLines = size(err_message, "*"); + if (err_message_nbLines > 1) then + // put a \n betwee, each string + err_message(1) = strcat(err_message, "\n"); + end + error(err_message(1), err_number); +endfunction |