![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' ---------------------------------------------------------------------------- ' DEMO für schnelles Bit-Feld: Kreise zeichnen mit Bresenham-Algorithmus ' In OCBASIC 1.11a für Open-Maxi von Dietmar Harlos am 30. 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,radius,f,ddF_x,ddF_y,xc,yc INT 'Variablen für Bresenham-Algorithmus ' ---------------------------------------------------------------------------- FOR ix=4 TO 24 STEP 5 circle maxx/2,maxy/2,ix 'Kreis zeichnen NEXT ix 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 Zeichnen von Kreisen PROCEDURE circle(x0, y0, radius) f = 1 - radius ddF_x = 0 ddF_y = -2 * radius xc = 0 yc = radius pset x0, y0 + radius pset x0, y0 - radius pset x0 + radius, y0 pset x0 - radius, y0 WHILE (xc < yc) IF f >= 0 THEN SUB yc,1 ADD ddF_y,2 ADD f,ddF_y END IF ADD xc,1 ADD ddF_x,2 ADD f,ddF_x + 1 pset x0 + xc, y0 + yc pset x0 - xc, y0 + yc pset x0 + xc, y0 - yc pset x0 - xc, y0 - yc pset x0 + yc, y0 + xc pset x0 - yc, y0 + xc pset x0 + yc, y0 - xc pset x0 - yc, y0 - xc WEND 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: Kreise zeichnen als ZIP-Archiv Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |