Sinus zeichnen lassen



  • minastaros schrieb:

    bandchef schrieb:

    Jetzt aber: y = sin(x/(2*pi))

    Wohl auch nicht. Der Sinus verlangt als Eingabe Werte von 0 bis 2*pi.

    Nö, der Sinus ist nur 2π-periodisch, aber du darfst beliebige komplexe Zahlen reinwerfen.

    bandchef schrieb:

    y(x)=sin((2*pi)/x)

    Du willst gleiche Abstände zwischen den einzelnen Werten. Das riecht nicht nach nem Sinus, denn der Sinus ist ne Welle statt ner Geraden.



  • Heißt das ich soll den arcus sinus verwenden?



  • Um Gottes Willen, noch kursiver kann ich Gerade nicht schreiben. Vielleicht Gerade? Oder soll ich Streckung brüllen?



  • Michael E. schrieb:

    Nö, der Sinus ist nur 2π-periodisch, aber du darfst beliebige komplexe Zahlen reinwerfen.

    Im Allgemeinen, ja. Aber in diesem Fall ist die Vorgabe (s. Link von bandchef) ziemlich eindeutig: Wir bilden genau eine Periode ab, also 2pi.

    @bandchef: Nicht verzweifeln. 2pi ist ja nur eine Konstante. Was in Deiner Rechnung noch fehlt, ist die 40.

    Also, mal langsam: Dein ganzer Sinus will am Ende 2*pi haben. Deine Schleife geht wohl von 0 bis 40 (weil Du 41 Teile hast inklusive dem ersten und dem letzten). 40 ist aber zu groß, also mußt Du Dein x, was dann 40 hat, irgendwie auf 2pi kriegen...

    Übrigens noch ein Gedanke (hoffe, das verwirrt jetzt nicht zu viel...): Wenn man den Zeilenarrays am Ende noch ein extra Character spendiert und das richtige Zeichen reinsetzt, dürfte das Drucken dieser Zeile ein Kinderspiel werden. Und wenn man hinter das ganze Array auch noch ein extra Zeichen spendiert, wird die Ausgabe von allen Zeilen ein Kinderspiel...



  • Sorry, aber was hat eine "Streckung" (was auch immer das auch ist...; hab ich in Mathe noch nie gehabt!) mit dem Sinus der Darstellung zu tun? Und unter Geraden stelle ich mir das hier vor: y=m*x+t



  • @minastaros:

    @bandchef: Nicht verzweifeln. 2pi ist ja nur eine Konstante. Was in Deiner Rechnung noch fehlt, ist die 40.

    Welche Rechnung meinst du? Die y = sin(x/(2*pi)), y=sin(x) oder y(x)=sin((2*pi)/x)?



  • bandchef schrieb:

    Welche Rechnung meinst du? Die y = sin(x/(2*pi)), y=sin(x) oder y(x)=sin((2*pi)/x)?

    In allen. Du hast eine Laufvariable x, ein 2*pi und da muss jetzt noch die 40 dazu. Ist übrigens auch eine Konstante in dem Spiel. V.Falcon hat vorgeschlagen, das als xdim rauszuziehen. Richtig so (nur vorsicht mit den off-by-one-Fehlern, vor denen auch Profs offensichtlich nicht gefeit sind...)



  • minastaros schrieb:

    Michael E. schrieb:

    Nö, der Sinus ist nur 2π-periodisch, aber du darfst beliebige komplexe Zahlen reinwerfen.

    Im Allgemeinen, ja. Aber in diesem Fall ist die Vorgabe (s. Link von bandchef) ziemlich eindeutig: Wir bilden genau eine Periode ab, also 2pi.

    Ich gehe immer noch von SeppJs Aufgabe aus, [0, 40] auf [0, 2pi] linear zu projizieren. Aber meinetwegen können wir direkt den Sinus mitnehmen...



  • Kein Einwand hinsichtlich der Projektion. Die Funktion an sich ist ja austauschbar.

    "Der Sinus" meinte ich mit Betonung als Der Sinus, also genau der, der zu zeichnen wäre... 😉


  • Mod

    Mag jetzt hart klingen:

    bandchef schrieb:

    Ich komm mir langsam echt ungeeigent für das Studium vor...

    Erstes Semester?

    Brich das Studium ab, solange du noch nicht zu viel Zeit verschwendet hast.



  • Könnt ihr mir nicht noch einmal draufhelfen? Wie bilde ich denn nun den Sinus auf 0-40 ab?

    Geht's so: ((2*PI)/40)*i

    #include<iostream>
    #include<math.h>
    #define M_PI 3.141592654
    using namespace std;
    
    int main()
    {
     int i, j, k, l;
     double sinus[41], array[21][41];
     char leerarray[21][41];
    
     //Array mit Leerzeichen(' ') auffüllen
     for(i=0; i<21; i=i+1)
     {
              for(j=0; j<41; j=j+1)
              {
               leerarray[i][j] = ' ';
              }
     }
    
     for(k=0; k<41; k=k+1)
     {
    	 sinus[k] = ((2*M_PI)/40)*k;
     }
    
    system("pause");
    return 0;
    }
    

    Mit meinem obigen Code lass ich mir jetzt die 41 Werte in ein neues 1-dim Array reinschreiben. Bringt mich das jetzt weiter?

    Die y-Werte auf 0-20 skalieren geht doch dann eigentlich so, oder: y=10*sin(((2*PI)/40)*i)+10?



  • bandchef schrieb:

    Könnt ihr mir nicht noch einmal draufhelfen? Wie bilde ich denn nun den Sinus auf 0-40 ab?

    Geht's so: ((2*PI)/40)*i
    [...]
    Die y-Werte auf 0-20 skalieren geht doch dann eigentlich so, oder: y=10*sin(((2*PI)/40)*i)+10?

    Hast du es mal ausprobiert?

    Was studierst du denn? Und auf welche Art von Schule bist du gegangen, dass du noch nie was von ner Streckung gehört hast? 😕



  • Geht's so: ((2*PI)/40)*i

    Ist auch nichts anderes als die Umwandlung von Grad in Bogenmaß (statt 360° halt 40?).

    Mit meinem obigen Code lass ich mir jetzt die 41 Werte in ein neues 1-dim Array reinschreiben. Bringt mich das jetzt weiter?

    Nein.

    Die y-Werte auf 0-20 skalieren geht doch dann eigentlich so, oder: y=10*sin(((2*PI)/40)*i)+10?

    Ja.

    Wo kommen denn jetzt die ganzen Felder her?

    Mal zusammengefasst:
    - Der sinus geht von 0 bis 2pi abgebildet auf 0 bis 40. Hast du ja jetzt.
    - Der sinus liefert Werte im Bereich -1 bis 1 abgebildet auf 0 bis 20. Hast du auch

    Array_setzen(' ');
      Achse_zeichnen('-');
      int y;
      for(k=0; k<41; k=k+1)
      { 
        y = ... ;// siehe oben
        array[y][k] = '#';
      }
      Ausgabe();
    


  • Ich muss doch den Sinus von 0 - 2pi auf 0 - 40 strecken. wenn ich mir das in so ner graphensoftware anschaue, dann stimmt das mit dem term überein. sin(((2*pi)/40)*x)

    Wenn ich nun die y-Achse auf 0 - 20 strecken will ("normal" isses ja -1, +1) dann geht das so: y = 10*sin(((2*pi)/40)*x)+10.

    Mal zusammengefasst:
    - Der sinus geht von 0 bis 2pi abgebildet auf 0 bis 40. Hast du ja jetzt.
    - Der sinus liefert Werte im Bereich -1 bis 1 abgebildet auf 0 bis 20. Hast du auch

    D.h. ich hab jetzt meine Werte. Jetzt gehts nur noch darum sie in ein Array richtig reinzuschreiben, oder? Wie geht das jetzt? Hier weiß ich nicht mehr weiter... Muss ich jetzt die x-Werte in die eine Dimension des Arrays und die y-Werte in die andere Dimension des Arrays reinschreiben? Und in welches Array? in ein neues oder in das, welches mit Leerzeichen voll ist?



  • bandchef schrieb:

    y=10*sin(((2*PI)/40)*i)+10?

    Warum steht diese Formel nicht bei dir im Code? Und warum möchtest du so einen langen Ausdruck schreiben?
    Es war außerdem ein gut gemeinter Ratschlag meinerseits, Konstanten zu verwenden.
    Was auffällt:

    const int xdim = 41;
    const int ydim = 21;
    .. 
    ((2*PI)/xdim); // ist ein konstanter Wert, der auch vor der Schleife berechnet werden kann
    // 10 entspricht ydim/2
    

    Warum gehst du den Weg über weitere Arrays? Warum ist dein array nun ein Array aus doubles. Warum hast du array in leerarray umbenannt?
    Du kannst die Werte direkt in leerarray eintragen. Wenn du ganz auf Nummer sicher gehen möchtest, castest du den Ausdruck in einen Integerwert und führst eine Bereichsprüfung durch (Wert>=0 && Wert<ydim).
    Du könntest in einer weiteren Schleife leerarray[xdim-1][k] auf '\n' (Zeilenumbruch) setzen und leerarray[xdim-1][ydim-1] auf '\0'. So könntest du alles direkt ausgeben, ohne eine doppelte Schleife zu nutzen.



  • Warum soll ((2*PI)/xdim) ein konstanter Wert sein? Dieser Wert hängt doch von xdim ab?



  • Hier nun mein Code:

    #include<iostream>
    #include<math.h>
    #define M_PI 3.141592654
    using namespace std;
    
    int main()
    {
     int i;
     char leerarray[21][41];
    
     //Array mit Leerzeichen(' ') auffüllen
     for(i=0; i<21; i=i+1)
     {
              for(j=0; j<41; j=j+1)
              {
               leerarray[i][j] = ' ';
              }
     }
    
    system("pause");
    return 0;
    }
    

    Array hab ich in Leerarray umbenannte weil Leerzeich drin sind. Mir wurd gesagt ich soll aussagekräftige Namen vergeben. Hab ich hiermit gemacht.

    Dass ich double-Werte in ein char Array übergeben daraf wusste ich nicht. Diese konstanten mag ich nicht verwenden weil ich den Eindruck habe, dass es für mich (trotzdem der weniger großen Übersichtlichkeit) "einfacher" ist zu verstehen was das bedeutet.

    Was soll ich nun machen? Kannst dus mal bitte ganz genau erklären? Ich stells mir so vor:

    Ich berechne mir nun in einer Schleife die neuen y-Werte. Dann muss ich irgendwie mit einer schleife die neuen y-Werte in mein leerarray reinschreiben.

    Dann berechne ich mir erneut in einer Schleife die x-Werte und schreib mir die dann in einer weiteren Schleifen die neuen x-Werte ins leerarray.

    Ich weiß, dass sind 4 schleifen, aber alles aufeinmal in einer einzigen Schleife würde mich eh nur überfordern. So hab ich alles schrittweise; ist da was dagegen zu sagen?

    Helft ihr mir noch?



  • So sieht das jetzt aus:

    #include<iostream>
    #include<math.h>
    #define M_PI 3.141592654
    using namespace std;
    
    int main()
    {
     int i, j;
     double y_array[21];
     char leerarray[21][41];
    
     //Array mit Leerzeichen(' ') auffüllen
     for(i=0; i<21; i=i+1)
     {
              for(j=0; j<41; j=j+1)
              {
               leerarray[i][j] = ' ';
              }
     }
    
     //y-Werte berechnen
     for(j=0; j<21; j=j+1)
     {
    	 y_array[j] = 10*sin(((2*M_PI)/40)*j)+10;
     }
    
    system("pause");
    return 0;
    }
    


  • Zu deinem "leerarray": Wenn du das Array so genannt hast, denkst du wohl, dass da nichts anderes mehr reinkommt außer den Leerzeichen? Dann frag dich mal, welchen Sinn ein solches Array hätte.

    Zu deinem "y_array": Hätte dieses Array einen sinnvollen Name, würdest du sehen, dass die Abbruchbedingung der letzten Schleife falsch ist.



  • Du willst doch die Sinuskurve in deinem Array haben. Dann musst du da auch reinschreiben!

    Ich schrieb:

    Array_setzen(' ');
      Achse_zeichnen('-');
      int y;
      for(k=0; k<41; k=k+1)
      {
        y = ... ;// siehe oben
        array[y][k] = '#';
      }
      Ausgabe();
    

    und du:

    y=10*sin(((2*PI)/40)*i)+10?

    abgesehen davon das k=i ist, wo ist da das Problem die zwei Sachen zusammenzuführen?
    Abgesehen von einem Typcast y = (int)10*sin(((2*PI)*k/40))+10;

    Array hab ich in Leerarray umbenannte weil Leerzeich drin sind. Mir wurd gesagt ich soll aussagekräftige Namen vergeben. Hab ich hiermit gemacht.

    Jetzt steht in dem Array aber eine Sinuskurve. Willst du es jetzt sinusarray nennen? 😉


Anmelden zum Antworten