4bee724a9d3cfdd78bc095245659d08dd6733992
[scilab.git] / scilab / modules / graphics / macros / checkXYPair.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA
3 // This file must be used under the terms of the CeCILL.
4 // This source file is licensed as described in the file COPYING, which
5 // you should have received as part of this distribution.  The terms
6 // are also available at
7 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
8
9
10 function [X,Y]=checkXYPair(typeOfPlot,x,y,current_figure,cur_draw_mode)
11
12   ok=%F;
13
14   if type(y)==13 // If y is a function
15     f=y;
16     if and(size(x)~=1)  // then x *must* be a vector
17           ResetFigureDDM(current_figure, cur_draw_mode)
18       error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A vector expected.\n"),typeOfPlot,"X"));
19
20       return;
21     end
22
23     t=x(:); // to ensure that t is a column vector
24
25     [nArgOut,vectInput]=check2dFun(typeOfPlot,f,t,current_figure,cur_draw_mode);
26
27     if nArgOut==1
28       X=t;
29       if vectInput
30         Y=f(t);
31       else
32         Y=zeros(length(t),1);
33         for i=1:length(t)
34           Y(i)=f(t(i));
35         end
36       end
37     elseif nArgOut==2
38       if vectInput
39         [X,Y]=f(t);
40       else
41         X=zeros(length(t),1);
42         Y=zeros(length(t),1);
43         for i=1:length(t)
44
45           // CANNOT DO THE SAME WITH X(i) and Y(i)
46           // instead of xt and yt (scilab parser sees the stuff
47           // as a comparison)
48
49           [xt,yt]=f(t(i));
50           X(i)=xt;Y(i)=yt;
51         end
52       end
53     end
54
55   else // "classical" case
56
57     X=x;
58     Y=y;
59
60     if size(X,1)==1, X=X', end;  // si l'un des vecteurs est une ligne
61     if size(Y,1)==1, Y=Y', end;  // on le transpose.
62
63     if (size(X)==[0 0])
64       ok=%F
65           ResetFigureDDM(current_figure, cur_draw_mode)
66       error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A non empty matrix expected.\n"),typeOfPlot,"X"));
67       return;
68     end
69
70         if (size(Y)==[0 0])
71       ok=%F
72           ResetFigureDDM(current_figure, cur_draw_mode)
73       error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A non empty matrix expected.\n"),typeOfPlot,"Y"));
74       return;
75     end
76
77     if and(size(X)==size(Y)) then
78           // same size for X and Y
79       ok=%T;
80
81       return;
82         end
83
84     if (size(X,2)==1) & (size(Y,1)==size(X,1))
85           // X is a vector
86       ok=%T;
87
88       return;
89     end
90     if (size(X,2)==1) & (size(Y,2)==size(X,1))
91           // X is a vector
92       Y=Y';
93       ok=%T;
94
95           return;
96     end
97
98     if (size(X,2) == 1) & (size(Y,2) == 1) & (size(Y,1) <> size(X,1)) ...
99                                               & (size(Y,1) ~= 1)  then
100           // X and Y are vectors but not of same size
101           ResetFigureDDM(current_figure, cur_draw_mode)
102        error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Incompatible dimensions.\n"),typeOfPlot,"X","Y"));
103        return;
104         end
105
106     // new case : plot(MAT4x4,[1 2 3 4]) HERE Y is a vector and X a matrix
107         // Here Y is always a column vector
108     // extend y to be a 4x4 matrix defined as [1 1 1 1;2 2 2 2;3 3 3 3;4 4 4 4]
109     if or(size(Y) == 1) then
110       if size(X,1) == size(Y,1) then
111             y=Y;
112       elseif size(X,1) == size(Y,2) then
113         y=Y(:);
114       elseif size(X,2) == size(Y,1) then
115             X=X';
116             y=Y(:);
117       elseif size(X,2) == size(Y,2) then
118             y=Y;
119       else
120             ResetFigureDDM(current_figure, cur_draw_mode)
121         error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Incompatible dimensions.\n"),typeOfPlot,"X","Y"));
122         return;
123           end
124
125           // concatenante y in columns
126           Y=y(:,ones(1,size(X,2)));
127
128       ok=%T;
129       return;
130     end
131
132     if ~ok
133       ResetFigureDDM(current_figure, cur_draw_mode)
134       error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Incompatible dimensions.\n"),typeOfPlot,"X","Y"));
135       return;
136     end
137
138
139   end
140
141   // end of checkXYPair
142 endfunction
143