* Bug 15458 fixed: hist3d() rendering was wrong 64/20164/5
Samuel GOUGEON [Sun, 17 Jun 2018 01:17:47 +0000 (03:17 +0200)]
  http://bugzilla.scilab.org/15458

  Test: hist3d() with 5.5.2
  http://bugzilla.scilab.org/15274 prevents the right rendering with 6.0

Change-Id: I3fd469f8b52c8030a90ce7acce55a63bf889ba4b

scilab/CHANGES.md
scilab/modules/graphics/macros/hist3d.sci

index ec6909e..fce8e31 100644 (file)
@@ -509,6 +509,7 @@ Known issues
 * [#15454](http://bugzilla.scilab.org/show_bug.cgi?id=15454): Hundreds of typos fixed all over the code: occured => occured, formated => formatted, an other => another, setted => set, retrived => retrieved ..
 * [#15455](http://bugzilla.scilab.org/show_bug.cgi?id=15455): OCaml build sometimes failed with Linenum being an unbound module.
 * [#15457](http://bugzilla.scilab.org/show_bug.cgi?id=15457): The icon of the "Trigo functions" and "CONVERT" Xcos blocks was not updated according to actual input parameters.
+* [#15458](http://bugzilla.scilab.org/show_bug.cgi?id=15458): `hist3d` rendering was wrong.
 * [#15464](http://bugzilla.scilab.org/show_bug.cgi?id=15464): Xcos C-blocks could not link dlls on Windows.
 * [#15468](http://bugzilla.scilab.org/show_bug.cgi?id=15468): Xcos saved file used non UTF-8 characters which lead to invalid file loading later.
 * [#15484](http://bugzilla.scilab.org/show_bug.cgi?id=15484): On Windows, `isdir("w:")`, `isdir("w:/")`, and `isdir("w:\")` returned %T whenever the W: drive does not exist.
index 0118b86..ffe7950 100644 (file)
@@ -1,6 +1,8 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) INRIA
 // Copyright (C) 2012 - Scilab Enterprises - Adeline CARNIS
+// Copyright (C) 2012, 2018 - Samuel GOUGEON
+//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
 //
 // This file is hereby licensed under the terms of the GNU GPL v2.0,
@@ -13,7 +15,7 @@
 
 function hist3d(f,theta,alpha,leg,flags,ebox)
     //!
-    nep=8
+    nep=8   // bars half widths = 1/nep
 
     if ~isdef("theta","local") then theta = 35; end;
     if ~isdef("alpha","local") then alpha = 45; end;
@@ -41,6 +43,7 @@ function hist3d(f,theta,alpha,leg,flags,ebox)
         6.6 6.7 8.6 10.3 13.6 16.2 18.1 18.0 16.0 13.0 9.4 7.0 12.0
         0.6 1.3 3.7 5.5 9.6 13.1 16.2 16.0 12.8 8.8 3.8 1.8 7.8
         ];
+        drawlater
         hist3d(T)
         ax = gca()
         ax.y_ticks = tlist(["ticks" "locations" "labels"], (0:12)+0.5, months)
@@ -49,6 +52,9 @@ function hist3d(f,theta,alpha,leg,flags,ebox)
         xtitle(_("Average monthly temperatures in french cities"),"","")
         ax.title.font_size = 3
         ax.rotation_angles = [28 19]
+        ax.children.color_mode = color("violet")
+        // ax.children.color_flag = 1
+        drawnow
         return;
     end
     if typeof(f)=="list" then
@@ -72,14 +78,14 @@ function hist3d(f,theta,alpha,leg,flags,ebox)
         dx=1/nep; dy=1/nep;
         bnds=[0 nl,0 nc,min(0,min(f)) max(0,max(f))]
     end
-    x=x.*.[1,1] + dx*ones(x).*.[0,1] - dx*ones(x).*.[1,0];
-    y=y.*.[1,1] + dy*ones(y).*.[0,1] - dy*ones(y).*.[1,0];
+    x = matrix([x-dx ; x+dx], 1, -1);
+    y = matrix([y-dy ; y+dy], 1, -1);
     a=[0;0;1;1]
     b=[0;1;1;0]
     c=[0;0;0;0]
     d=[1;1;1;1]
-    ix=[b,b,a,a,c,d];
-    iy=[a,a,c,d,b,b];
+    ix=[b,(1-b),a,(1-a),c,d];
+    iy=[a,a,c,d,b,(1-b)];
     indx=ones(1,nc) .*. (ones(1,nl).*.ix +(1:2:2*nl-1).*.ones(ix));
     iy=matrix(iy,24,1);
     //indy=(ones(1,nl).*.iy+(1:2:2*nl-1).*.ones(iy)) .*. ones(1,nc);
@@ -89,7 +95,12 @@ function hist3d(f,theta,alpha,leg,flags,ebox)
 
     xx=matrix(x(matrix(indx,1,nnl*nnc)),nnl,nnc);
     yy=matrix(y(matrix(indy,1,nnl*nnc)),nnl,nnc);
-    zz=matrix(f,1,nl*nc).*.[c,d,b,b,a,a];
+    f = matrix(f,1,-1);
+    zz = f.*.[c,d,b,b,a,a];
+    // bars with f < 0 => faces orientation must be inverted:
+    f = f .*.ones(4,6);
+    b = f<0
+    zz(b) = f(b) - zz(b)
 
     if ~isdef("ebox","local") then ebox = bnds; else "ebox = ebox"; end;
     plot3d(xx,yy,zz,def(1),def(2),def(3),def(4),ebox)