WBStartup:NoCli
;         ***** FUNKTIONSPLOTTER *****
;         * MIT EINGABE DER FUNKTION *
;         ***** IM PROGRAMM-LAUF *****

Statement koordkreuz {xma,xmi,xst,yma,ymi,yst}
   SHARED wsx,wsy
   ; Dieses Unterprogramm erstellt das Koordinatenkreuz
   ; und erzeugt eine Skalierung

   xmdif=(xma-xmi)/8
   ymdif=(yma-ymi)/8
   ; Berechnung der Position der Y-Achse
   yax=-xmi/xst
   ; Berechnung der Position der Y-Achse
   xax=wsy+ymi/yst

   Locate 0,xax/8+1
   Print xmi
   Locate (wsx-35)/8,xax/8+1
   Print xma
   Locate (yax-2)/8+1,(wsy-16)/8
   Print ymi
   Locate (yax-2)/8+1,2
   Print yma

   If xax>=0 AND xax<=wsy
       ; Zeichnen der X-Achse
       Line 0,xax,wsx-1,xax,1
       ; Skalenerzeugung
       For m= 0 To xma Step xmdif
          Line yax+(m/xst),xax-2,yax+(m/xst),xax+2,1
       Next m
       For m= 0 To xmi Step -xmdif
          Line yax+(m/xst),xax-2,yax+(m/xst),xax+2,1
       Next m
       ; Ende Skalenerzeugung
   End If
   If yax>=0 AND yax<=wsx
       ; Zeichnen der Y-Achse
       Line yax,0,yax,wsy-1,1
       ; Skalenerzeugung
       For m= 0 To yma Step ymdif
          Line yax-2,xax-m/yst,yax+2,xax-m/yst,1
       Next m
       For m= 0 To ymi Step -ymdif
            Wline yax-2,xax-m/yst,yax+2,xax-m/yst,1
       Next m
       ; Ende Skalenerzeugung
   End If
End Statement


; Variablendeklaration
MaxLen path$=192
MaxLen name$=192
wsx=639        ;
wsy=DispHeight ; Anpassung an NTSC/PAL
 ; Koordinatensystem definieren
ymax=10
ymin=-10
xmax=4
xmin=-4
ystep=(ymax-ymin)/wsy
xstep=(xmax-xmin)/wsx
xspr=1
farb=2

StringGadget 0,223,17,0,0,7,56
StringGadget 0,223,33,0,1,7,56
StringGadget 1,223,17,0,0,7,56
StringGadget 1,223,33,0,1,7,56


._Menuleiste
MenuTitle 0,0,"Funktion"
MenuItem 0,0,0,0,"Bild sichern"
MenuItem 0,0,0,1,"Info"
MenuItem 0,0,0,2,"Ende"
MenuTitle 0,1,"Zusatz"
MenuItem 0,3,1,0,"  Bildschirm immer loeschen ?"
MenuItem 0,0,1,1,"Funktion zeichnen"
MenuItem 0,0,1,2,"Koordinaten aendern "+Chr$(187)+" "
SubItemOff 180,2
SubItem  0,0,1,2,0,"Koordinaten sehen"
SubItem  0,0,1,2,1,"X-Grenzen aendern"
SubItem  0,0,1,2,2,"Y-Grenzen aendern"
MenuItem 0,0,1,3,"Anzahl X-Schritte "+Chr$(187)+" "
SubItemOff 164,1
SubItem  0,2,1,3,0,"  16   "
SubItem  0,2,1,3,1,"  4    "
SubItem  0,4,1,3,2,"  1    "
SubItem  0,2,1,3,3,"  1/4  "
SubItem  0,2,1,3,4,"  1/16 "
MenuTitle 0,2,"Funktionen"
Read Funkt$
MenuItem 0,4,2,0,"  "+Funkt$
Read Funkt$
MenuItem 0,2,2,1,"  "+Funkt$
Read Funkt$
MenuItem 0,2,2,2,"  "+Funkt$
Read Funkt$
MenuItem 0,2,2,3,"  "+Funkt$
Read Funkt$
MenuItem 0,2,2,4,"  "+Funkt$
Read Funkt$
MenuItem 0,2,2,5,"  "+Funkt$
Read Funkt$
MenuItem 0,2,2,6,"  "+Funkt$
Read Funkt$
MenuItem 0,2,2,7,"  "+Funkt$
Read Funkt$
MenuItem 0,2,2,8,"  "+Funkt$
Read Funkt$
MenuItem 0,2,2,9,"  "+Funkt$
Read Funkt$
MenuItem 0,2,2,10,"  "+Funkt$
Read Funkt$
MenuItem 0,2,2,11,"  "+Funkt$


