Fix test win64b: test_run('graphics', 'contour2d')
[scilab.git] / scilab / modules / graphics / macros / graypolarplot.sci
index 1aa0d94..f9cb21f 100644 (file)
@@ -11,12 +11,11 @@ function graypolarplot(theta,rho,z,varargin)
 [lhs,rhs]=argn(0)
 if rhs<=0 then
   rho=1:0.2:4;theta=(0:0.02:1)*2*%pi;
-  z=30+round(theta'*(1+rho^2));
-  xbasc();
+  z=30+round(theta'*(1+rho.^2));
+  clf();
   f=gcf();
   f.color_map=hotcolormap(128);
   f.background= 128;
-  f.foreground=1;
   a=gca();
   a.background= 128;
   a.foreground=1;
@@ -24,6 +23,10 @@ if rhs<=0 then
   return
 end
 
+if rhs<3 then
+  error(msprintf(gettext("%s: Wrong number of input argument(s): At least %d expected.\n"), "graypolarplot", 3));
+end
+
 
 R=max(rho)
 nv=size(varargin)
@@ -35,15 +38,14 @@ fig = gcf();
 immediate_drawing = fig.immediate_drawing;
 fig.immediate_drawing = "off";
 
-//plot2d(0,0,1,strf,' ',rect)
 axes = gca();
 axes.data_bounds = [rect(1), rect(2); rect(3), rect(4)];
 axes.clip_state = "clipgrf";
-//[rho,k]=sort(rho);z=z(:,k);
 
-//nt=size(theta,'*');theta=matrix(theta,1,-1)*180/%pi
 drawGrayplot(theta,rho,z);
 
+objectList = gce(); // get all the created objects to glue them at the end.
+
 axes.isoview = "on";
 axes.box = "off";
 axes.axes_visible = ["off","off","off"];
@@ -51,31 +53,36 @@ axes.x_label.text = "";
 axes.y_label.text = "";
 axes.z_label.text = "";
 
-// bug here, we need to draw the axes in order to get correct bounding box.
-draw(axes);
-
-
 step=R/5
 r=step;dr=0.02*r;
 for k=1:4
   xarc(-r,r,2*r,2*r,0,360*64)
+  objectList($ + 1) = gce();
   arc = gce();
   arc.line_style = 3;
   xstring((r+dr)*cos(5*%pi/12),(r+dr)*sin(5*%pi/12),string(round(10*r)/10))
+  objectList($ + 1) = gce();
   r=r+step
 end
 xarc(-r,r,2*r,2*r,0,360*64)
+objectList($ + 1) = gce();
 xstring((r+dr)*cos(5*%pi/12),(r+dr)*sin(5*%pi/12),string(round(10*r)/10))
+objectList($ + 1) = gce();
 
 rect=xstringl(0,0,'360');w=rect(3);h=rect(4);d=sqrt(w^2+h^2)/1.8
 r=R+d
 for k=0:11
   xsegs([0;R*cos(k*(%pi/6))],[0;R*sin(k*(%pi/6))])
+  objectList($ + 1) = gce();
   arc = gce();
   arc.line_style = 3;
   xstring(r*cos(k*(%pi/6))-w/2,r*sin(k*(%pi/6))-h/2,string(k*30))
+  objectList($ + 1) = gce();
 end
 
+// glue all the created objects
+glue(objectList);
+
 // drawnow
 fig.immediate_drawing = immediate_drawing;
 
@@ -86,48 +93,14 @@ function [x,y] = polar2Cart(rho, theta)
   y = rho * sin(theta);
 endfunction
 
-
-function [x,y] = decomposeCurvedFacet(rho0, rho1, theta0, theta1)
-  // approximate a curved facet into a set of rectangular ones
-  // rho0, rho1, theta0, theta1 defined the boundaries of the facet
-  // x and y are 4xnbDecompostion matrices. Each row of these matrices
-  // contains the X or Y coordinates of the 4 vertices of an approximating
-  // quad.
-  // The decomposition is performed along the theta angle
-  nbDecomposition = 32; // number of approximation facets
-
-  [x0, y0] = polar2Cart(rho0, theta0);
-  x(1,1) = x0;
-  y(1,1) = y0;
-  [x1, y1] = polar2Cart(rho1, theta0);
-  x(2,1) = x1;
-  y(2,1) = y1;
-  for i=1:(nbDecomposition - 1)
-    t = i / nbDecomposition
-    // get an interpolated theta between theta0 and theta1
-    thetaInterp = t * theta1 + (1 - t) * theta0;
-    [x0, y0] = polar2Cart(rho1, thetaInterp);
-    x(3,i) = x0;
-    y(3,i) = y0;
-    [x1, y1] = polar2Cart(rho0, thetaInterp);
-    x(4,i) = x1;
-    y(4,i) = y1;
-
-    // the nexr quad first two points are the previous one last two
-    x(1,i+1) = x(4,i);
-    y(1,i+1) = y(4,i);
-    x(2,i+1) = x(3,i);
-    y(2,i+1) = y(3,i);
-  end
-
-  [x0, y0] = polar2Cart(rho1, theta1);
-  x(3,nbDecomposition) = x0;
-  y(3,nbDecomposition) = y0;
-  [x1, y1] = polar2Cart(rho0, theta1);
-  x(4,nbDecomposition) = x1;
-  y(4,nbDecomposition) = y1;
-
+function [nbDecomp] = computeNeededDecompos(theta)
+  // Compute the needed decomposition for each patch
+  
+  // minimal decompostion for each ring
+  nbFactesPerRingMin = 512;
+  
+  nbDecomp = ceil(nbFactesPerRingMin / size(theta, '*'));
+  
 endfunction
 
 
@@ -138,37 +111,86 @@ function drawGrayplot(theta, rh, z)
 // In previous versions, it used arcs to perform this.
 // However, since arcs are drawn from the origin to the outside
 // there were overlapping and cause Z fighting in 3D.
-// Consequnelty we now decompose each curved facet into a set of rectangular
+// Consequenlty we now decompose each curved facet into a set of rectangular
 // facets.
 
 nbRho = size(rho,'*');
 nbTheta = size(theta,'*');
 
-xCoords = [];
-yCoords = [];
-colors = [];
+nbDecomposition = computeNeededDecompos(theta); // number of approximation facets
+
+nbRefinedTheta = (nbTheta - 1) * nbDecomposition + 1;
+
+// first step decompose theta in smaller intervals
+// Actually compute cosTheta and sinTheta for speed
+cosTheta = zeros(1, nbRefinedTheta);
+sinTheta = zeros(1, nbRefinedTheta);
+
+// first values
+cosTheta(1) = cos(theta(1));
+sinTheta(1) = sin(theta(1));
+
+index = 2;
+for i=1:(nbTheta - 1)
+  for j=1:nbDecomposition
+    t = j / nbDecomposition;
+    interpolatedTheta = t * theta(i + 1) + (1 - t) * theta(i);
+    cosTheta(index) = cos(interpolatedTheta);
+    sinTheta(index) = sin(interpolatedTheta);
+    index = index + 1;
+  end
+end
+
+
+nbQuadFacets = (nbRho - 1) * (nbRefinedTheta - 1);
+
+// allocate matrices
+xCoords = zeros(4, nbQuadFacets);
+yCoords = zeros(4, nbQuadFacets);
+colors = zeros(4, nbQuadFacets);
+
+index = 1;
 
 // compute the 4xnbFacets matrices for plot 3d
 for i=1:(nbRho - 1)
-  for j =1:(nbTheta - 1);
-    // compute the decomposition of a curved facet
-    [xFacet, yFacet] = decomposeCurvedFacet(rho(i), rho(i + 1), theta(j), theta(j + 1));
-    xCoords = [xCoords, xFacet];
-    yCoords = [yCoords, yFacet];
-    colors = [colors, z(j,i) * ones(1,size(xFacet,2))];
+  for j=1:(nbRefinedTheta - 1);
+    // get the 4 corners of a facet
+    xCoords(:,index) = [rho(i) * cosTheta(j)
+                        rho(i) * cosTheta(j + 1)
+                        rho(i + 1) * cosTheta(j + 1)
+                        rho(i + 1) * cosTheta(j)];
+
+    yCoords(:,index) = [rho(i) * sinTheta(j)
+                        rho(i) * sinTheta(j + 1)
+                        rho(i + 1) * sinTheta(j + 1)
+                        rho(i + 1) * sinTheta(j)];
+
+    // color is the same for each nbDecomposition facets
+       // retrieve the not refined index
+       thetaIndex = (j - 1) / nbDecomposition + 1;
+       // keep the 4 outside colors of the patch
+       // to be able to switch between average or matlab color.
+    colors(:,index) = [z(thetaIndex, i)
+                          z(thetaIndex + 1, i)
+                                          z(thetaIndex + 1, i + 1)
+                                          z(thetaIndex, i + 1)];
+
+    index = index + 1;
   end
 end
 
-// flat plot
-zCoords = zeros(size(xCoords,1),size(xCoords,2));
-
 
+// flat plot
+zCoords = zeros(4, nbQuadFacets);
 
+// disable line draing and hidden color
 plot3d(xCoords,yCoords,list(zCoords,colors));
 gPlot = gce();
-gPlot.color_mode = -1;
-gPlot.hiddencolor = 0;
+gPlot.color_mode = -1; // no wireframe
+gPlot.hiddencolor = 0; // no hidden color
+gPlot.color_flag = 2; // average color on each facets
 
+// restore 2d view
 axes = gca();
 axes.view = "2d";