Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit übrigbehalten!


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Bresenham-Algorithmus Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 28.05.2018 19:21)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station
' ----------------------------------------------------------------------------
' 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

Bisherige Antworten:

Re: Bresenham-Algorithmus (von Joachim - 3.06.2018 0:01)
    Re: Bresenham-Algorithmus (von Dietmar - 3.06.2018 0:30)