Seite 1 von 1

Winkelfunktionen grafisch dargestellt

Verfasst: 22.12.2007 02:20
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

Verfasst: 22.12.2007 11:55
von milan1612
Recht nützlich, Danke :D
(Sonst muss ich immer mein 10. Klasse Mathe Heft rauskramen)

Verfasst: 23.12.2007 00:25
von hardfalcon
Dass ich DAS noch erlebe, dass Helle mal nen Code nicht in reinem ASM hinzaubert. :o

Schönes Tool! :allright: