]> Creatis software - CreaPhase.git/blobdiff - octave_packages/vrml-1.0.13/vrml_points.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / vrml-1.0.13 / vrml_points.m
diff --git a/octave_packages/vrml-1.0.13/vrml_points.m b/octave_packages/vrml-1.0.13/vrml_points.m
new file mode 100644 (file)
index 0000000..196de1a
--- /dev/null
@@ -0,0 +1,219 @@
+## Copyright (C) 2002 Etienne Grossmann <etienne@egdn.net>
+##
+## This program is free software; you can redistribute it and/or modify it under
+## the terms of the GNU General Public License as published by the Free Software
+## Foundation; either version 3 of the License, or (at your option) any later
+## version.
+##
+## This program is distributed in the hope that it will be useful, but WITHOUT
+## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+## details.
+##
+## You should have received a copy of the GNU General Public License along with
+## this program; if not, see <http://www.gnu.org/licenses/>.
+
+##        s = vrml_points(x,options)
+## 
+## x : 3xP  : 3D points
+##
+## Makes a vrml2 "point [ ... ]" node from a 3xP matrix x.
+## 
+## OPTIONS (name and size/type, if applicable):
+## ---------------------------------------
+## "balls"      : Displays spheres rather than points. Overrides the
+##                "hide" options and no Coordinate node is defined;makes
+##                "name" ineffective.
+##
+## "boxes" or
+## "cubes"      : Displays cubes rather than points. Overrides the "hide"
+##                options and no Coordinate node is defined;makes "name"
+##                ineffective. 
+##
+## "rad", 1 or P: Radius of balls/size of cubes.              default = 0.1
+##
+## "nums"       : Displays numbers rather than points. Overrides the
+##                "hide" options and no Coordinate node is defined;
+##                makes "name" ineffective.
+##
+##       WARNING : This option seems to make freewrl 0.34 hang, so that it
+##                 is necessary to kill it (do vrml_browse ("-kill")). Other
+##                 browsers can can view the code produced by this option.
+##
+##  "col", 3x1  : Points will have RGB col.          default = [0.3,0.4,0.9]
+##      or 3xP  : The color of each point.
+##  "tran", 1x1 : Transparency                                   default = 0
+##  "emit", e   : Use or not emissiveColor                       default = 1
+##
+## "name", str  : The Coordinate node will be called name
+##                (default="allpoints").
+## "hide"       : The points will be defined, but not showed.
+
+function s = vrml_points(x,varargin)
+## varargin
+hide = 0;
+cubes = balls = nums = 0;
+rad = 0.1 ;
+name = "allpoints" ;
+col = [0.3 0.4 0.9];
+emit = 1;
+tran = 0;
+
+i = 1;                         # pos 2.1.39
+
+while i <= nargin-1
+
+  tmp = varargin{i++};
+  if strcmp(tmp,"hide") ,
+    hide = 1;
+  elseif strcmp(tmp,"balls") ,
+    balls = 1;
+  elseif strcmp(tmp,"cubes") || strcmp(tmp,"boxes") ,
+    cubes = 1;
+  elseif strcmp(tmp,"rad") ,
+
+    rad = varargin{i++};
+  elseif strcmp(tmp,"nums") ,
+    nums = 1;
+  elseif strcmp(tmp,"emit") ,
+
+    emit = varargin{i++};
+  elseif strcmp(tmp,"col") ,
+
+    col = varargin{i++};
+  elseif strcmp(tmp,"name") ,
+
+    name = varargin{i++};
+  elseif strcmp(tmp,"tran") ,
+    tran = varargin{i++};
+  end
+end
+
+if rows (x) != 3,
+  if columns (x) == 3,
+    x = x' ;
+  else
+    error ("vrml_points : input is neither 3xP or Px3\n");
+    ## keyboard
+  end
+end
+P = columns (x) ;
+                               # Produce a PointSet
+if !balls && !cubes && !nums,
+
+  if prod (size (col)) == 3*P  # One color per point
+    smat = "";
+    scol = sprintf ("  color Color { color [\n   %s]\n   }\n",\
+                   sprintf ("      %8.3f %8.3f %8.3f\n", col));
+  else                         # One color
+    smat = ["  appearance Appearance {\n",\
+           vrml_material(col, emit),"\n",\
+           "  }\n"];
+    scol = "";
+  end
+
+  s = sprintf(["Shape {\n",\
+              smat,\
+              "  geometry PointSet {\n",\
+              scol,\
+              "  coord DEF %s Coordinate {\n  point [\n  " ],name); # ] 
+  
+  
+  s0 = sprintf("%10.6g %10.6g %10.6g ,\n  ",x);
+  
+  s = sprintf("%s%s]\n  }\n  }\n  }\n",s,s0); # [
+  
+  if hide, s = ["Switch {\nchoice\n[\n",s,"\n]\n}"]; end
+
+                               # Use numbers
+elseif nums,
+  printf ("Foo\n");
+  s = "";
+  if prod (size (col)) == 3, col = col(:) * ones (1,P); end
+  for i = 1:P,
+    s0 = sprintf([\
+                 "Transform {\n",\
+                 "  translation %10.6g %10.6g %10.6g\n",\
+                 "  children [\n",\ # ]
+                 "    Billboard {\n",\
+                 "      children [\n",\ # ]
+                 "        Shape {\n",\
+                 "          appearance Appearance {\n",\
+                 vrml_material(col(:,i), emit, tran),"\n",\
+                 "          }\n",\
+                 "          geometry Text {\n",\
+                 "            string \"%s\"\n",\
+                 "            fontStyle FontStyle { size 0.25 }\n",\
+                 "          }\n",\
+                 "        }\n",\
+                 "      ]\n",\
+                 "    }\n",\
+                 "  ]\n",\
+                 "}\n"],\ # [
+                x(:,i),sprintf("%d",i-1));
+                ## x(:,i),col,col,sprintf("%d",i-1));
+    ## "              emissiveColor %8.3f %8.3f %8.3f\n",\
+    ## "      axisOfRotation 0.0 0.0 0.0\n",\ 
+
+    s = sprintf("%s%s",s,s0);
+  end
+else
+                               # If all radiuses are the same, do a single
+                               # geometry node for all points
+  if all (size (rad) == 1) || ! any (abs (diff (rad))>eps)
+    all_same_rad = 1;
+    if balls, shapestr = sprintf("Sphere { radius %8.3f}",rad) ; 
+    else      shapestr = sprintf("Box { size %8.3f %8.3f %8.3f}",rad,rad,rad) ;
+    end
+  else
+    all_same_rad = 0;
+  end
+
+                               # If all colors are the same, do a single
+                               # geometry node for all points
+  if prod (size (col)) == 3 || ! any (abs (diff (col'))>eps)
+    all_same_col = 1;  
+    colorstr = vrml_material (col(1:3), emit);
+  else
+    all_same_col = 0;
+  end
+
+  s = "";
+  for i = 1:P
+                               # If some radiuses differ, I must do
+                               # geometry nodes individually
+    if ! all_same_rad
+                               # Skip zero-sized objects
+      if ! rad(:,i), continue; end
+
+      if balls
+       shapestr = sprintf("Sphere { radius %8.3f}",rad(:,i));
+      else
+       shapestr = sprintf("Box { size %8.3f %8.3f %8.3f}",rad(:,[i,i,i]));
+      end
+    end
+                               # If some colors differ, I must do material
+                               # nodes individually
+    if ! all_same_col, colorstr = vrml_material (col(:,i), emit); end
+
+    s0 = sprintf([\
+                 "Transform {\n",\
+                 "  translation %10.6g %10.6g %10.6g\n",\
+                 "  children [\n",\ # ]
+                 "    Shape {\n",\
+                 "      appearance Appearance {\n",\
+                 colorstr,"\n",\
+                 "      }\n",\
+                 "      geometry ",shapestr,"\n",\
+                 "    }\n",\
+                 "  ]\n",\
+                 "}\n"],\
+                x(:,i));
+    ## "          emissiveColor %8.3f %8.3f %8.3f\n",\
+    ##          x(:,i),col,col,shape);
+    s = sprintf("%s%s",s,s0);
+  end
+end
+endfunction
+
+