Winkelfunktionen grafisch dargestellt

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Winkelfunktionen grafisch dargestellt

Beitrag von Helle »

Wer bei den Winkelfunktionen nicht ganz sattelfest ist kann sich ja mal folgendes Progrämmchen zu Gemüte führen. Einfach die pinkfarbene Kuller auf der Peripherie des Kreises bewegen!

Code: Alles auswählen

;- Grafische Darstellung der Grund-Winkelfunktionen
;- "Helle" Klaus Helbing, 22.12.2007, PB4.10 

OpenWindow(0,0,0,900,600,"Winkelfunktionen",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)

If CreateGadgetList(WindowID(0))
  ImageGadget (0,   0,   0, 900, 600, 0)
EndIf

CreateImage(0, 900, 600, #PB_Image_DisplayFormat)
 
X1.d=210             ;Ausgangswert Peripherie-Punkt
Y1.d=300 
XT=110
YT=300
XCT=110
YCT=300

KF.d=0.5*#PI/0.9     ;Korrekturfaktor Abzisse  
 
Repeat
  Event=WaitWindowEvent()
  StartDrawing(ImageOutput(0))
  Box(0,0,900,800,RGB(255,255,255))
  DrawingMode(#PB_2DDrawing_Outlined)

  P1YK.d=300
  P1XK.d=110
  For i=0 To 359  
    P2YK.d=300-Sin(i/180*#PI)*100 
    P2XK.d=110+Cos(i/180*#PI)*100

    LineXY(P1XK,P1YK,P2XK,P2YK,0)      ;"Einheitskreis", Circle ist nicht deckungsgleich mit
                                       ; Bogenmass unten!
    P1XK=P2XK 
    P1YK=P2YK
  Next 

  ;Circle(110,300,100,0)                ;"Einheitskreis"
  LineXY(0,300,220,300,0)              ;X-Achse des Kreises
  LineXY(110,410,110,190,0)            ;Y-Achse des Kreises
  LineXY(240,300,880,300,0)            ;Abzisse
  LineXY(250,580,250,20,0)             ;Ordinate
  LineXY(210,580,210,20,0)             ;Kreis-Tangente
  LineXY(350,292,350,308,0)            ;X=1
  LineXY(450,292,450,308,0)            ;X=2  
  LineXY(550,292,550,308,0)            ;X=3
  LineXY(650,292,650,308,0)            ;X=4
  LineXY(750,292,750,308,0)            ;X=5
  LineXY(850,292,850,308,0)            ;X=6
  LineXY(407,292,407,308,0)            ;1/2Pi
  LineXY(564,292,564,308,0)            ;Pi
  LineXY(721,292,721,308,0)            ;3/2Pi
  LineXY(878,292,878,308,0)            ;2Pi
  
  LineXY(242,200,258,200,0)            ;Y=1
  LineXY(202,200,218,200,0)            ;Kreis-Tangente=1
  LineXY(242,100,258,100,0)            ;Y=2
  LineXY(202,100,218,100,0)            ;Kreis-Tangente=2
  LineXY(242,400,258,400,0)            ;Y=-1
  LineXY(202,400,218,400,0)            ;Kreis-Tangente=-1
  LineXY(242,500,258,500,0)            ;Y=-2
  LineXY(202,500,218,500,0)            ;Kreis-Tangente=-2
  
  DrawText(890,292,"X")  
  DrawText(246,0,"Y")
  DrawText(225,293,"0°")
  DrawText(102,180,"90°")
  DrawText(100,410,"270°")
  
  DrawText(346,305,"1")                ;X=1
  DrawText(446,305,"2")                ;X=2
  DrawText(546,305,"3")                ;X=3
  DrawText(646,305,"4")                ;X=4
  DrawText(746,305,"5")                ;X=5
  DrawText(846,305,"6")                ;X=6
  DrawText(400,305,"1/2Pi")            ;Pi/2
  DrawText(560,305,"Pi")               ;Pi
  DrawText(705,305,"3/2Pi")            ;3/2Pi
  DrawText(870,305,"2Pi")              ;2Pi
  
  DrawText(228,192,"1")                ;Y=1
  DrawText(228,92,"2")                 ;Y=2
  DrawText(225,392,"-1")               ;Y=-1
  DrawText(225,492,"-2")               ;Y=-2  

  LineXY(10,20,50,20,RGB(0,255,0))     ;Grün=Sinus
  DrawText(60,12,"= Sinus")
  LineXY(10,40,50,40,RGB(255,0,0))     ;Rot=Cosinus
  DrawText(60,32,"= Cosinus")
  LineXY(10,60,50,60,RGB(0,0,255))     ;Blau=Tangens
  DrawText(60,52,"= Tangens")
  LineXY(10,80,50,80,RGB(255,192,0))   ;Gelb=Cotangens
  DrawText(60,72,"= Cotangens")
  LineXY(10,100,50,100,RGB(255,0,255)) ;Pink=Bogenmass
  DrawText(60,92,"= Bogenmass")

  DrawingMode(#PB_2DDrawing_Default)
  Circle(X1,Y1,4,RGB(255,0,255))       ;Peripherie-Punkt
 
  X.d=WindowMouseX(0)
  Y.d=WindowMouseY(0)
  If X>=10 And X<=210 And Y>=200 And Y<=400
    X1=X
    Y1=Y

    T.d=(300-Y)/(X-110)
    AT.d=ATan(T)
    X2.d=Cos(AT)*100
    Y2.d=Sin(AT)*100
    
    If X>=110 And Y<=300               ;1.Quadrant
      Winkel.d=ATan(T)*180/#PI 
    
      X1=110+X2
      Y1=300-Y2 
   
      XT=110
      YT=300
      XCT=110
      YCT=300
    
      Sig=1
    EndIf 
    
    If X<110 And Y<=300                ;2.Quadrant
      Winkel.d=180+ATan(T)*180/#PI       

      X1=110-X2
      Y1=300+Y2 
 
      XT=X1
      YT=Y1
      XCT=110+Y2
      YCT=300-X2  
    
      Sig=-1
    EndIf
    
    If X<110 And Y>300                 ;3.Quadrant
      Winkel.d=180+ATan(T)*180/#PI       

      X1=110-X2
      Y1=300+Y2 

      XT=X1
      YT=Y1
      XCT=110-Y2
      YCT=300+X2   
   
      Sig=-1
    EndIf 

    If X>=110 And Y>300                ;4.Quadrant
      Winkel.d=360+ATan(T)*180/#PI       
    
      X1=110+X2
      Y1=300-Y2 
   
      XT=110
      YT=300  
      XCT=110
      YCT=300 
    
      Sig=1
    EndIf 
      
    Circle(X1,Y1,4,RGB(255,0,255))
  
    S.d=Sin(AT)*Sig
    C.d=Cos(AT)*Sig
    CT.d=1/T
 
    B.d=Winkel/180*#PI 
 
  EndIf 
    
  DrawText(10,450,"Winkel = "+StrD(Winkel)+"°",RGB(255,0,255))    ;Aktueller Winkel
  DrawText(10,470,"Bogenmass = "+StrD(B),RGB(255,0,255))
  DrawText(10,490,"Sinus = "+StrD(S),RGB(0,255,0))
  DrawText(10,510,"Cosinus = "+StrD(C),RGB(255,0,0))
  DrawText(10,530,"Tangens = "+StrD(T),RGB(0,0,255))
  DrawText(10,550,"Cotangens = "+StrD(CT),RGB(255,192,0))
   
  LineXY(X1,300,X1,Y1,RGB(0,255,0))              ;Sinus
  LineXY(110,Y1,X1,Y1,RGB(255,0,0))              ;Cosinus
  LineXY(XT,YT,210,300-100*T,RGB(0,0,255))       ;Tangens  
  LineXY(XCT,YCT,210,300-100*CT,RGB(255,192,0))  ;Cotangens

  ;- Startwerte Sinus
  P1XS.d=250/KF
  P1YS.d=300
  P2XS.d=250/KF
 
 ;- Startwerte Cosinus
  P1XC.d=P1XS
  P1YC.d=200
  P2XC.d=250/KF
  
  ;- Startwerte Tangens
  P1XT.d=250/KF
  P1YT.d=300
  P2XT.d=250/KF  
 
  ;- Startwerte Cotangens
  P1XCT.d=250/KF
  P1YCT.d=300
  P2XCT.d=250/KF   
 
  ;- Startwerte Bogenmass am Kreis
  P1XB.d=210
  P1YB.d=300
 
  For i=0 To Winkel
    P2YS.d=300-(Sin(i/180*#PI))*100  
    P2XS+1
    LineXY(P1XS*KF,P1YS,P2XS*KF,P2YS,RGB(0,255,0))         ;Sinus
    P1XS=P2XS 
    P1YS=P2YS
 
    P2YC.d=300-(Cos(i/180*#PI))*100  
    P2XC+1
    LineXY(P1XC*KF,P1YC,P2XC*KF,P2YC,RGB(255,0,0))         ;Cosinus
    P1XC=P2XC 
    P1YC=P2YC

    P2YT.d=300-(Tan(i/180*#PI))*100  
    P2XT+1
    LineXY(P1XT*KF,P1YT,P2XT*KF,P2YT,RGB(0,0,255))         ;Tangens
    P1XT=P2XT 
    P1YT=P2YT

    P2YCT.d=300-(1/(Tan(i/180*#PI))*100)  
    P2XCT+1
    LineXY(P1XCT*KF,P1YCT,P2XCT*KF,P2YCT,RGB(255,192,0))   ;Cotangens
    P1XCT=P2XCT 
    P1YCT=P2YCT

    P2YB.d=300-Sin(i/180*#PI)*100 
    P2XB.d=110+Cos(i/180*#PI)*100
    LineXY(P1XB,P1YB,P2XB,P2YB,RGB(255,0,255))             ;Bogenmass am Kreis
    P1XB=P2XB 
    P1YB=P2YB
  Next 
  
  LineXY(250,300,250+B*100,300,RGB(255,0,255))             ;Bogenmass auf Abzisse
  
  StopDrawing()
  SetGadgetState(0,ImageID(0))
Until Event=#PB_Event_CloseWindow
Gruss
Helle

Edit: Vorzeichen korrigiert
Edit: 22.12.2007 Bogenmass hinzugefügt
Zuletzt geändert von Helle am 22.12.2007 15:26, insgesamt 1-mal geändert.
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

Recht nützlich, Danke :D
(Sonst muss ich immer mein 10. Klasse Mathe Heft rauskramen)
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Dass ich DAS noch erlebe, dass Helle mal nen Code nicht in reinem ASM hinzaubert. :o

Schönes Tool! :allright:
Antworten