Screen 0,12,"Funktionsplotter 1.0 by MP."
ScreensBitMap 0,0
RGB 7,2,6,12
Window 0,0,0,640,DispHeight,$1900,"",1,2
SetMenu 0

._Haupt ; Menueanwahl
Repeat
  a.l=WaitEvent
  If a=256  ;menupick?
    If MenuHit=0 AND ItemHit=0 ; Bild sichern
       name$ = "Bild.iff"
       p$ = FileRequest$("Bild sichern",path$,name$)
       If p$ <> "" Then SaveScreen 0,p$
    End If
    If MenuHit=0 AND ItemHit=1 Then Gosub _Info ; Information
    If MenuHit=0 AND ItemHit=2  ; Programmende
      Free Window 0
      Free Screen 0
      End
    End If
    If MenuHit=1 AND ItemHit=1 Then Gosub _Zeichnen ; Alles Zeichnen
    If MenuHit=1 AND ItemHit=2
       If SubHit = 0 Then Gosub _Grenze   ; Grenzen zeigen
       If SubHit = 1 Then Gosub _Xgrenze  ; Neue X-Grenze
       If SubHit = 2 Then Gosub _Ygrenze  ; Neue Y-Grenze
    End If
    If MenuHit=1 AND ItemHit=3
       If SubHit <> -1
         xspr=4^(SubHit-2)
       End If
    End If
  EndIf
Forever


._Info:     ; info
  Window 1,227,100,186,70,$1000,"        Info:",0,2
    NPrint ""
    NPrint " Funktionsplotter 1.0 "
    NPrint "  by MP. Berlin 1994"
    NPrint ""
    NPrint " !Funktion! wird im"
    NPrint " Sourcecode eingegeben"
    MouseWait
  Free Window 1
Return

._Grenze:  ;Koordinatengrenzen
  Window 1,205,100,230,60,$1000,"    X/Y-Koordinaten:",0,2
    NPrint ""
    NPrint " Obere  X-Grenze : ",xmax
    NPrint " Untere X-Grenze : ",xmin
    NPrint " Obere Y-Grenze : ",ymax
    NPrint " Untere Y-Grenze : ",xmin
    MouseWait
  Free Window 1
Return


._Xgrenze ; X-Grenze aendern
   SetString 0,0,Str$(xmax)
   SetString 0,1,Str$(xmin)
   xmaxn=xmax
   xminn=xmin
   Window 1,170,100,300,60,$1008,"Neue X-Grenzen festlegen",0,2,0
   Use Window 1
     NPrint ""
     NPrint "  Obere  X-Grenze eingeben:"
     NPrint " "
     NPrint "  Untere X-Grenze eingeben:"
     Repeat
     ev.l=WaitEvent
       If ev=64 AND GadgetHit=0
         xmaxn = Val (StringText$(0,0))
       End If
       If ev=64 AND GadgetHit=1
         xminn = Val (StringText$(0,1))
       End If
     Until ev=$200
     If xmaxn > xminn ; Eingabe richtig
        xmax=xmaxn
        xmin=xminn
     Else
        Free Window 1
        Return
     End If
     xdif=Abs(xmax-xmin)
     xstep=xdif/wsx
   Free Window 1
   Use Window 0
   Cls
   Goto _Zeichnen


._Ygrenze: ; Y-Grenze aendern
   SetString 1,0,Str$(ymax)
   SetString 1,1,Str$(ymin)
   ymaxn=ymax
   yminn=ymin
   Window 1,170,100,300,60,$1008,"Neue Y-Grenzen festlegen",0,2,1
   Use Window 1
     NPrint ""
     NPrint "  Obere  Y-Grenze eingeben:"
     NPrint " "
     NPrint "  Untere Y-Grenze eingeben:"
     Repeat
     ev.l=WaitEvent
       If ev=64 AND GadgetHit=0
         ymaxn = Val (StringText$(1,0))
       End If
       If ev=64 AND GadgetHit=1
         yminn = Val (StringText$(1,1))
       End If
     Until ev=$200
     If ymaxn > yminn ; Eingabe richtig
        ymax=ymaxn
        ymin=yminn
     Else
        Free Window 1
        Return
     End If
      ydif=Abs(ymax-ymin)
      ystep=ydif/wsy
    Free Window 1
    Use Window 0
    Cls
    Goto _Zeichnen


._Zeichnen ; Routine zum Zeichnen der Funktion
    Use Window 0
    BitMapOutput 0
    If MenuChecked (0,1,0)
      farb = 2
      Cls
    End If
    ; Koordinatenkreuz zeichnen
    koordkreuz {xmax,xmin,xstep,ymax,ymin,ystep}

    ; Graph zeichnen
    x=xmin
    Gosub _Funktion
    Line 0,(ymax-y)/ystep,0,(ymax-y)/ystep,farb

    For x= xmin To xmax Step xstep/xspr
      xpos=(x-xmin)/xstep
      Gosub _Funktion
      ypos=(ymax-y)/ystep
      ; Ueberpruefung ob Punkt innerhalb des Fensters
       If ypos<0  Then  Line xpos,-1,xpos,-1,farb
       If ypos>wsy Then  Line xpos,wsy+1,xpos,wsy+1,farb
       If 0<ypos AND ypos<wsy Then Line xpos,ypos,farb
    Next x
    farb +1
    If farb = 15 Then farb = 2
    BeepScreen 0
    ; Graph fertig
Return


._Funktion
    If MenuChecked (0,2,0) Then Gosub _Funktion1
    If MenuChecked (0,2,1) Then Gosub _Funktion2
    If MenuChecked (0,2,2) Then Gosub _Funktion3
    If MenuChecked (0,2,3) Then Gosub _Funktion4
    If MenuChecked (0,2,4) Then Gosub _Funktion5
    If MenuChecked (0,2,5) Then Gosub _Funktion6
    If MenuChecked (0,2,6) Then Gosub _Funktion7
    If MenuChecked (0,2,7) Then Gosub _Funktion8
    If MenuChecked (0,2,8) Then Gosub _Funktion9
    If MenuChecked (0,2,9) Then Gosub _Funktion10
    If MenuChecked (0,2,10) Then Gosub _Funktion11
    If MenuChecked (0,2,11) Then Gosub _Funktion12
Return


;*
;*  Hier knnen eigene Funktionen zur
;*  Untersuchung eingesetzt werden !
;*

._Funktion1:
  Data$ "y(x)=sin(x)"
  y=Sin(x)
Return
._Funktion2:
  Data$ "y(x)=cos(x)"
  y=Cos(x)
Return
._Funktion3:
  Data$ "y(x)=tan(x)"
  y=Tan(x)
Return
._Funktion4:
  Data$ "y(x)=arcsin(x)"
  y=ASin(x)
Return
._Funktion5:
  Data$ "y(x)=arccos(x)"
  y=ACos(x)
Return
._Funktion6:
  Data$ "y(x)=arctan(x)"
  y=ATan(x)
Return
._Funktion7:
  Data$ "y(x)=sinh(x)"
  y=HSin(x)
Return
._Funktion8:
  Data$ "y(x)=cosh(x)"
  y=HCos(x)
Return
._Funktion9:
  Data$ "y(x)=tanh(x)"
  y=HTan(x)
Return
Return
._Funktion10:
  Data$ "y(x)=x^2-3*x"
  y=x*x-3*x
Return
._Funktion11:
  Data$ "y(x)=sqr(x-4)"
  y=Sqr(x-4)
Return
._Funktion12:
  Data$ "y(x)=4x+2x^2-5x^3+7"
  y=7+4*x+2*x^2-5*x^3
Return






