- Speed up graypolarplot plot by using a single surface instead a set of axes.
[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 //plot2d(0,0,1,strf,' ',rect)
39 axes = gca();
40 axes.data_bounds = [rect(1), rect(2); rect(3), rect(4)];
41 axes.clip_state = "clipgrf";
42 //[rho,k]=sort(rho);z=z(:,k);
43
44 //nt=size(theta,'*');theta=matrix(theta,1,-1)*180/%pi
45 drawGrayplot(theta,rho,z);
46
47 axes.isoview = "on";
48 axes.box = "off";
49 axes.axes_visible = ["off","off","off"];
50 axes.x_label.text = "";
51 axes.y_label.text = "";
52 axes.z_label.text = "";
53
54 // bug here, we need to draw the axes in order to get correct bounding box.
55 draw(axes);
56
57
58 step=R/5
59 r=step;dr=0.02*r;
60 for k=1:4
61   xarc(-r,r,2*r,2*r,0,360*64)
62   arc = gce();
63   arc.line_style = 3;
64   xstring((r+dr)*cos(5*%pi/12),(r+dr)*sin(5*%pi/12),string(round(10*r)/10))
65   r=r+step
66 end
67 xarc(-r,r,2*r,2*r,0,360*64)
68 xstring((r+dr)*cos(5*%pi/12),(r+dr)*sin(5*%pi/12),string(round(10*r)/10))
69
70 rect=xstringl(0,0,'360');w=rect(3);h=rect(4);d=sqrt(w^2+h^2)/1.8
71 r=R+d
72 for k=0:11
73   xsegs([0;R*cos(k*(%pi/6))],[0;R*sin(k*(%pi/6))])
74   arc = gce();
75   arc.line_style = 3;
76   xstring(r*cos(k*(%pi/6))-w/2,r*sin(k*(%pi/6))-h/2,string(k*30))
77 end
78
79 // drawnow
80 fig.immediate_drawing = immediate_drawing;
81
82 endfunction
83
84 function [x,y] = polar2Cart(rho, theta)
85   x = rho * cos(theta);
86   y = rho * sin(theta);
87 endfunction
88
89
90 function [x,y] = decomposeCurvedFacet(rho0, rho1, theta0, theta1)
91   // approximate a curved facet into a set of rectangular ones
92   // rho0, rho1, theta0, theta1 defined the boundaries of the facet
93   // x and y are 4xnbDecompostion matrices. Each row of these matrices
94   // contains the X or Y coordinates of the 4 vertices of an approximating
95   // quad.
96   // The decomposition is performed along the theta angle
97  
98   nbDecomposition = 32; // number of approximation facets
99
100   [x0, y0] = polar2Cart(rho0, theta0);
101   x(1,1) = x0;
102   y(1,1) = y0;
103   [x1, y1] = polar2Cart(rho1, theta0);
104   x(2,1) = x1;
105   y(2,1) = y1;
106   for i=1:(nbDecomposition - 1)
107     t = i / nbDecomposition
108     // get an interpolated theta between theta0 and theta1
109     thetaInterp = t * theta1 + (1 - t) * theta0;
110     [x0, y0] = polar2Cart(rho1, thetaInterp);
111     x(3,i) = x0;
112     y(3,i) = y0;
113     [x1, y1] = polar2Cart(rho0, thetaInterp);
114     x(4,i) = x1;
115     y(4,i) = y1;
116
117     // the nexr quad first two points are the previous one last two
118     x(1,i+1) = x(4,i);
119     y(1,i+1) = y(4,i);
120     x(2,i+1) = x(3,i);
121     y(2,i+1) = y(3,i);
122   end
123
124   [x0, y0] = polar2Cart(rho1, theta1);
125   x(3,nbDecomposition) = x0;
126   y(3,nbDecomposition) = y0;
127   [x1, y1] = polar2Cart(rho0, theta1);
128   x(4,nbDecomposition) = x1;
129   y(4,nbDecomposition) = y1;
130
131 endfunction
132
133
134 function drawGrayplot(theta, rh, z)
135 // draw only the colored part of the grayplot
136
137 // the aim of the function is to draw a set of curved facets
138 // In previous versions, it used arcs to perform this.
139 // However, since arcs are drawn from the origin to the outside
140 // there were overlapping and cause Z fighting in 3D.
141 // Consequnelty we now decompose each curved facet into a set of rectangular
142 // facets.
143
144 nbRho = size(rho,'*');
145 nbTheta = size(theta,'*');
146
147 xCoords = [];
148 yCoords = [];
149 colors = [];
150
151 // compute the 4xnbFacets matrices for plot 3d
152 for i=1:(nbRho - 1)
153   for j =1:(nbTheta - 1);
154     // compute the decomposition of a curved facet
155     [xFacet, yFacet] = decomposeCurvedFacet(rho(i), rho(i + 1), theta(j), theta(j + 1));
156     xCoords = [xCoords, xFacet];
157     yCoords = [yCoords, yFacet];
158     colors = [colors, z(j,i) * ones(1,size(xFacet,2))];
159   end
160 end
161
162 // flat plot
163 zCoords = zeros(size(xCoords,1),size(xCoords,2));
164
165
166
167 plot3d(xCoords,yCoords,list(zCoords,colors));
168 gPlot = gce();
169 gPlot.color_mode = -1;
170 gPlot.hiddencolor = 0;
171
172 axes = gca();
173 axes.view = "2d";
174
175
176 endfunction