Newsgroup: it.comp.lang.javascript
Titolo: Il ritorno di N'Drillo - Semplificare i calcoli.

Ciao a tutti. Sono tornato per qualche giorno...
Ho un problema da porvi. Si tratta di javascript per mondi vrml.
Tralasciando i dettagli, come faccio a diminuire il numero di operazioni di
queste funzioni??????
Devo limitare i tempi di attesa...
Grazie in anticipo!
Ecco le funzioni:
    eventIn SFInt32 set_power IS set_power
    eventIn SFFloat key
    eventIn SFBool enabled IS set_enabled
    eventOut SFTime clock
    eventOut MFColor colorset
    eventOut MFVec3f pointset
    eventOut SFTime setstart
    eventOut SFBool start
    eventOut SFFloat lightint IS ambientIntensity
    field SFFloat a IS a
    field MFFloat alt []
    field SFFloat b IS b
    field SFFloat c IS c
    field MFFloat colfac []
    field MFColor color []
    field SFFloat m IS m
    field SFFloat n IS n
    field SFFloat o IS o
    field MFFloat muly []
    field SFInt32 quanti 50
    field SFInt32 power IS power
    field MFFloat rvel []
    field MFVec3f temp []
    field SFFloat v IS v
    field MFVec3f vel []
    field MFFloat seno []
    field MFFloat coseno []
    url "javascript:
      function initialize()
      {
        reset();
        for (i=0; i<360; i++)
        {
          seno[i]=Math.round(1000*Math.sin(i*3.14/180))/1000;
          if (i<90) coseno[270+i]=seno[i];
          else coseno[i-90]=seno[i];
        }
        clock=5*Math.random();
        start=true;
      }
      function enabled(value)
      {
        start=value;
      }
      function set_power(value)
      {
        power=value;
        initialize();
      }
      function reset()
      {
        quanti=Math.round(power/10);
        var i;
        for (i=0;i<quanti;i++)
        {
          color[i]= new SFColor(1, .83, 0);
          temp[i]=new SFVec3f(0, 0, 0);
          alt[i]=o*Math.random();
          x=Math.random();
          y=Math.random();
          z=Math.random()/2;
          vel[i]=new SFVec3f( v*x, v*y, v*z);
          rvel[i]=Math.random();
          colfac[i]=Math.random();
          muly[i]=vel[i].y*alt[i];
        }
        colorset=color;
        pointset=temp;
      }
      function key (value)
      {
        var r; red=1; green=.83;
        var rad=1-value/2;
        var ang=360*value;
        var raggio=0;
        for (i=0;i<quanti ;i++ )
        {
          y=value*muly[i];
          if (y<=m)r=a;
          if (y>m && y<=n) r=b;
          if (y>n) r=c;
          raggio=rad*rvel[i]*r;
          x=raggio*coseno[Math.floor(ang*vel[i].x)];
          z=raggio*seno[Math.floor(ang*vel[i].z)];
          pointset[i]=new SFVec3f(x,y,z);
          if((y/alt[i])>.5)
          {
            red=Math.abs(1.5-(y/alt[i]));
            green=0;
          }
          if((y/alt[i])<=.5)
          {
            red=1;
            green=Math.abs(1-((x*x + y*y)/(r*r)));
          }
          colorset[i]= new SFColor(red, green, 0);
        }
        lightint=0.4+0.6*Math.random();
      }
    "
P.S.: Ciao Hipe, Juliet, Glassman, vedo che siete sempre attivi!!!
--
N'Drillo
VRML -Dreamers: 
http://eureka.lucia.it/vrml
3D Web Magazine: 
http://eureka.lucia.it/vrml/3dweb
3dVillage, multi-user VRML world:
http://www.radionav.it/3dVillage/3dVillage.html

 P.S.: Ciao Hipe, Juliet, Glassman, vedo che siete sempre attivi!!!
Non avendo niente di meglio da fare... Come dice Alex Drastico (Antonio
Albanese): "Che lavoro faccio io? Non faccio un cazzo e penso"

 guarda che se fai così è perfetto:
Apprezzo il suggerimento. Purtroppo il mio problema è dato soprattutto dal
seguente codice:
      function key (value)
      {
        var r; red=1; green=.83;
        var rad=1-value/2;
        var ang=360*value;
        var raggio=0;
/*quanti è normalmente un numero normalmente compreso tra 50 e 200, la
funzione viene chiamata circa ogni 3 decimi di secondo...*/
        for (i=0;i<quanti ;i++ )
        {
          y=value*muly[i];
          if (y<=m)r=a;
          if (y>m && y<=n) r=b;
          if (y>n) r=c;
          raggio=rad*rvel[i]*r;
          x=raggio*coseno[Math.floor(ang*vel[i].x)];
          z=raggio*seno[Math.floor(ang*vel[i].z)];
          pointset[i]=new SFVec3f(x,y,z);
          if((y/alt[i])>.5)
          {
            red=Math.abs(1.5-(y/alt[i]));
            green=0;
          }
          if((y/alt[i])<=.5)
          {
            red=1;
            green=Math.abs(1-((x*x + y*y)/(r*r)));
          }
          colorset[i]= new SFColor(red, green, 0);
        }
        lightint=0.4+0.6*Math.random();
      }
    "
Già ho ridotto di molto i conti riducendo "quanti" a 1/30, ma non è
sufficiente.... devo riuscire a precalcolare il più possibile tramite la
funzione reset() che ha accesso a variabili globali e che è la seguente:
      function reset()
      {
        quanti=Math.round(power/30);
        var i;
        for (i=0;i<quanti;i++)
        {
          color[i]= new SFColor(1, .83, 0);
          temp[i]=new SFVec3f(0, 0, 0);
          alt[i]=o*Math.random();
          x=Math.random();
          y=Math.random();
          z=Math.random()/2;
          vel[i]=new SFVec3f( v*x, v*y, v*z);
          rvel[i]=Math.random();
          colfac[i]=Math.random();
          muly[i]=vel[i].y*alt[i];
        }
        colorset=color;
        pointset=temp;
      }
Suggerimenti?????
--
N'Drillo