Rem * Title : Feigenbaumszenario Rem * Author : Thomas Efer Rem * Date : 15. 12. 2002 REM ************************************************************************ REM * * REM * FEIGENBAUM 1.0 * REM * * REM ************************************************************************ REM * * REM * Darstellung eines FEIGENBAUM-Szenarios durch mehrfache Iteration * REM * einer logistischen Parabel: I = A * I * ( 1 - I ) * REM * * REM * * REM * VERSION 1.0 * REM * (C) 2002 / 2003 by Thomas Efer * REM * * REM ************************************************************************ REM ****************************** ANFANG ********************************** REM Setzen der Zeilenmarke für einen Neuanfang ----------------------------- New: REM Aktivieren der Beenden-Funktionalität der [ESC]-Taste ------------------ ENABLE Escapekey REM Einstellen des Anfangsbildschirmmodus ---------------------------------- SET DISPLAY MODE 800,600,16 REM Verstecken des Mauszeigers --------------------------------------------- HIDE MOUSE REM Anzeigen des Titelbildscirms und Abfrage der Parameter ----------------- SET TEXT FONT "Tahoma" SET TEXT SIZE 32 SET TEXT TO BOLD INK rgb(255,0,0), rgb(0,0,0) TEXT 1,1, "Darstellung eines FEIGENBAUM-Szenarios durch mehrfache" TEXT 1,35,"Iteration einer logistischen Parabel: I = A*I*(1-I)" SET TEXT TO NORMAL PRINT " " PRINT " " PRINT " " PRINT " " PRINT " " PRINT " " INK rgb(64,255,64), rgb(0,0,0) PRINT "Geben Sie bitte die gewünschten Parameter an:" PRINT " " INK rgb(255,255,255), rgb(0,0,0) INPUT "Anzahl der Iterationsstartwerte I pro A: ", Ianz PRINT " " INPUT "Anzahl der Iterationen pro A-I-Kombination: ", nmax PRINT " " INPUT "Soll jeweils der vorletzte Iterationswert mit ausgegeben werden? (1=Ja;0=Nein): ", Janz PRINT " " PRINT "Bildschirmmodus:" PRINT " Wünschen sie eine Auflösung von" PRINT " 1 - 800 x 600, " PRINT " 2 - 1024 x 768 oder " PRINT " 3 - 1600 x 1200" INPUT " Bildpunkten? ", Disp PRINT " " INK rgb(255,00,00), rgb(0,0,0) PRINT "Die Darstellung beginnt im Bereich von 1 bis 3 (waagerecht) für A, sowie 0 bis 1 (senkrecht) für I." PRINT " " PRINT "Das drücken der Leertaste führt zur Ausgabe der Koordinaten des aktuellen Darstellungsfensters." PRINT " " PRINT "Die Pfeil-nach-oben-Taste setzt die Anzeige auf den oben genannten Startbereich zurück." PRINT "Die Pfeil-nach-unten-Taste bringt sie zur Parametereingabe zurück." PRINT "Die Pfeil-nach-rechts-Taste speichert ein Abbild des Bildschirms als 'Feige.bmp' im Startverzeichnis des Programms." PRINT "Die Pfeil-nach-links-Taste wechselt zwischen den letzen beiden Ansichten (Neuberechnung)" PRINT " " PRINT "Die [Esc]ape-Taste beendet das Programm" PRINT " " PRINT "Mit zwei Mausklicks legen sie den Bereich für eine vergrößerte Darstellung fest." PRINT " " INK rgb(64,255,64), rgb(0,0,0) PRINT "[...zum Fortfahren Maustaste drücken!]" REM Anzeigen des Mauszeigers ----------------------------------------------- SHOW MOUSE REM Auf Mausklick warten --------------------------------------------------- SUSPEND FOR MOUSE REM Einstellen der gewünschte Bildschirmauflösung -------------------------- IF Disp = 1 THEN SET DISPLAY MODE 800, 600, 16 IF Disp = 2 THEN SET DISPLAY MODE 1024, 768, 16 IF Disp = 3 THEN SET DISPLAY MODE 1600, 1200, 16 REM Initialisieren der automatischen Bildsynchronisation ------------------- SYNC RATE 0 REM Löschen des Bildschirminhaltes ----------------------------------------- CLS REM Setzen der Zeilenmarke für einen Reset des Zooms ----------------------- Reset: REM Initialisierung der Parameter des Bildschirmbereichs der Gesamtansicht - Amin# = 1 Amax# = 4 Imax# = 1 Imin# = 0 REM Speicherung des aktuellen Bildschirmbereiches -------------------------- AminALT# =Amin#:AmaxALT#=Amax#:IminALT#=Imin#:ImaxALT#=Imax# REM Setzen der Zeilenmarke für den Anfang des Bildaufbaus ------------------ Start: REM Ausschalten der Automatische Bildsynchronisation ----------------------- SYNC OFF REM Verstecken des Mauszeigers --------------------------------------------- HIDE MOUSE REM Anzeigen des Wartebildschirms ------------------------------------------ ink rgb(0,0,0),rgb(0,0,0) BOX 1,1,SCREEN WIDTH() - 2, 35 ink rgb(255,0,0),rgb(0,0,0) TEXT 2,2, "Bitte haben Sie etwas Geduld. Das Bild wird berechnet..." REM Einschalten der Automatische Bildsynchronisation ----------------------- SYNC ON REM Zeichnen des Rahmens --------------------------------------------------- INK rgb(255,255,255), rgb(0,0,0) BOX 0,0,SCREEN WIDTH() - 1,SCREEN HEIGHT() - 1 INK rgb(0,0,0), rgb(0,0,0) BOX 1,1,SCREEN WIDTH() - 2,SCREEN HEIGHT() - 2 INK rgb(255,255,255), rgb(0,0,0) REM BEGINN DER ITERATIONSSCHLEIFE ------------------------------------------ REM Initialisierung des aktuellen Parameters A ----------------------------- A# = Amin# REM Beginn der Schleife zur Erhöhung von A --------------------------------- FOR Aakt = 1 TO SCREEN WIDTH() REM Erhöhung von A um die Differenz eines Pixels -------------------------- A# = A# + ((Amax# - Amin#) / SCREEN WIDTH()) REM Initialisierung der Hilfsvariablen Ialt ------------------------------- Ialt# = 0 REM Beginn der Schleife zur Erhöhung von I -------------------------------- FOR Iakt = 2 TO Ianz + 2 REM Erhöhung von Ialt um das Reziprok der Gesamtanzahl aller I pro A ----- Ialt# = Ialt# + (1.0 / (Ianz + 2)) REM Zuweisung des aktuellen Wertes für I --------------------------------- I# = Ialt# REM Beginn der Zählschleife zur Berechnung von I nach n Iterationen ------ FOR n = 1 TO nmax REM Speicherung des "vorletzten" Wertes von I als J --------------------- J# = I# REM - Iteration von I --------------------------------------------------- I# = A# * I# - A# * I# * I# REM Ende der Zählschleife ------------------------------------------------ NEXT n REM Ausgabe des n-mal Iterierten Wertes I --------------------------------- DOT Aakt , (Imax# - I#) * SCREEN Height() / (Imax# - Imin#) REM eveteuelle Ausgabe des (n-1)-mal iterierten Wertes I ------------------ IF Janz = 1 AND nmax > 2 THEN DOT Aakt , (Imax# - J#) * SCREEN Height() / (Imax# - Imin#) REM Ende der I-Schleife --------------------------------------------------- NEXT Iakt REM Ende des A-Schleife ---------------------------------------------------- NEXT Aakt REM Ausschalten deraAutomatischen Bildsynchronisation ---------------------- SYNC OFF SHOW MOUSE REM Warten auf weitere Benutzereingaben ------------------------------------ WHILE mouseclick() = 0 REM eventuelle Anzeige der Koordinaten des Darstellungsfensters ----------- IF spacekey() = 1 INK rgb(64,255,64), rgb(0,0,0) TEXT 2,2, "X-Koordinaten (A-Werte): von " + STR$(Amin#) + " (links) bis " + STR$(Amax#) + " (rechts)" TEXT 2,36,"Y-Koordinaten (I-Werte): von " + STR$(Imin#) + " (unten) bis " + STR$(Imax#) + " (oben)" INK rgb(255,255,255), rgb(0,0,0) ENDIF REM eventueller Neustart des Programms ------------------------------------ IF downkey() = 1 THEN GOTO New REM eventueller Reset der Anzeigefensterkoordinaten ----------------------- IF upkey() = 1 AminALT# =Amin#:AmaxALT#=Amax#:IminALT#=Imin#:ImaxALT#=Imax# GOTO Reset ENDIF REM eventuelles Speichern des Bildschirminhaltes -------------------------- IF rightkey() = 1 HIDE MOUSE SAVE BITMAP "Feige.bmp" SHOW MOUSE ENDIF REM eventuelles Einstellen des vorhergehenden Bildschirmbereiches --------- IF leftkey() = 1 AminDummy#=Amin#:AmaxDummy#=Amax#:IminDummy#=Imin#:ImaxDummy#=Imax# Amin#=AminALT#:Amax#=AmaxALT#:Imin#=IminALT#:Imax#=ImaxALT# AminALT# =AminDummy#:AmaxALT#=AmaxDummy#:IminALT#=IminDummy#:ImaxALT#=ImaxDummy# GOTO Start ENDIF REM Ende des Wartens bei Drücken der linken Maustaste ---------------------- ENDWHILE REM Speicherung des aktuellen Bildschirmbereiches -------------------------- AminALT# =Amin#:AmaxALT#=Amax#:IminALT#=Imin#:ImaxALT#=Imax# REM Warten auf ein Loslassen der Maustaste --------------------------------- SUSPEND FOR MOUSE REM Feststellen der Parameter der ersten Ecke des Zoom-Ausschnitts --------- INK rgb(255,0,0), rgb(0,0,0) LINE 0,MouseY(),SCREEN WIDTH(),MouseY() LINE MouseX(),0,MouseX(),SCREEN HEIGHT() I1# = (Imax# - Imin#) / Screen Height() * (Screen Height() - MouseY()) + Imin# A1# = (Amax# - Amin#) / Screen Width() * MouseX() + Amin# REM Warten auf ein Loslassen der Maustaste --------------------------------- SUSPEND FOR MOUSE REM Feststellen der Parameter der zweiten Ecke des Zoom-Ausschnitts -------- INK rgb(255,0,0), rgb(0,0,0) LINE 0,MouseY(),SCREEN WIDTH(),MouseY() LINE MouseX(),0,MouseX(),SCREEN HEIGHT() I2# = (Imax# - Imin#) / Screen Height() * (Screen Height() - MouseY()) + Imin# A2# = (Amax# - Amin#) / Screen Width() * MouseX() + Amin# REM Anwenden der Neuen Parameter IF A1# < A2#: Amin# = A1# : Amax# = A2#:ENDIF IF A2# < A1#: Amin# = A2# : Amax# = A1#:ENDIF IF I1# < I2#: Imin# = I1# : Imax# = I2#:ENDIF IF I2# < I1#: Imin# = I2# : Imax# = I1#:ENDIF REM Verweis auf den Anfang des Bildaufbaus und der Iteration --------------- GOTO Start REM ******************************* ENDE ***********************************