f9cb21f994e828ca68691ae2bb60136e49ff57fa
[scilab.git] / scilab / modules / graphics / macros / graypolarplot.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 graypolarplot(theta,rho,z,varargin)
11 [lhs,rhs]=argn(0)
12 if rhs<=0 then
13   rho=1:0.2:4;theta=(0:0.02:1)*2*%pi;
14   z=30+round(theta'*(1+rho.^2));
15   clf();
16   f=gcf();
17   f.color_map=hotcolormap(128);
18   f.background= 128;
19   a=gca();
20   a.background= 128;
21   a.foreground=1;
22   graypolarplot(theta,rho,z)
23   return
24 end
25
26 if rhs<3 then
27   error(msprintf(gettext("%s: Wrong number of input argument(s): At least %d expected.\n"), "graypolarplot", 3));
28 end
29
30
31 R=max(rho)
32 nv=size(varargin)
33 if nv>=1 then strf=varargin(2),else  strf='030',end
34 if nv>=2 then rect=varargin(4),else  rect=[-R -R R R]*1.1,end
35
36 // drawlater
37 fig = gcf();
38 immediate_drawing = fig.immediate_drawing;
39 fig.immediate_drawing = "off";
40
41 axes = gca();
42 axes.data_bounds = [rect(1), rect(2); rect(3), rect(4)];
43 axes.clip_state = "clipgrf";
44
45 drawGrayplot(theta,rho,z);
46
47 objectList = gce(); // get all the created objects to glue them at the end.
48
49 axes.isoview = "on";
50 axes.box = "off";
51 axes.axes_visible = ["off","off","off"];
52 axes.x_label.text = "";
53 axes.y_label.text = "";
54 axes.z_label.text = "";
55
56 step=R/5
57 r=step;dr=0.02*r;
58 for k=1:4
59   xarc(-r,r,2*r,2*r,0,360*64)
60   objectList($ + 1) = gce();
61   arc = gce();
62   arc.line_style = 3;
63   xstring((r+dr)*cos(5*%pi/12),(r+dr)*sin(5*%pi/12),string(round(10*r)/10))
64   objectList($ + 1) = gce();
65   r=r+step
66 end
67 xarc(-r,r,2*r,2*r,0,360*64)
68 objectList($ + 1) = gce();
69 xstring((r+dr)*cos(5*%pi/12),(r+dr)*sin(5*%pi/12),string(round(10*r)/10))
70 objectList($ + 1) = gce();
71
72 rect=xstringl(0,0,'360');w=rect(3);h=rect(4);d=sqrt(w^2+h^2)/1.8
73 r=R+d
74 for k=0:11
75   xsegs([0;R*cos(k*(%pi/6))],[0;R*sin(k*(%pi/6))])
76   objectList($ + 1) = gce();
77   arc = gce();
78   arc.line_style = 3;
79   xstring(r*cos(k*(%pi/6))-w/2,r*sin(k*(%pi/6))-h/2,string(k*30))
80   objectList($ + 1) = gce();
81 end
82
83 // glue all the created objects
84 glue(objectList);
85
86 // drawnow
87 fig.immediate_drawing = immediate_drawing;
88
89 endfunction
90
91 function [x,y] = polar2Cart(rho, theta)
92   x = rho * cos(theta);
93   y = rho * sin(theta);
94 endfunction
95
96 function [nbDecomp] = computeNeededDecompos(theta)
97   // Compute the needed decomposition for each patch
98   
99   // minimal decompostion for each ring
100   nbFactesPerRingMin = 512;
101   
102   nbDecomp = ceil(nbFactesPerRingMin / size(theta, '*'));
103   
104 endfunction
105
106
107 function drawGrayplot(theta, rh, z)
108 // draw only the colored part of the grayplot
109
110 // the aim of the function is to draw a set of curved facets
111 // In previous versions, it used arcs to perform this.
112 // However, since arcs are drawn from the origin to the outside
113 // there were overlapping and cause Z fighting in 3D.
114 // Consequenlty we now decompose each curved facet into a set of rectangular
115 // facets.
116
117 nbRho = size(rho,'*');
118 nbTheta = size(theta,'*');
119
120 nbDecomposition = computeNeededDecompos(theta); // number of approximation facets
121
122 nbRefinedTheta = (nbTheta - 1) * nbDecomposition + 1;
123
124 // first step decompose theta in smaller intervals
125 // Actually compute cosTheta and sinTheta for speed
126 cosTheta = zeros(1, nbRefinedTheta);
127 sinTheta = zeros(1, nbRefinedTheta);
128
129 // first values
130 cosTheta(1) = cos(theta(1));
131 sinTheta(1) = sin(theta(1));
132
133 index = 2;
134 for i=1:(nbTheta - 1)
135   for j=1:nbDecomposition
136     t = j / nbDecomposition;
137     interpolatedTheta = t * theta(i + 1) + (1 - t) * theta(i);
138     cosTheta(index) = cos(interpolatedTheta);
139     sinTheta(index) = sin(interpolatedTheta);
140     index = index + 1;
141   end
142 end
143
144
145 nbQuadFacets = (nbRho - 1) * (nbRefinedTheta - 1);
146
147 // allocate matrices
148 xCoords = zeros(4, nbQuadFacets);
149 yCoords = zeros(4, nbQuadFacets);
150 colors = zeros(4, nbQuadFacets);
151
152 index = 1;
153
154 // compute the 4xnbFacets matrices for plot 3d
155 for i=1:(nbRho - 1)
156   for j=1:(nbRefinedTheta - 1);
157     // get the 4 corners of a facet
158     xCoords(:,index) = [rho(i) * cosTheta(j)
159                         rho(i) * cosTheta(j + 1)
160                         rho(i + 1) * cosTheta(j + 1)
161                         rho(i + 1) * cosTheta(j)];
162
163     yCoords(:,index) = [rho(i) * sinTheta(j)
164                         rho(i) * sinTheta(j + 1)
165                         rho(i + 1) * sinTheta(j + 1)
166                         rho(i + 1) * sinTheta(j)];
167
168     // color is the same for each nbDecomposition facets
169         // retrieve the not refined index
170         thetaIndex = (j - 1) / nbDecomposition + 1;
171         // keep the 4 outside colors of the patch
172         // to be able to switch between average or matlab color.
173     colors(:,index) = [z(thetaIndex, i)
174                            z(thetaIndex + 1, i)
175                                            z(thetaIndex + 1, i + 1)
176                                            z(thetaIndex, i + 1)];
177
178     index = index + 1;
179   end
180 end
181
182
183 // flat plot
184 zCoords = zeros(4, nbQuadFacets);
185
186 // disable line draing and hidden color
187 plot3d(xCoords,yCoords,list(zCoords,colors));
188 gPlot = gce();
189 gPlot.color_mode = -1; // no wireframe
190 gPlot.hiddencolor = 0; // no hidden color
191 gPlot.color_flag = 2; // average color on each facets
192
193 // restore 2d view
194 axes = gca();
195 axes.view = "2d";
196
197
198 endfunction