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 

 Kreise zeichnen Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 2.06.2018 19:16)
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: 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

Bisherige Antworten:

Re: Kreise zeichnen (von Joachim - 2.06.2018 20:45)