![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' ---------------------------------------------------------------------------- ' DEMO für schnelles Bit-Feld: Linien zeichnen mit Bresenham-Algorithmus ' In OCBASIC 1.11a für Open-Maxi von Dietmar Harlos am 28. Mai 2018 ' ---------------------------------------------------------------------------- ' Der Bresenham-Algorithmus ist ein Algorithmus in der Computergrafik zum ' Zeichnen (Rastern) von Geraden oder Kreisen auf Rasteranzeigen. ' Beschreibung im Internet: ' https://de.wikipedia.org/wiki/Bresenham-Algorithmus ' Die Ausgaben dieses Programms müssen mit dem Terminalprogramm ' TERMINAL32.EXE mit einer Fenstergröße von 80 mal 50 Zeichen angeschaut ' werden. ' Leider wird dieses Programm sehr stark durch die langsame Serielle ' Schnittstelle ausgebremst. ' ---------------------------------------------------------------------------- INCLUDE "omax.def" 'Definitionen für die Open-Maxi ' ---------------------------------------------------------------------------- DEFINE bitarrayaddr &h02aa 'Startadresse des Bit-Feldes (über 10000 Elemente) DEFINE maxx 79 'Bildschirmgröße DEFINE maxy 48 DIM x,y,ix,iy BYTE 'einige Variablen DIM x0,y0,x1,y1,dx,dy,sx,sy,e1,e2 INT ' Variablen für Bresenham-Algorithmus ' ---------------------------------------------------------------------------- line 0,0,maxx,maxy 'Linien zeichnen line 0,maxy,maxx,0 FOR iy=0 TO maxy 'auf Terminal ausgeben FOR ix=0 TO maxx IF point(ix,iy) THEN PUT ASC("*") ELSE PUT ASC(" ") END IF NEXT ix NEXT iy End2Host=ON 'Nach Programmende in den Host-Modus END 'Programmende, Neustart mit der Enter-Taste ' ---------------------------------------------------------------------------- ' Bresenham-Algorithmus zum Linienzeichnen PROCEDURE line(x0, y0, x1, y1) dx = ABS(x1-x0) IF x0<x1 THEN sx=1 ELSE sx=-1 dy = -ABS(y1-y0) IF y0<y1 THEN sy=1 ELSE sy=-1 e1 = dx+dy WHILE TRUE pset x0,y0 if x0=x1 AND y0=y1 THEN GOTO line_break e2 = 2*e1 if e2>dy THEN ADD e1,dy : ADD x0,sx if e2<dx THEN ADD e1,dx : ADD y0,sy WEND #line_break RETURN END PROCEDURE ' ---------------------------------------------------------------------------- ' Punkt im Buffer abfragen FUNCTION point(x,y) IF x<0 OR x>maxx OR y<0 OR y>maxy THEN RETURN OFF RETURN bitarray_get(y*(maxx+1)+x) END FUNCTION ' Punkt im Buffer setzen PROCEDURE pset(x,y) IF x<0 OR x>maxx OR y<0 OR y>maxy THEN RETURN bitarray_set(y*(maxx+1)+x) RETURN END PROCEDURE ' Punkt im Buffer löschen PROCEDURE pclear(x,y) IF x<0 OR x>maxx OR y<0 OR y>maxy THEN RETURN bitarray_clear(y*(maxx+1)+x) RETURN END PROCEDURE ' ---------------------------------------------------------------------------- INCLUDE "bitarray.pro" 'INCLUDE-Datei für Bit-Feld-Routinen ' ---------------------------------------------------------------------------- INCLUDE "om_fw.pro" 'INCLUDE-Datei für Firmwareroutinen ' --------------------------------------------------------------------------- Passender Link: Bresenham-Algorithmus als ZIP-Archiv Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |