LaTeX Syntax-Highlighting mit GeSHi

Das Problem:

Ich beschäftige mich an meiner Hochschule als Hilfskraft mit der Erstellung eines Wikis über "LaTeX für wissenschaftliche Arbeiten". Dabei muss ich nicht selten auch LaTeX-Sources einfügen. Und diese sehen, mit pre-Tags "formatiert", leider nur sehr unscheinbar und unübersichtlich aus. Aber, so dachte ich mir: MediaWiki kann doch alles - zumindest mit Plugins...

Doch zu meinem großen Erstaunen musste ich feststellen, dass es anscheined keine vernünftigen Syntax-Highlighter gibt, die in PHP geschrieben sind und LaTeX-Quelltexte hervorheben können. Eine einfache Integrierbarkeit eines solchen Tools in mein Wikisystem habe ich dabei noch garnicht vorausgesetzt.

Die Lösung:

Der Generic Syntax Highlighter (GeSHi) ist eine tolle PHP-Bibliothek mit der fast alle Sprachen "gehighlighted" werden können. Ein Mediawiki-Plugin dafür existiert auch schon. Von LaTeX hat der GeSHi allerdings (noch) keine Ahnung! Aber man kann ihm neue Sprachen beibringen. Dummerweise werden gerade jetzt bei der Weiterentwicklung von Version 1.0.x zu Version 1.1+ grundlegende Änderungen in den Sprachendateien stattfinden. Das bedeutet, dass man entweder für ein veraltetes System schreibt, oder schlecht dokumentierte neue Schnittstellen bedienen muss. Ich habe mich für "Variante 1" entschieden. Schließlich ist mein LaTeX-Highlighter ja auch eher für den "Hausgebrauch" gedacht. Und in meinem Wiki bestimme ich, was die "aktuelle" Version ist! icon_wink.gif

Nun habe ich mit meinem neu erlangten Wissen über Regular Expressions einen ersten Entwurf zusammenprogrammiert. Das Ganze hat sich als eine ziemliche Fummmelarbeit herausgestellt, unter anderem weil viele vorgefertigte GeSHi-Elemente für die (recht seltsame und "historisch gewachsene") TeX-Syntax nicht wirklich anwendbar sind.

Besonders toll ist, dass der Backslash sowohl in PHP als auch bei RegExes und natürlich in TeX selber ein Escape-Character ist... ==> "\\\\\\\\"

Mein Entwurf für die Sprachdefinitionsdatei ist unten angehängt. Viel Spaß damit - vielleicht wird er ja dem ein oder anderen nützlich sein.

Richtig zufrieden bin ich damit selbst noch nicht - immerhin gibt's jetzt LaTeX in bunt und übersichtlicher als nur "monospaced" dargestellt.

Update (25. Juni 2007)

Matthias Pospiech hat aufbauend auf meinem Entwurf (s. unten) zusammen mit dem Programmierer von GeSHi eine sehr vollständige Sprachdefinitionsatei für LaTeX erstellt. Diese ist jetzt Bestandteil von Geshi - und wird so auch mit MediaWiki, Wordpres, und vielen anderen großen PHP-Anwendungen mitgeliefert! icon_biggrin.gif

<?php /*************************************************************************************  * efilatex.php  * -----  * Author: efi (mail_at_thomasefer_dot_de)  *************************************************************************************  *  *   This file is not yet part of GeSHi. (and is not compatible to the 1.1+ branch)  *  *   GeSHi is free software; you can redistribute it and/or modify  *   it under the terms of the GNU General Public License as published by  *   the Free Software Foundation; either version 2 of the License, or  *   (at your option) any later version.  *  *   GeSHi is distributed in the hope that it will be useful,  *   but WITHOUT ANY WARRANTY; without even the implied warranty of  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  *   GNU General Public License for more details.  *  *   You should have received a copy of the GNU General Public License  *   along with GeSHi; if not, write to the Free Software  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  *  ************************************************************************************/ $language_data = array (     'LANG_NAME' => 'efilatex', // quick, dirty & novice approach to highlight LaTeX     'COMMENT_SINGLE' => array(1 => '%'),     'COMMENT_MULTI' => array(),     'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,     'QUOTEMARKS' => array('', ""),     'ESCAPE_CHAR' => '',     'KEYWORDS' => array(         1 => array(             '\\'       ),         2 => array(             'cm'             ),         3 => array(             'begin', 'end'             ),         4 => array(             'test4'             ),         ),     'SYMBOLS' => array(         '.', ',','\\',"~", "{", "}", "[", "]", "$"         ),     'CASE_SENSITIVE' => array(         GESHI_COMMENTS => true,         1 => false,         2 => false,         3 => false,         4 => false,         ),     'STYLES' => array(         'KEYWORDS' => array(             1 => 'color: #b1b100; font-weight: bold;',             2 => 'color: #000000; font-weight: bold;',             3 => 'color: #000066; font-weight: normal;',             4 => 'color: #993333; font-weight: normal;'             ),         'COMMENTS' => array(             1 => 'color: #808080; font-style: italic;',             2 => 'color: #339933; font-weight: normal;',             'MULTI' => 'color: #808080; font-style: italic;'             ),         'ESCAPE_CHAR' => array(             0 => 'color: #000099; font-weight: bold;'             ),         'BRACKETS' => array(             0 => 'color: #FF7766; font-weight: normal;'             ),         'STRINGS' => array(             0 => 'color: #ff0000; font-weight: normal;'             ),         'NUMBERS' => array(             0 => 'color: #cc66cc; font-weight: normal;'             ),         'METHODS' => array(             1 => 'color: #202020; font-weight: normal;',             2 => 'color: #202020; font-weight: normal;'             ),         'SYMBOLS' => array(             0 => 'color: #66ccFF; font-weight: normal;'             ),         'REGEXPS' => array(           0 => 'color: #209090; font-weight: bold;',           1 => 'color: #202020; font-weight: bold;',             2 => 'color: #608020; font-weight: bold;',             3 => 'color: #F02020; font-weight: bold;',             4 => 'color: #CCF020; font-weight: bold;',             5 => 'color: #C000CC; font-weight: bold;'       ),         'SCRIPT' => array(             )         ),     'URLS' => array(         ),     'OOLANG' => false,     'OBJECT_SPLITTERS' => array(         ),     'REGEXPS' => array( 0 => array(             GESHI_SEARCH => "(\\\\\\\\|~|&|\\\\\\_|\\\\&|\\$|\|)",             GESHI_REPLACE => '\\1',             GESHI_MODIFIERS => '',             GESHI_BEFORE => '',             GESHI_AFTER => ''             ),     // \keywords 1 => array(             GESHI_SEARCH => "(\\\\)([a-zA-Z]+)",             GESHI_REPLACE => '\\1\\2',             GESHI_MODIFIERS => '',             GESHI_BEFORE => '',             GESHI_AFTER => ''             ),     // {parameters} 2 => array(             GESHI_SEARCH => "(\\{)(.+)(\\})",             GESHI_REPLACE => '\\2',             GESHI_MODIFIERS => '',             GESHI_BEFORE => '\\1',             GESHI_AFTER => '\\3'             ), 3 => array(             GESHI_SEARCH => "(\\[)(.+)(\\])",             GESHI_REPLACE => '\\2',             GESHI_MODIFIERS => '',             GESHI_BEFORE => '\\1',             GESHI_AFTER => '\\3'             ), 4 => array(             GESHI_SEARCH => "(\\$)(.+)(\\$)",             GESHI_REPLACE => '\\2',             GESHI_MODIFIERS => '',             GESHI_BEFORE => '\\1',             GESHI_AFTER => '\\3'             ), 5 => array(             GESHI_SEARCH => "([&])(.+?)([;])",             GESHI_REPLACE => '\\2\\3',             GESHI_MODIFIERS => '',             GESHI_BEFORE => '\\1',             GESHI_AFTER => ''             ),         ),     'STRICT_MODE_APPLIES' => GESHI_NEVER,     'SCRIPT_DELIMITERS' => array(         ),     'HIGHLIGHT_STRICT_BLOCK' => array(         ) ); ?>

Die Hanoier Stadtmusikanten

Screenshot des Spiels Wer Tiere mag und den Turmbau von Hanoi spannend findet, kann sich hier die finale Version des wohl langweiligsten, je für den TI Voyage 200 enwtickelten Spiels herunterladen.

Tipp: Wer über Titel und Screenshot nicht wenigstens schmunzeln kann, wird aller Voraussicht nach auch am Spiel selbst keine Freude haben und kann getrost auf den Download verzichten. icon_biggrin.gif

TIGCC SpriteMaker

Screenshots des TIGCCSM

Wer öfters grafiklastige Assemblerprogramme für TI-Taschenrechner programmiert, möchte vielleicht mein Tool, den TIGCC-SpriteMaker ausprobieren. Durch den TIGCCSM entfällt das lästige Pixel-für-Pixel-Eingeben und Sprites können mit der Maus gezeichnet werden. Das Programm wurde in VisualBasic 5 geschrieben und es ist möglich, dass es deswegen auf einigen modernen Systemen nicht läuft. Wenn das passiert, genügt eine Mail an mich und ich werde mir etwas neues (zum Beispiel .NET-taugliches) einfallen lassen.

Hier geht's zum Download!

Und hier noch was für unterwegs:

unsigned char Sprite1[]={ 0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10100101, 0b10011001, 0b01000010, 0b00111100};

In diesem Sinne: Viel Spaß!

Geplante Features in Terragen 0.9.x

Hier habe ich ein paar interessante Screenshots von der Benutzeroberfläche von Terragen 0,9,41 ausgestellt.

Die Bilder weichen etwas von der Standardausführung ab. Das, was da zusätzlich vorhanden ist entspringt allerdings nicht meiner Phantasie, sondern dem Programm selbst. Ich habe nichts hinzugedichtet, sondern nur verstecktes sichtbar gemacht. (...und dann rötlich eingefärbt.)

Auch sind die neuen Regler und Knöpfe noch nicht funktionstüchtig. Das ganze soll deswegen auch nur als kleiner Ein- und Ausblick auf Terragen "Classic" dienen.

Animationsmöglichkeiten
Animation

Kameraoptionen
Kamera

Wolkenoptionen
Wolken

Wolkenoptionen
Wolken

Exportoptionen
Export

Exportoptionen
Export

Optionen für separates Rendering
Separates Rendering

 

Hacking the CASIO CFX 9850GB PLUS-G

RAM-Hacking

An jeder Ecke im Internet findet man (vorausgesetzt, dass man wirklich danach sucht) Tipps und Tricks, wie man mit Hilfe eines Computers, Link-Kabels und einfachen Texteditors die tollsten Sachen mit seinem CFX anstellen kann: Den Speicher nach 'System'-Variablen durchforsten und diese dann ändern; Assembler-Programme superschnell laufen lassen und und und...

Nirgendwo findet man allerdings Möglichkeiten, im RAM des Rechners herumzufuhrwerken, OHNE ein Kabel zu benutzen. (Casio - Kabel sind teuer und nicht jeder ist in der Lage, sich aus alten Platinen und Klingeldraht 'mal eben' einen eigenen Adapter zu löten)

Deswegen habe ich intensiv nach 'Geheimtürchen' in den Innereien des CFX9850 gesucht und bin in zahlreichen Foren und ähnlichem auch fündig geworden.

Zuerst einmal:   A C H T U N G ! ! !   Die hier vorgestellten Kniffe können - und werden auch fast immer - zum vollständigen Reset des Taschenrechnerspeichers führen! Das heißt: Programme weg, Bildchen weg (PIC-Memory), Tabellen weg - ALLES weg! Im Gegenzug gibt es dann viel freien Speicherplatz. icon_wink.gif Also: Falls ihr wichtige, einzigartige oder zeitaufwändige Dinge mit euerm Taschenrechner gemacht habt: Unbedingt Daten sichern. (Vielleicht kennt ihr ja Jemanden mit Kabel?)

Punkt zwei: Mir ist zwar kein solcher Fall bekannt, vielleicht ist es auch etwas übertrieben, aber: Rechnet bei den folgenden Tipps ständig damit, das euer lieber TR mit dem nächsten Tastendruck ausgeht und für immer aus bleibt! Ich möchte keine Mail bekommen, wo dann steht 'Du hast meinen Taschenrechner kaputt gemacht!'. Das wart ihr nämlich auf jeden Fall selbst.

Genug der Vorrede. Entscheidet selbst, ob ihr weiterlesen wollt oder nicht.

Wir starten gemächlich:

Der Test-Modus (die 'Ollen Kamellen' des TR-Hackens)

  1. TR ausschalten
  2. [a/b/c] [F6] und [AC/ON] gleichzeitig drücken. - Der Test-Mode startet
  3. nun kann man mit
    • Cnt  - den Kontrast überprüfen,
    • LCD - durch ein paar lustige Farbspielereien den Bildschirm testen,
    • Key  - prüfen, ob alle Tasten funktionieren, - (lässt sich zum Partyspaß ausbauen...)
    • DET - nichts wirklich produktives anfangen, (irgendwas mit der Stromversorgung)
    • TRS - überprüfen, ob und vor allem wie die Schnittstelle funktioniert.
    • ROM & RAM - ROM & RAM testen lassen, (toll)
    • RST - das Drücken des umseitig liegenden Reset (P) - Knopfes sparen und den Testmodus abbrechen.

Der RAM-Spion (einzeilige Variante)

  1. TR anschalten
  2. Im Dyna-Modus die Funktion 'Y1 (bzw Y2,Y3...) = A' hinzufügen
  3. [EXE] drücken
  4. [F2] drücken (für RANGe)
  5. als 'Start'-Wert eine große Zahl (am besten '9.e+13' oder größer) eingeben
  6. als End und Pitch jeweils eine gleiche Zahl nehmen (z.B. '1')
  7. noch zweimal [EXE] drücken, bis 'Ma ERROR' erscheint
  8. [AC/on] drücken
  9. [MENU] drücken
  10. zu 'LIST' wechseln (z.B. mit [4])
  11. [F1] drücken ('SRT-A')
  12. einen unsinnigen Wert, wie '(' oder 'sin' oder... eingeben
  13. [EXE] --> 'Syn ERROR'
  14. Pfeiltasten [<--] oder [-->] drücken fertig!

Jetz könnt ihr durch den gesamten Arbeitsspeicher scrollen und sogar passwortgeschützte Programme ansehen.

Ihr könnt auch Zeichen, Funktionsnamen und Zahlen eintippen. Die werden direkt ins RAM geschrieben und sorgen oft dafür, dass die Listendarstellung lustig verformt wird. Oder dass der TR abstürzt. Kein Problem - Reset-Knopf auf der Rückseite mit einer Kulispitze drücken und ihr habt einen 'fabrikneuen' Taschenrechner. (Zumindest von 'innen')

Der RAM-Spion deluxe (mehrzeilige Variante)

  1. Taschenrechner resetten (meistens nötig)
  2. folgende Matritzen erstellen:
    Mat A mit einer Dimension von 1x1
    Mat B mit 2x1
    Mat C (1x2)
    Mat D (2x2)
    Mat E (64x32)
  3. Im GRAPH-Menü nun 'Y1 = X' als Funktion eingeben
  4. ein Programm erstellen, (beliebiger Name) in dem auschließlich der Befehl DrawDyna steht
    Anleitung: ([SHIFT]+[VARS](PRGM) dann [F6] und schließlich [F2](DISP) und dann [F3](Dyna))
  5. das Programm nun ausführen.
    Es dürfte eigentlich nicht gehen - es geht aber!
  6. wenn es dann endlich 'Y1=X' anzeigt, [AC/on] drücken
  7. nun auf den Links- oder Rechtspfeil drücken
    der Editor ist nun wieder aktiv, zeigt aber als Programmname '1010101010' an.
  8. jetzt den Cursor ein paar Mal nach links und dann nach oben bewegen
    Tata: das RAM (manchmal stockt die Anzeige etwas - wenn es SEHR LANGE nicht weitergeht, wieder versuchen, nach rechts und unten zu scrollen...)
  9. Möchte man jetzt eine hübsche 128x128-Matrix, muss man folgendermaßen vorgehen:

    1. 9.1. den text 'ppfppfff' suchen (recht weit oben!)
    2. 9.2. die letzten beiden 'ff's durch 'Pol(Pol('

        (das entspricht Zeichen für 2xWert '128' und ist zu finden unter [OPTN]-[F6]-[F5](ANGL)-[F6]-[F1]).

    Fertig! MatA dürfte nun 128x128 groß sein. Nun bloß nicht mehr daran herumspielen! (Anstatt 'Pol(' kann man auch andere Zeichen benutzen. Die Ergebnismatrix A hat dann aber natürlich eine andere Größe...)

Die 0te Dimension einer Matrix (einfach und genial)

  1. TR Anschalten
  2. ins Matrix-Menü wechseln
  3. in eine Leere (None-) Matrix - zum Beipiel A - für die "X-Dimension" einen Wert zwischen 12 und 255 eingeben
  4. mit [EXE] die Eingabe bestätigen, nun aber ohne weitere Eingabe über [MENU] in den RUN-Modus wechseln
  5. [OPTN]-[F2](MAT)-[F6]-[F3](Fill) drücken
  6. eine beliebige Zahl und anschließend ein (richtiges) Komma eingeben
  7. wieder [F6] und dann [F1](Mat) drücken und den Buchstaben der Matrix (aus Schritt 3) eingeben

    die Zeile sieht nun zum Beispiel folgendermaßen aus:

    Fill(77,Mat B

  8. mit [EXE] die Zeile ausführen

"Ergebnisse" oder "Was nun?"

Oft stürzt während dieser Prozedur das Taschenrechnerbetriebssystem ab. Dann betätigt man einfach den Reset-Knopf auf der Rückseite. Man wird gar nicht mehr gefragt, ob man den Speicher löschen will, oder nicht. Es heißt gleich "MEMORY CLEARED".

Hat man aber Glück, so gelangt man nach einigen [AC/on] - Eingaben und Pfeiltastenbetätigungen über den [MENU] - Knopf ins Hauptmenü und kann dort - nun ja - zumindest einige Überraschungen erleben. (64KB freier Hauptspeicher - wenn auch nicht nutzbar, veränderte Menügrafiken ...)

Hier noch eine Tabelle günstiger Kombinationen:

 

Dimension Matrix Füllzahl Bemerkung
 33  A  33  
 133  A  133  
 12  A  12  
 30  A  30  
 13  B  13  
 34  A  egal  Füllzahl ist dann in jedem Eingabefeld im TVM - Menü sichtbar
 78  A  87  
 77  A  7  
 111  A  4*Pi  
 77  C  987  
 40  A  70.4  
 24  A  24000  
 24  B  48000  
 24  X  48000  
 60  A  60  

 

Jugend forscht 2003

Formeln und Bilder aus der Arbeit

Beim diesjährigen Regionalwettbewerb von Jugend forscht habe ich zusammen mit Andrej Machno eine Arbeit zur Chaosphysik über "Nichtlineare rückgekoppelte Systeme" präsentiert. Damit belegten wir den 2. Platz im Bereich Physik und bekamen sogar noch einen Sonderpreis in Form eines Jahresabbonements der "Bild der Wissenschaft"!

Im ersten Teil der Arbeit haben wir uns mit den chaotischen Aspekten der Populationsdynamik beschäftigt. Bei welcher Zahl Nachkommen einer Tierart lässt sich die Populationsgröße für das nächste Jahr noch gut voraussagen? Im zweiten Teil haben wir einen Schwingkreis betrachtet, in dem statt einer Spule eine Diode eingebaut ist. Die Diode hat eine nichtlineare Induktivität. Bei bestimmten Parametern des Schwinkgreises wird aus der Kennlinie der Diode im Phasenraum ein merkwürdiges Gebilde... Beide Schwerpunkte nähern sich der Thematik des deterministischen Chaos von unterschiedlichen Seiten, offenbaren dabei jedoch einige Gemeinsamkeiten.

Für den ersten Teil habe ich mit DarkBasic ein Simulationsprogramm geschrieben, mit dem ein so genanntes Feigenbaum-Senario der Verhulstschen Populationsdynamik interaktiv darstellbar ist. Der Quelltext ist unten angehängt. Eine ausführlichere Version (mit Kommentaren) kann hier heruntergeladen werden.

REM * Title  : Feigenbaumszenario REM * Author : Thomas Efer REM * Date   : 15. 12. 2002 New: ENABLE Escapekey SET DISPLAY MODE 800,600,16 HIDE MOUSE 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 " " 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!]" SHOW MOUSE SUSPEND FOR MOUSE 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 SYNC RATE 0 CLS Reset: Amin# = 1 Amax# = 4 Imax# = 1 Imin# = 0 AminALT# =Amin#:AmaxALT#=Amax#:IminALT#=Imin#:ImaxALT#=Imax# Start: SYNC OFF HIDE MOUSE 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..." SYNC ON 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) A# = Amin# FOR Aakt = 1 TO SCREEN WIDTH()  A# = A# + ((Amax# - Amin#) / SCREEN WIDTH())  Ialt# = 0  FOR Iakt = 2 TO Ianz + 2   Ialt# = Ialt# + (1.0 / (Ianz + 2))   I# = Ialt#   FOR n = 1 TO nmax    J# = I#    I# = A# * I# - A# * I# * I#   NEXT n  DOT Aakt , (Imax# - I#) * SCREEN Height() / (Imax# - Imin#)  IF Janz = 1 AND nmax > 2 THEN DOT Aakt , (Imax# - J#) * SCREEN Height() / (Imax# - Imin#)  NEXT Iakt NEXT Aakt SYNC OFF SHOW MOUSE WHILE mouseclick() = 0  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  IF downkey() = 1 THEN GOTO New  IF upkey() = 1   AminALT# =Amin#:AmaxALT#=Amax#:IminALT#=Imin#:ImaxALT#=Imax#   GOTO Reset  ENDIF  IF rightkey() = 1   HIDE MOUSE   SAVE BITMAP "Feige.bmp"   SHOW MOUSE  ENDIF  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 ENDWHILE AminALT# =Amin#:AmaxALT#=Amax#:IminALT#=Imin#:ImaxALT#=Imax# SUSPEND FOR MOUSE 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# SUSPEND FOR MOUSE 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# 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 GOTO Start

Galerie

Picasa Web Albums DeviantART

Kategorien

Artikel-Feeds

RSS-Feed Atom-Feed

Aufrufstatistik

1
48
540001

Werbung

Das Schwarze BRett im Internet: Kostenlose Kleinanzeigen von Studenten für Studenten!

17. Dezember 2017