pureDoofheit: Kreise Zeichnen

Hallo,

ich bastel gerade so ein wenig mit basic /freebasic rum.
ich würde gerne mit PSET(X,Y) ein Kreis oder Halbkreis schreiben.
Aber wie bekomme ich das Mathematisch mit Sinus Cosinus und PI hin?
Ich bin echt kein Mathe Genie, kann mir das einer erklären? ich begreife das echt nicht...

danke

  1. Hallo pureDoofheit,

    mit x = R*cos(phi) und y = R*sin(phi) erhältst Du die Koordinaten der Punkte auf einem Kreis mit Radius R. Der Winkel phi läuft von 0 bis 2*PI.

    Gruß, Jürgen

    1. Hallo Jürgen,

      ich habe das mal so in FreeBasic übernommen:

      screen 18,32 'Auflösung 640*480 zu 32Bit

      for a =1 to 360
      pset(a*cos(3.14159265),a*sin(3.14159265)),rgb(255,255,255) 'x,y,farbwert

      sleep 10

      next a
      das klappt nicht.
      ich bin zu doof, ich kapiere das nicht.
       :-(

      1. Hi,

        ich bin zu doof, ich kapiere das nicht.

        nein, Du hast nur das "h" im griechischen Buchstaben "phi" überlesen.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
      2. Moin!

        iR    = 200         'Radius: 200 Pixel
        dPhi  = 3.14159265  'die Zahl Pi
        dStart= dPhi*(-1)
        dEnde = dPhi
        dStep = dPhi*2/360  ' oder:dPhi/180

        FOR a = dStart TO dEnde STEP dStep
        PSET(iR*cos(a),iR*sin(a)),rgb(255,255,255) 'x,y,farbwert
        SLEEP 10 'Du willst wirklich 3600 Sekunden oder eine Stunde warten?
        NEXT a

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix®

        --
        Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
        1. Moin!

          Es fehlt noch was... der Mittelpunkt

          Moin!

          '640*480
          iX=320
          iY=240

          iR    = 200         'Radius: 200 Pixel
          dPhi  = 3.14159265  'die Zahl Pi
          dStart= dPhi*(-1)
          dEnde = dPhi
          dStep = dPhi*2/360  ' oder:dPhi/180
          FOR a = dStart TO dEnde STEP dStep
            PSET(iR*cos(a)+iX, iR*sin(a)+iY, rgb(255,255,255)) 'x,y,farbwert
            SLEEP 10 'Du willst wirklich 3600 Sekunden oder eine Stunde warten?
          NEXT a

          MFFG (Mit freundlich- friedfertigem Grinsen)

          fastix®

          --
          Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
          1. Hallo felix,

            danke für deine mühe aber ich habe es mal 1zu1 übernommen und nichts verändert ausser in deinem nachtrag waren die klammern () falsch gesetzt, das habe ich korrigiert.
            das script läuft zwar fehlerfrei doch es wird kein kreis gezeichnet sondern nur ein punkt....und ich habe den anschein das es eine unendliche schleife ist.
            grüß

            pureDoofheit

      3. Hallo pureDoofheit,

        pset(a*cos(3.14159265),a*sin(3.14159265)),rgb(255,255,255) 'x,y,farbwert

        Du berechnest 360mal den gleichen Punkt auf dem Kreis, nur mit unterschiedlichem Radius. Im Argument von Sinus und Cosinus muss so etwas wie 2*3.14*Laufindex/Anzahl_Punkte stehen. Dann Läuft der Winkel von Null bis 360 Grad bzw. bis 2*PI, also einmal rum. Der Faktor vor sin/cos, also der Kreisradius sollte konstant bleiben. Oder willst Du eine Spirale zeichnen?

        Gruß, Jürgen

        1. gudn tach!

          pset(a*cos(3.14159265),a*sin(3.14159265)),rgb(255,255,255) 'x,y,farbwert

          Du berechnest 360mal den gleichen Punkt auf dem Kreis, nur mit unterschiedlichem Radius.

          iow: eine strecke (als teil einer geraden)

          prost
          seth

    2. mit x = R*cos(phi) und y = R*sin(phi) erhältst Du die Koordinaten der Punkte auf einem Kreis mit Radius R. Der Winkel phi läuft von 0 bis 2*PI.

      Das problem ist: für gleichmässig steigenden phi-werten bekommst du ungleichmässig steigende x und y Werte, und es ist sogar so, dass gerade wo x stark steigt, ist y ziemlich flach und umgerkert.

      Willst du das in eine Schleife durchlaufen und grafisch darstellen, kannst du für phi nicht unendlich viele Werte nehmen, und x und y mussen ganze Zahlen sein.

      Beispiel:

      (R=30)

      ----------------
            phi   x     y
            ----------------
            0     30    0
            0,1   30    3
            0,2   29    6
            0,3   29    9

      Für die selben x-werte hast du jeweils zwei y-werte, und die sind nicht mal "lückenlos"! Grafisch dargestellt sieht das dann vielleicht unschön aus. (Hab nicht probiert.)

      Fragst du ein Grundschulkind, das noch nicht verdorben ist, (=kein sinus und cosinus kennt), wird es dir sagen:

      R² = x² + y²
            x = ± √(R²-y²)

      y läuft von -R bis +R

      Shenga

      1. Hallo Shenga,

        Das problem ist: für gleichmässig steigenden phi-werten bekommst du ungleichmässig steigende x und y Werte, und es ist sogar so, dass gerade wo x stark steigt, ist y ziemlich flach und umgerkert.

        das ist vollkommen richtig. Aber wenn man nicht einzelne Punkte setzt, sondern jeweils den vorherigen und den aktuell berechneten Punkt mit einer Linie verbindet, fällt die Abstufung kaum auf, wenn man die Schrittweite hinreichend klein wählt. Wenn drei, vier, oder auch zehn Pixel dazwischen linear interpoliert werden, merkt das keiner.

        Fragst du ein Grundschulkind, das noch nicht verdorben ist, (=kein sinus und cosinus kennt), wird es dir sagen:
              R² = x² + y²
              x = ± √(R²-y²)

        Und nun zeig mir bitte den Grundschüler, der den Satz des Pythagoras kennt und quadratische Gleichungen auflösen kann, respektive das Wurzelziehen schon gelernt hat.
        Übrigens hätte ich traditionell die Gleichung eher nach y als nach x aufgelöst (auch wenn das hier keine Rolle spielt), und das Problem mit der Schrittweite hast du hier immer noch. Nach deiner eigenen Argumentation müsstest du die Schrittweite für x bzw. y auch bei diesem Ansatz dynamisch verändern.

        So long,
         Martin

        --
        Ein guter Lehrer muss seinen Schülern beibringen können,
        eine Frage so zu stellen, dass auch der Lehrer lernen muss,
        um die Frage beantworten zu können.
          (Hesiod, griech. Philosoph, um 700 v.Chr.)
        1. Hallo,

          Übrigens hätte ich traditionell die Gleichung eher nach y als nach x aufgelöst (auch wenn das hier keine Rolle spielt), und das Problem mit der Schrittweite hast du hier immer noch. Nach deiner eigenen Argumentation müsstest du die Schrittweite für x bzw. y auch bei diesem Ansatz dynamisch verändern.

          Oder zumindest einmal über x und einmal nach y iterieren (was allerdings dann eher die Brute-Force-Variante wäre).

          Grüße
            Klaus

      2. Hallo Shenga,

        man kann Kreise auch als y = f(x) schreiben. Mann bekommt aber dann Probleme mit der Mehrdeutigkeit der Wurzel (+/-, oberer/unterer Halbkreis). Besser, gerade bei Computergrafiken, ist die Parameterdarstellung, also (x,y) = f(phi). Wenn der Winkel gleichmäßig läuft, liegen die Punkte auf dem Kreisbogen sogar im Rahmen der Rundungsgenauigkeit äquidistant. Siehe hierzu Deine Tabelle.

        Ach ja, entschuldige bitte, dass ich nach der Grundschule noch etwas gelernt habe.

        Gruß, Jürgen

      3. gudn tach!

        Willst du das in eine Schleife durchlaufen und grafisch darstellen, kannst du für phi nicht unendlich viele Werte nehmen,

        ja, aber hinreichend viele.

        Für die selben x-werte hast du jeweils zwei y-werte, und die sind nicht mal "lückenlos"!

        um dieses problem zu umgehen, kann man ja abhaengig vom radius eine adaequate schrittweite fuer phi festlegen.

        uebrigens kann man kreise auch einfach mit "circle" malen (zumindest in qbasic).

        prost
        seth

        1. Hallo

          uebrigens kann man kreise auch einfach mit "circle" malen (zumindest in qbasic).

          CIRCLE gibt es in FreeBASIC auch :-)

          Freundliche Grüße

          Vinzenz

  2. Hello out there!

    ich würde gerne mit PSET(X,Y) ein Kreis oder Halbkreis schreiben.
    Aber wie bekomme ich das Mathematisch mit Sinus Cosinus und PI hin?

    Wozu so rechenaufwändige Funktionen verwenden?

    http://de.wikipedia.org/wiki/Bresenham-Algorithmus

    See ya up the road,
    Gunnar

    --
    „Wer Gründe anhört, kommt in Gefahr nachzugeben.“ (Goethe)
    1. Hi Gunnar,

      http://de.wikipedia.org/wiki/Bresenham-Algorithmus

      danke! Ich wusste noch aus meiner Schülerzeit (damals, als wir Programmieren mit Turbo Pascal noch cool fanden), dass es diesen Algorithmus gibt, habe ihn aber mehrmals erfolglos gesucht. Was mir jedoch gerade auffällt:

        
      REM Bresenham-Algorithmus für einen Achtelkreis in Pseudo-Basic  
      REM gegeben seien r, xmittel, ymittel  
      REM Initialisierungen für den ersten Oktanten  
      r2 = r*r : REM einzige Multiplikation  
      [...]  
      REM Achtung, Gefahr von Rundungsfehlern:  
      yend = INT(SQR(r2)/2) : REM einzige unvermeidbare höhere Funktion  
      
      

      Könnte die letztgenannte Zeile nicht auch

        
      yend = INT(r/2)  
      
      

      lauten? r wird ja bis dahin nicht verändert. Was übersehe ich?

      Cheatah

      --
      X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
      X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
      X-Will-Answer-Email: No
      X-Please-Search-Archive-First: Absolutely Yes
      1. gudn tach!

        http://de.wikipedia.org/wiki/Bresenham-Algorithmus

        r2 = r*r : REM einzige Multiplikation
        [...]
        yend = INT(SQR(r2)/2) : REM einzige unvermeidbare höhere Funktion

        
        >   
        > Könnte die letztgenannte Zeile nicht auch  
        >   
        > ~~~
          
        
        > yend = INT(r/2)  
        > 
        
        

        lauten?

        hmm, das
        war auch mal anders.

        unguenstigerweise haben weder der original-autor seinen code noch der modifizierer dessen aenderungen kommentiert. wenn du wissen willst, was nun richtig ist, so solltest du den code stueck fuer stueck ueberpruefen. die einfachere variante ist, es mal auf der diskussionsseite anzusprechen und zu warten.

        prost
        seth

      2. Hi,

        r2 = r*r : REM einzige Multiplikation
        yend = INT(SQR(r2)/2) : REM einzige unvermeidbare höhere Funktion

          
        
        > Könnte die letztgenannte Zeile nicht auch  
        > ~~~
          
        
        > r2 = r*r : REM einzige Multiplikation  
        > yend = INT(r/2)  
        > 
        
        

        lauten? r wird ja bis dahin nicht verändert.

        Was übersehe ich?

        Ist garantiert, daß r positiv ist?
        Falls ja, sollten die Zeilen äquivalent sein.
        Falls nein: dann sind die Zeilen nicht äquivalent (aber auch dann sollte ein Vorzeichenwechsel ausreichen).

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        Schreinerei Waechter
        O o ostern ...
        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. Hallo Andreas,

          Ist garantiert, daß r positiv ist?

          Ja, das ist garantiert. Beim echten Kreis - und hier geht es um Kreise - ist der Radius stets größer 0.

          Freundliche Grüße

          Vinzenz

      3. Hi Gunnar,

        http://de.wikipedia.org/wiki/Bresenham-Algorithmus

        danke! Ich wusste noch aus meiner Schülerzeit (damals, als wir Programmieren mit Turbo Pascal noch cool fanden), dass es diesen Algorithmus gibt, habe ihn aber mehrmals erfolglos gesucht. Was mir jedoch gerade auffällt:

        REM Bresenham-Algorithmus für einen Achtelkreis in Pseudo-Basic
        REM gegeben seien r, xmittel, ymittel
        REM Initialisierungen für den ersten Oktanten
        r2 = r*r : REM einzige Multiplikation
        [...]
        REM Achtung, Gefahr von Rundungsfehlern:
        yend = INT(SQR(r2)/2) : REM einzige unvermeidbare höhere Funktion

        
        >   
        > Könnte die letztgenannte Zeile nicht auch  
        >   
        > ~~~
          
        
        > yend = INT(r/2)  
        > 
        
        

        lauten? r wird ja bis dahin nicht verändert. Was übersehe ich?

        Nein, da muss schon sqr(r2/2) hin, das ist nämlich die y-Koordinate, die zu einem 45-Grad-Kreisbogen (1 Oktant!) gehört. Dort ist x=y, also nach Kreisgleichung x2+y2=r2=2y2, und daraus ergibt sich eben y=sqr(r2/2) und nicht r/2. Man kann auch Pythagoras erwähnen, hier für die Diagonale in einem Quadrat.

        Peter

        1. gudn tach!

          Könnte die letztgenannte Zeile nicht auch

          yend = INT(r/2)

          lauten? r wird ja bis dahin nicht verändert. Was übersehe ich?

          Nein, da muss schon sqr(r2/2) hin, das ist nämlich die y-Koordinate, die zu einem 45-Grad-Kreisbogen (1 Oktant!) gehört. Dort ist x=y, also nach Kreisgleichung x2+y2=r2=2y2, und daraus ergibt sich eben y=sqr(r2/2) und nicht r/2. Man kann auch Pythagoras erwähnen, hier für die Diagonale in einem Quadrat.

          aha! also ist nicht
            INT(SQR(r2)/2) (so steht es derzeit im wp-artikel)
          richtig, sondern
            INT(SQR(r2/2)),
          oder?

          ferner ist
            INT(SQR(r2/2))
          ja nichts anderes als
            INT(SQR(r*r/2))
          = INT(r*SQR(1/2)),
          sodass diese wurzel nicht zur laufzeit berechnet werden muesste, sondern auch schon vorab berechnet werden oder gar von hand reingeschrieben werden koennte.

          prost
          seth

          1. aha! also ist nicht
              INT(SQR(r2)/2) (so steht es derzeit im wp-artikel)
            richtig, sondern
              INT(SQR(r2/2)),
            oder?

            ferner ist
              INT(SQR(r2/2))
            ja nichts anderes als
              INT(SQR(r*r/2))
            = INT(r*SQR(1/2)),
            sodass diese wurzel nicht zur laufzeit berechnet werden muesste, sondern auch schon vorab berechnet werden oder gar von hand reingeschrieben werden koennte.

            Ups, jetzt endlich sehe ich es auch. Du hast vollkommen recht, das kann man eine Ecke eleganter machen, und ein Klammerfehler war vorher auch drin. Danke, werde ich in der Wikipedia gleich ändern.

            Bis denn
            Peter