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 

 Ellipsen zeichnen Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 30.07.2018 22:00)
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: 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

Bisherige Antworten:

Re: Ellipsen zeichnen (von Joachim - 5.08.2018 19:29)