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