![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' ============================================================================ ' DEMO für schnelles Bit-Feld: Ellipsen zeichnen mit Bresenham-Algorithmus ' In OCBASIC 1.12a für Open-Maxi von Dietmar Harlos am 30. Juli 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. ' Dieses Programm muß mit OCBASIC 1.12a kompiliert werden. Eine experimentelle ' Version dieses OCBASIC-Compilers befindet sich im ZIP-Archiv "Komfortable ' 32-Bit-Arithmetik auf der Open-Maxi" auf der OM-Infosite: ' http://om.dharlos.de/downloads/omax_calc32_v1_0.zip ' --- Definitionen für das System -------------------------------------------- INCLUDE "omax.def" 'Definitionen für die Open-Maxi OPTION 32BIT '32-Bit freischalten (ab OCBASIC Version 1.12) ' --- Definitionen des Anwenders --------------------------------------------- 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 xm,ym,a,b,dx,dy,a2,b2 INT 'Variablen für Bresenham-Algorithmus DIM e1,e2 LONG 'Variablen für Bresenham-Algorithmus ' --- System-Erweiterungen einbinden ----------------------------------------- INCLUDE "omax32.iia" '32-Bit-Erweiterung einbinden ' --- Das Hauptprogramm ------------------------------------------------------ #main URTok=ON '32-Bit-Erweiterung aktivieren FOR ix=5 TO 20 STEP 5 'Ellipsen zeichnen ellipse maxx/2,maxy/2,ix*15/10,ix 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 Ellipsen ' Die Fehlervariable muß den 3-fachen Wertebereich (Stellenanzahl, Bits) vom ' Radius (Halbachsen) aufweisen (etwa 64-bit oder Gleitkommazahl). PROCEDURE ellipse(xm, ym, a, b) dx = 0 dy = b a2 = a*a b2 = b*b e1 = b2-(2*b-1)*a2 REPEAT pset xm+dx, ym+dy ' I. Quadrant pset xm-dx, ym+dy ' II. Quadrant pset xm-dx, ym-dy ' III. Quadrant pset xm+dx, ym-dy ' IV. Quadrant e2 = 2*e1 if e2 < (2*dx+1)*b2 THEN ADD dx,1 : e1=e1+(2*dx+1)*b2 if e2 > -(2*dy-1)*a2 THEN SUB dy,1 : e1=e1-(2*dy-1)*a2 UNTIL dy < 0 WHILE dx < a ' fehlerhafter Abbruch bei flachen Ellipsen (b=1) ADD dx,1 pset xm+dx, ym ' Spitze der Ellipse vollenden pset xm-dx, ym 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: Ellipsen zeichnen als ZIP-Archiv Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |