' **********************************************************
' ***  Feigenbaum darstellen und Ausschnitte vergrößern  ***
' **********************************************************
' ***     * *     H A U P T P R O G R A M M     * *      ***
' **********************************************************
' Für Erklärungen siehe Listing 1, Peter de Jong - Abbildungen
' Unterschied: Erst wenn das Bild vollkommen fertig ist, kann
' der zu vergrößernde Ausschnitt bestimmt werden.
'
' Wollen siehe andere Formeln untersuchen, müssen sie das Pro-
' gramm an allen Stellen ändern (insges. 4), wo "für Feigen-
' baum" steht.
'
GOSUB variablen_initialisieren
'
OPENS 1,0,0,640,512,1,&H8004    ! Screen+Window öffnen
OPENW 0
FULLW 0
TITLEW #0,STR$(xu)+" , "+STR$(xo)+" <> "+STR$(yu)+" , "+STR$(yo)
'
'
DO
  GOSUB variablen_initialisieren
  faktorx=(xo-xu)/xaufloesung%
  faktory=(yo-yu)/yaufloesung%
  '
  '
  FOR x=xu TO xo STEP (xo-xu)/xaufloesung%
    y=0.3
    FOR i%=0 TO 200
      y=r*SIN(PI*x)     ! für Feigenbaum: y=x*y*(1-y)
    NEXT i%
    CLR i%
    REPEAT
      y=r*SIN(PI*x)     ! für Feigenbaum: y=x*y*(1-y)
      GOSUB punkt_setzen
    UNTIL i%=200
  NEXT x
  '
  hÄlfte%=INT(xaufloesung%/2)
  GET 0,0,hÄfte%,yaufloesung%,abildspeicher_a$
  GET hÄlfte%,0,xaufloesung%,yaufloesung%,bbildspeicher_b$
  '
  REPEAT
    MOUSE xu%,yu%,taste%
    TITLEW #0,STR$(xu%)+" , "+STR$(yu%)
  UNTIL taste%=1
  '
  REPEAT
  UNTIL MOUSEK=0
  '
  REPEAT
    TITLEW #0,STR$(xu%)+" , "+STR$(xo%)+" <> "+STR$(yu%)+" , "+STR$(yo%)
    PUT hÄlfte%,0,bbildspeicher_b$
    PUT 0,0,abildspeicher_a$
    MOUSE xo%,yo%,taste%
    BOX xu%,yu%,xo%,yo%
  UNTIL taste%=1
  '
  '
  IF xu%>xo%
    SWAP xu%,xo%
  ENDIF
  IF yu%>yo%
    SWAP yu%,yo%
  ENDIF
  '
  TITLEW #0,STR$(xu)+" , "+STR$(xo)+" <> "+STR$(yu)+" , "+STR$(yo)
  REPEAT
  UNTIL INKEY$="w"
  '
  xo=xu+xo%*faktorx
  xu=xu+xu%*faktorx
  yo=yu+yo%*faktory
  yu=yu+yu%*faktory
  '
  DEFNUM 5
  TITLEW #0,STR$(xu)+" , "+STR$(xo)+" <> "+STR$(yu)+" , "+STR$(yo)
  CLS
  '
LOOP
EDIT
'
'
'
' **********************************************************
' ***     * *    U N T E R P R O G R A M M E    * *      ***
' **********************************************************
'
PROCEDURE punkt_setzen
  x%=(x-xu)/faktorx
  y%=(y-yu)/faktory
  '
  IF x%>=0 OR x%<=xaufloesung%  ! Punkt auf Bildschirm ?
    IF y%>=0 OR y%<=yaufloesung%
      PLOT x%,y%
      INC i%          ! zählt die Punkte auf dem Bildschirm
    ENDIF
  ENDIF
RETURN
'
'
'
PROCEDURE variablen_initialisieren
  xaufloesung%=617
  yaufloesung%=495
  '
  x=0.3         ! Anfangswert
  '
  xu=0          ! Wertebereich festlegen
  xo=4
  yu=4          ! für Feigenbaum = 1
  yo=-4         ! für Feigenbaum = 0
RETURN
