*
;
/*irisvrml.sas  - make a vrml file from SAS x y z data */

/* Larry Hoyle, IPPBR, University of Kansas */
/* l-hoyle@ukans.edu */

/* use the Fischer Iris data from candiex.sas */
/* use the angle computation from Friendly, M. */
/* SAS System for Statistical Graphics */

proc format;
   value specname
      1='SETOSA    '
      2='VERSICOLOR'
      3='VIRGINICA ';
   value specchar
      1='S'
      2='O'
      3='V';
run;

data iris;
   title 'Fisher (1936) Iris Data';
   input sepallen sepalwid petallen petalwid species @@;
   format species specname.;
   label sepallen='Sepal Length in mm.'
         sepalwid='Sepal Width  in mm.'
         petallen='Petal Length in mm.'
         petalwid='Petal Width  in mm.';
   cards;
 50 33 14 02 1 64 28 56 22 3 65 28 46 15 2 67 31 56 24 3
 63 28 51 15 3 46 34 14 03 1 69 31 51 23 3 62 22 45 15 2
 59 32 48 18 2 46 36 10 02 1 61 30 46 14 2 60 27 51 16 2
 65 30 52 20 3 56 25 39 11 2 65 30 55 18 3 58 27 51 19 3
 68 32 59 23 3 51 33 17 05 1 57 28 45 13 2 62 34 54 23 3
 77 38 67 22 3 63 33 47 16 2 67 33 57 25 3 76 30 66 21 3
 49 25 45 17 3 55 35 13 02 1 67 30 52 23 3 70 32 47 14 2
 64 32 45 15 2 61 28 40 13 2 48 31 16 02 1 59 30 51 18 3
 55 24 38 11 2 63 25 50 19 3 64 32 53 23 3 52 34 14 02 1
 49 36 14 01 1 54 30 45 15 2 79 38 64 20 3 44 32 13 02 1
 67 33 57 21 3 50 35 16 06 1 58 26 40 12 2 44 30 13 02 1
 77 28 67 20 3 63 27 49 18 3 47 32 16 02 1 55 26 44 12 2
 50 23 33 10 2 72 32 60 18 3 48 30 14 03 1 51 38 16 02 1
 61 30 49 18 3 48 34 19 02 1 50 30 16 02 1 50 32 12 02 1
 61 26 56 14 3 64 28 56 21 3 43 30 11 01 1 58 40 12 02 1
 51 38 19 04 1 67 31 44 14 2 62 28 48 18 3 49 30 14 02 1
 51 35 14 02 1 56 30 45 15 2 58 27 41 10 2 50 34 16 04 1
 46 32 14 02 1 60 29 45 15 2 57 26 35 10 2 57 44 15 04 1
 50 36 14 02 1 77 30 61 23 3 63 34 56 24 3 58 27 51 19 3
 57 29 42 13 2 72 30 58 16 3 54 34 15 04 1 52 41 15 01 1
 71 30 59 21 3 64 31 55 18 3 60 30 48 18 3 63 29 56 18 3
 49 24 33 10 2 56 27 42 13 2 57 30 42 12 2 55 42 14 02 1
 49 31 15 02 1 77 26 69 23 3 60 22 50 15 3 54 39 17 04 1
 66 29 46 13 2 52 27 39 14 2 60 34 45 16 2 50 34 15 02 1
 44 29 14 02 1 50 20 35 10 2 55 24 37 10 2 58 27 39 12 2
 47 32 13 02 1 46 31 15 02 1 69 32 57 23 3 62 29 43 13 2
 74 28 61 19 3 59 30 42 15 2 51 34 15 02 1 50 35 13 03 1
 56 28 49 20 3 60 22 40 10 2 73 29 63 18 3 67 25 58 18 3
 49 31 15 01 1 67 31 47 15 2 63 23 44 13 2 54 37 15 02 1
 56 30 41 13 2 63 25 49 15 2 61 28 47 12 2 64 29 43 13 2
 51 25 30 11 2 57 28 41 13 2 65 30 58 22 3 69 31 54 21 3
 54 39 13 04 1 51 35 14 03 1 72 36 61 25 3 65 32 51 20 3
 61 29 47 14 2 56 29 36 13 2 69 31 49 15 2 64 27 53 19 3
 68 30 55 21 3 55 25 40 13 2 48 34 16 02 1 48 30 14 01 1
 45 23 13 03 1 57 25 50 20 3 57 38 17 03 1 51 38 15 03 1
 55 23 40 13 2 66 30 44 14 2 68 28 48 14 2 54 34 17 02 1
 51 37 15 04 1 52 35 15 02 1 58 28 51 24 3 67 30 50 17 2
 63 33 60 25 3 53 37 15 02 1
 ;

proc means data=iris min max;
  var petalwid petallen sepalwid sepallen ;
  output out=range min=pwmin plmin swmin slmin
                   max=pwmax plmax swmax slmax;

data xyz;
  set iris;
  if _n_=1 then set range;

  p1 = (petalwid-pwmin) / (pwmax - pwmin);


  x=petallen;
  y=sepallen;
  z=sepalwid;
  angle = 135 * p1 * arcos(-1)/180;
  xg  = x + 6 * cos(angle);
  yg = y + 6 * sin(angle);


data _null_;
  filename irvrml 'c:\ddrive\sugi21\vrml\iris.wrl';
  file irvrml;
  set xyz nobs=n end=last;

  if _n_=1 then do;
     put '#VRML V1.0 ascii';
     put 'Separator {';
     put '    DirectionalLight {';
     put '        direction 0 0 1 # Light from viewer into scene';
     put '    }';
     put '    PerspectiveCamera {';
     camx = (plmax - plmin) / 2;
     camy = (slmax - slmin) / 2;
     camz = ((swmax - swmin) / 2)  - (3 * (swmax - swmin))  ;
     fd = swmax - swmin;
     put '        position 'camx camy camz;
     put '        orientation 0 0.95 -0.15 3.14';
     put '        focalDistance ' fd;
     put '        heightAngle 0.755';
     put '    }';
   end; /* _n_=1 */




                              /* output the point as a cone */

     put '# cone '_n_;
     put '    Separator {';
     put '    Material {';
     put '        diffuseColor '@;
     select (species);
        when (1) put '1 0 0';
        when (2) put '0 1 0';
        when (3) put '0 0 1';
        otherwise put '0.5 0.5 0.5';
     end; /* select */
     put '    }';
     put '    Transform {';
     put '        translation ' x y z;
     put '        rotation 0 0 1 ' angle;
     put '    }';
     put '    Cone {';
     put '        bottomRadius 0.6';
     put '        height 3';
     put '    }';
     put '    } # separator for cone';
     put '# end cone '_n_;
     put '# ';




  if last then do;
     put '}';

  end; /* do; */
run;

*
;