X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?p=CreaPhase.git;a=blobdiff_plain;f=octave_packages%2Fvrml-1.0.13%2Fvrml_thick_surf.m;fp=octave_packages%2Fvrml-1.0.13%2Fvrml_thick_surf.m;h=e3e8e51bec6e6169e8ea88051d8cdd0701bd6220;hp=0000000000000000000000000000000000000000;hb=c880e8788dfc484bf23ce13fa2787f2c6bca4863;hpb=1705066eceaaea976f010f669ce8e972f3734b05 diff --git a/octave_packages/vrml-1.0.13/vrml_thick_surf.m b/octave_packages/vrml-1.0.13/vrml_thick_surf.m new file mode 100644 index 0000000..e3e8e51 --- /dev/null +++ b/octave_packages/vrml-1.0.13/vrml_thick_surf.m @@ -0,0 +1,183 @@ +## Copyright (C) 2002 Etienne Grossmann +## +## 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 . + +## s = vrml_thick_surf (x, y, z [, options] ) +## s = vrml_thick_surf (z [, options] ) +## +## Returns vrml97 code for a Shape -> IndexedFaceSet node representing a +## surface passing through the given points. +## +## The surface may look smoother than that returned by vrml_surf, but it +## has twice as many facets. +## +## x : RxC or C : X coordinates of the points on the surface +## y : RxC or R : Y " " +## z : RxC : Z " " +## +## s : string : The code +## +## If x and y are omitted, they are assumed to be 1:C and 1:R, resp +## Points presenting one or more 'inf' or 'nan' coordinates are ignored. +## +## Options : +## +## "col" , col : 3 : Color, default = [0.3,0.4,0.9] +## or 3xP : color of vertices (vrml colorPerVertex is TRUE). +## +## "tran", tran : 1x1 : Transparency, default = 0 +## +## "creaseAngle", a +## : 1 : vrml creaseAngle value. The browser may smoothe the +## crease between facets whose angle is less than a. +## default = 0 +## "smooth" : same as "creaseAngle",pi. + +function s = vrml_thick_surf (x, y, z, varargin) + + # Default values +tran = 0 ; +col = [0.3, 0.4, 0.9] ; +smooth = creaseAngle = nan ; +nargin = nargin(); + +if (nargin <= 1) || ischar(y), # Cruft to allow not passing x and y + zz = x ; + [R,C] = size (zz); + xx = ones(R,1)*[1:C] ; + yy = [1:R]'*ones(1,C) ; + if nargin >=3, + + s = vrml_surf ( xx, yy, zz, y, z, varargin{:} ); + return + elseif nargin >=2, + + s = vrml_surf ( xx, yy, zz, y, varargin{:} ); + return + end + x = xx ; y = yy ; z = zz ; +end + + # Read options +filename = "vrml_thick_surf" ; +verbose = 0 ; + +if nargin > 3, + + opt1 = " tran col creaseAngle " ; + opt0 = " smooth " ; + + nargin -= 3 ; + + read_options_old ; +end + +if ! isnan (smooth), creaseAngle = pi ; end +[R,C] = size(z); +if any (size (x) == 1), x = ones(R,1)*x(:)' ; end +if any (size (y) == 1), y = y(:)*ones(1,C) ; end + +pts = [x(:)';y(:)';z(:)']; + +keepp = all (!isnan(pts) & finite(pts)) ; + +trgs = zeros(3,4*(R-1)*(C-1)) ; + +tmp = 1:(R-1)*(C-1); + +## Points are numbered as +## +## 1 R+1 .. (C-1)*R+1 +## 2 R+2 : +## : : : +## R 2*R .. C*R +## + +## Triangles are numbered as : +## +## X = (R-1)*(C-1) +## _______________________________ +## | /| /| /| /|-R+1/| +## | 1 / |R+1/ | / | / |R*C/ | +## | / | / | / | / | / | +## | /X+1| /X+R| / | / | / | +## |/ |/ |/ |/ |/ | +## ------------------------------- +## | /| /| /| /| /| +## | 2 / |R+2/ | / | / | / | +## | / | / | / | / | / | +## | / | / | / | / | / | +## |/ |/ |/ |/ |/ | +## ------------------------------- +## : : : +## : : : +## ------------------------------- +## | /| /| /| /| /| +## | R / |2*R/ | / | / |C*R/ | +## | / | / | / | / | / | +## | /X+R| / | / | / | /C*R| +## |/ |/ |/ |/ |/ X+ | +## ------------------------------- + +## (x,y), (x,y+1), (x+1,y) i.e. n, n+1, n+R + +trgs(1,tmp) = ([1:R-1]'*ones(1,C-1) + R*ones(R-1,1)*[0:C-2])(:)'; +trgs(2,tmp) = ([ 2:R ]'*ones(1,C-1) + R*ones(R-1,1)*[0:C-2])(:)'; +trgs(3,tmp) = ([1:R-1]'*ones(1,C-1) + R*ones(R-1,1)*[1:C-1])(:)'; + +## (x+1,y), (x,y+1), (x+1,y+1) i.e. n+R, n+1, n+R+1 +tmp += (R-1)*(C-1); + +trgs(1,tmp) = ([1:R-1]'*ones(1,C-1) + R*ones(R-1,1)*[1:C-1])(:)'; +trgs(2,tmp) = ([ 2:R ]'*ones(1,C-1) + R*ones(R-1,1)*[0:C-2])(:)'; +trgs(3,tmp) = ([ 2:R ]'*ones(1,C-1) + R*ones(R-1,1)*[1:C-1])(:)'; + +## (x,y), (x+1,y+1), (x+1,y) i.e. n, n+1, n+R+1 +tmp += (R-1)*(C-1); + +trgs(1,tmp) = ([1:R-1]'*ones(1,C-1) + R*ones(R-1,1)*[0:C-2])(:)'; +trgs(2,tmp) = ([2:R ]'*ones(1,C-1) + R*ones(R-1,1)*[1:C-1])(:)'; +trgs(3,tmp) = ([1:R-1]'*ones(1,C-1) + R*ones(R-1,1)*[1:C-1])(:)'; + +## (x,y), (x,y+1), (x+1,y+1) i.e. n, n+1, n+R+1 +tmp += (R-1)*(C-1); + +trgs(1,tmp) = ([1:R-1]'*ones(1,C-1) + R*ones(R-1,1)*[0:C-2])(:)'; +trgs(2,tmp) = ([ 2:R ]'*ones(1,C-1) + R*ones(R-1,1)*[0:C-2])(:)'; +trgs(3,tmp) = ([ 2:R ]'*ones(1,C-1) + R*ones(R-1,1)*[1:C-1])(:)'; + + +if ! all(keepp), + + keept = all (reshape(keepp(trgs),3,4*(R-1)*(C-1))); + ## keept = all (keepp(trgs)) ; + keepip = find (keepp); + keepit = find (keept); + renum = cumsum (keepp); + + pts = pts (:,keepip) ; + trgs = reshape(renum (trgs (:,keepit)), 3, columns(keepit)); + +end +s = vrml_faces (pts, trgs, "col", col, "tran", tran, "creaseAngle", creaseAngle); + +## x=-1:0.1:1;y=(x=ones(columns(x),1)*x)'; +## r = sqrt (x.^2+y.^2); c = cos(2*pi*r.^2)./(2+r.^2); +## Punch some holes +## holes = ind2sub (size (c), [7,7,9,10,15,16;8,9,10,11,14,14]') +## c(holes) = nan; +## vrml_browse ("tmp.wrl",vrml_thick_surf (x, y, c)) +## or save_vrml ("tmp.wrl", vrml_thick_surf (x, y, c)) +endfunction +