Joachim: oder Mathematik ?

hallo,
im Anhang steht ein Script, das einen Layer im Kreis bewegt. Wie es so meine Art ist, eher unelegant geschrieben.
Wer hat von seiner Schulmathematik noch nicht so viel vergessen wie ich und verraet mir, wie die formel f(x)=? fuer eine Sinuskurve nochmal ging?
Damit liesse sich das Ganze sicher etwas simpler machen. Oder gibt es was noch besseres...?
Gruss Joachim

var x=0;
var y=0;
var i=1;
function Move()
{
if(i==1){x=0;y=4;}
if(i==2){x=1;y=3;}
if(i==3){x=2;y=2;}
if(i==4){x=3;y=1;}
if(i==5){x=4;y=0;}
if(i==6){x=3;y=-1;}
if(i==7){x=2;y=-2;}
if(i==7){x=1;y=-3;}
if(i==9){x=0;y=-4;}
if(i==10){x=-1;y=-3;}
if(i==11){x=-2;y=-2;}
if(i==12){x=-3;y=-1;}
if(i==13){x=-4;y=0;}
if(i==14){x=-3;y=1;}
if(i==15){x=-2;y=2;}
if(i==16){x=-1;y=3;}
if(i==17) i=1;
document.bild1.moveBy(x,y);
     window.setTimeout('Move(i++)',50);
   }

  1. hallo,

    Wer hat von seiner Schulmathematik noch nicht so viel vergessen wie ich und verraet mir, wie die formel f(x)=? fuer eine Sinuskurve nochmal ging?

    f(x) = sin(x)  ;-))

    Im Ernst, die Funktion gibt's in JS auch, ist eine Methode des Math-Objects (also f(x) = Math.sin(x)). Musst aber drauf achten, dass die Argumente in Radiant, nicht in Grad angegeben werden.

    Ich nehme an, Du hast mit i Deinen Kreis in 16 Teile geteilt. Naja, um das beizubehalten schlage ich vor, Du faengst bei 0 an zu zaehlen und rechnest i immer in Radiant um. Dabei entspricht
    i=0  --> x=0
    i=15  -->  x=2*Math.PI
    (wobei ich mit x die Zahl meine, die Du dann an sin() uebergibst).

    Da sin() logischerweise ein Zahl zwischen -1 und 1 zurueckgibt, musst Du dann noch mit 4 multiplizieren.

    y bekommst Du dann mit Math.cos().

    Viel Spass, Calocybe

    1. hi Calocybe,
      danke Dir fuer die Mathestunde. Das werde ich heute nacht bei einem Glas Rioja umsetzen, mal sehen, was dabei rauskommt...;-)

      Viele Gruesse   Joachim

    2. hi,
      krieg ich noch mehr Nachhilfe? Der Wein ist alle, und ich habe sooo viel vergessen...
      Mit dem Math objekt ist soweit alles klar. aber das mit Radiant kapiere ich nicht, hab sogar meine alte Formelsammlung rausgekramt: "Siebers Mathematische Tafeln", was habe ich die gehasst<g>

      Ich nehme an, Du hast mit i Deinen Kreis in 16 Teile geteilt. Naja, um das beizubehalten schlage ich vor, Du faengst bei 0 an zu zaehlen und rechnest i immer in Radiant um. Dabei entspricht
      i=0  --> x=0
      i=15  -->  x=2*Math.PI
      (wobei ich mit x die Zahl meine, die Du dann an sin() uebergibst).

      meinst Du so umrechnen: x=(2*Math.PI/15)*i? Aber wenn ich es dann so schreibe (y ist nur das umgerechnete i), ergeben sich zwar auf und absteigende Werte...

      for(i=1; i<100; i++)
      {
      y=(2*Math.PI/15)*i;
      x=Math.sin(y);
      x=Math.round(x*4)
      document.write(x+" next  ");
      }

      ... aber so in etwa: 2 next 3 next 4 next 4 next 3 next 2 next 1 next -1 next -2 next -3 next -4 next -4 next -3 next -2 next 0 next 2 next 3 next 4 next 4 next 3 next...also noch nicht ganz das wahre

      Wo haengt mein schwerer Geist (aber der Rioja war gut:-)

      Gruss Joachim

      1. Hello again!

        krieg ich noch mehr Nachhilfe? Der Wein ist alle, und ich habe sooo viel vergessen...

        Klar doch! Moment, hol mir nur schnell n Bier. (Ein Auto faehrt ja auch nicht ohne Benzin.) ...

        ...so, jetzt kann's losgehen.

        Mit dem Math objekt ist soweit alles klar. aber das mit Radiant kapiere ich nicht, hab sogar meine alte Formelsammlung rausgekramt: "Siebers Mathematische Tafeln", was habe ich die gehasst<g>

        Naja, das Gradmass kennst Du ja. (Oder?!) Der Kreis wird in 360 Grad eingeteilt. Mit 0 wird rechts mitte angefangen und dann oben-links-rum bis 359.9999; 360 ist dann wieder derselbe Punkt wie 0. Immer dran denken, dass der Kreis einfach in 360 Teile geteilt wird.

        Bei Radiant isses genauso, nur die Einteilung ist ein bisschen anders. Begonnen wird wieder mit 0, mitte oben ist ca. 1.5708 = pi/2 (90 Grad), links mitte ist ca. 3.1416 = pi (180 Grad), und dann kommst Du irgendwann bei 2*pi = ca. 6.2832 heraus. Mit diesen Zahlen rechnen dann also die ganzen Funktionen. (Der Kreis wird in 6.2832 Teile geschnitten ;-)

        grad * 2*pi
        Umrechnung grad --> rad:  rad =  -----------
                                             360

        Jedes dieser 360 Teile ist daher 0.00175 rad gross.

        i=0  --> x=0
        i=15  -->  x=2*Math.PI
        meinst Du so umrechnen: x=(2*Math.PI/15)*i?

        Nee, durch 16. Sorry, war mein Fehler, denn i=15 darf noch nicht 2*pi ergeben, sondern erst i=16, was mit i=0 wieder gleich kommt.

        Jetzt das schoene: Statt in 360 Teile zerstueckeln wir den Kreis (eigentlich ist es eine Torte, aber weil man sie immer nur von oben sieht und man das von dort nicht erkennt, wissen das die wenigsten Leute *g*) in 16 Teile. Wer schreibt uns denn vor, dass wir 360 verwenden muessen? Das ist doch auch nur eine Zahl wie jede andere. Uebrigens wurden irgendwann die Neugrad erfunden, die bis 400 zaehlten. Das machte man, weil die Soldaten in der Artillerie das mit der 360 irgendwie nicht so richtig gerafft haben...  (In der obigen Formel brauchst Du dann auch nur die 360 durch die 16 ersetzen, und das kommt dann genau auf Deine Gleichung raus (bis auf die 15 natuerlich).)

        Aber wenn ich es dann so schreibe (y ist nur das umgerechnete i), ergeben sich zwar auf und absteigende Werte...
        ... aber so in etwa: 2 next 3 next 4 next 4 next 3 next 2 next 1 next -1 next -2 next -3 next -4 next -4 next -3 next -2 next 0 next 2 next 3 next 4 next 4 next 3 next...also noch nicht ganz das wahre

        Du meinst, dass die erst steiler steigen, dann schwaecher, sogar zweimal die 4 aufeinander folgt usw.? Ja, das ist richtig so. Hast Du schonmal eine Sinuskurve gesehen? Die steigt auch erst steiler und dann schwaecher und dann faellt sie wieder, erst schwach, dann steiler... (Wenn Du die erste Ableitung des Sinus bildest, siehst Du das noch viel schoener... oops, das war jetzt der naechste Level, aber wir muessen ja erstmal hier den Exit finden *g*)

        Somit kriegst Du die korrektere/bessere/schoenere (such Dir ein Wort aus) Kreisbewegung hin. Wirklich auffallen wird das aber vermutlich sowieso nicht, schon deshalb, weil die Sinusse ja auch noch gerundet werden. Kannst aber mal in einem Koordinatensystem die Punkte einzeichenen und dann mit einem Zirkel nen Kreis malen, da wirst'es sehen.

        Wenn Du jetzt aber unbedingt die deutlichen Unterschiede zwischen den Zahlen sehen willst, schlage ich folgende "Abkuerzungen" Deiner if-Anhaeufung vor (eigentlich hab ich was "cooleres" gesucht, ist mir aber nichts eingefallen):

        function calc_x(i) {            /* funzt bis i==20, ist aber eigentlich nur fuer bis 15 vorgesehen */
            if (i <  4) return i;
            if (i < 12) return 8-i;
            return i-16;
        }

        function calc_y(i) {            /* funzt bis i==16 */
            if (i <  8) return 4-i;
            return i-12;
        }

        Wo haengt mein schwerer Geist (aber der Rioja war gut:-)

        Solang er noch haengt und nicht irgendwo liegt isses doch gut ;-)

        »»  if(i==1){x=0;y=4;}
        »»  if(i==2){x=1;y=3;}
        »»  if(i==3){x=2;y=2;}
        »»  ...

        Ach ja, und da ist da noch die switch-Anweisung (<../../tebg.htm#a3>), das macht die Sache (imho) uebersichtlicher:

        switch(i) {
            case 1: x=0; y=4; break;
            case 2: x=1; y=3; break;
            case 3: x=2; y=2; break;
            ...
        }

        So, jetzt muss ich mir wohl wieder ein neues Bier holen (ist wohl ein Loch drin) ...

        Calocybe

        1. hi Calocybe,
          so klare Gedanken um 05.15 Uhr, damit alleine hast Du Dir schon eine Mass im Hirschgarten verdient :-)

          »»Hast Du schonmal eine Sinuskurve gesehen? Die steigt auch erst steiler und dann schwaecher und dann faellt sie wieder, erst schwach, dann steiler

          Dass kenne ich, ist wie mit meiner Stimmung<g>

          Solang er noch haengt und nicht irgendwo liegt isses doch gut ;-)

          Kommt immer drauf an, wie er gebettet wird...

          case 1: x=0; y=4; break;
              case 2: x=1; y=3; break;
              case 3: x=2; y=2; break;
              ...

          ...das reicht ja mal wieder als Probiermaterial fuer einen Abend, yeah :-)

          So, jetzt muss ich mir wohl wieder ein neues Bier holen (ist wohl ein Loch drin) ...

          Ist bei besagten Masskruegen im Hirschgarten noch schlimmer, da die Loecher noch groesser sind, deswegen werden die mit einem Liter gefuellt.
          Da hilft nur: immer wieder Luft rauslassen...

          Also ich schreie, wenn ich nur noch Kreise sehe.
          Viele Gruesse Joachim

  2. Hi,

    var x=0;
          y=0;
          w=0;
          step=5000;
          r=80;

    function Kreis() {
        w = w + 360/step;
        if(w > 360) w=0;
        x = Math.sin(w)*r + 220;
        y = Math.cos(w)*r + 220;
        deinlayer.moveTo(x,y);
        setTimeout('Kreis()',10);
      }

    Versuch doch mal diese fertige Funktion. x und y ist klar. w ist der winkel. Mit den restlichen Zahlen zum Radius und der Schrittweite einfach mal ein wenig rumspielen.

    Viele Gruesse, Thomas Hieck

    1. hallo Thomas,
      auch Dir vielen Dank fuer die Hilfe :-)

      Versuch doch mal diese fertige Funktion. x und y ist klar. w ist der winkel. Mit den restlichen Zahlen zum Radius und der Schrittweite einfach mal ein wenig rumspielen.

      Ich glaube, das wird ein sehr verspielter Abend<g>

      Gruss Joachim

    2. var x=0;
            y=0;
            w=0;
            step=5000;
            r=80;

      function Kreis() {
          w = w + 360/step;
          if(w > 360) w=0;
          x = Math.sin(w)*r + 220;
          y = Math.cos(w)*r + 220;
          deinlayer.moveTo(x,y);
          setTimeout('Kreis()',10);
        }

      Hi,
      da fehlt aber wieder das Umrechnen von Grad auf Rad! Ich würde noch eine Variable b einführen und dann mit    b=w*Math.pi/180 umrechnen; dann b statt w als Argument von sin und cos verwenden. Also so:

      var x=0;
            y=0;
            w=0;
             b=0;       
             step=5000;
            r=80;

      function Kreis() {
          w = w + 360/step;
          if(w > 360) w=0;
          b=w*Math.pi/180;
           x = Math.sin(b)*r + 220;
          y = Math.cos(b)*r + 220;
          deinlayer.moveTo(x,y);
          setTimeout('Kreis()',10);
        }

      Ciao
      Helmut

    3. Hi,

      Versuch doch mal diese fertige Funktion.

      Hey! Du verdirbst ihm doch den ganzen Spass! Er soll doch auch selber noch was machen. Einfach etwas vorgegebenes zu uebernehmen, das ist doch langweilig. Du kennst doch den Spruch "Der Weg ist das Ziel"? (Ausser natuerlich, wenn es bei Joachim gerade was dringendes ist.) Das ist doch das tolle an Computern, dass man so richtig seinen Grips anstrengen kann, wie man es sonst nur in den Wissenschaften kann, um Probleme zu loesen, die Not-Insidern (Euphemismus fuer Outsider *g*) manchmal voellig abstrakt und bedeutungslos vorkommen; eben, um die virtuelle Welt zu erleben, die nicht jedem vergoennt ist.

      Calocybe