Forum: Mikrocontroller und Digitale Elektronik Bresenham Kreisbewegung 2. Oktant


von Keine A. (karabennemsi)


Lesenswert?

Ich nutze jetzt zur Ansteuerung von zwei Schrittmotoren um einen Kreis 
zu fahren den Bresenham Algorithmus.

Der Psudocode für den ersten Oktankt sieht folgendermaßen aus (von 
Wikipedia kopiert):
1
x = r
2
y = 0
3
fehler = r
4
5
WHILE y < x
6
   REM Schritt in schnelle Richtung
7
   dy = y*2+1 : REM bei Assembler-Implementierung *2 per Shift
8
   y = y+1
9
   fehler = fehler-dy
10
   IF fehler<0 THEN
11
      REM Schritt in langsame Richtung (hier negative x-Richtung)
12
      dx = 1-x*2 : REM bei Assembler-Implementierung *2 per Shift
13
      x = x-1
14
      fehler = fehler-dx
15
   END IF

Ich habe mir jetzt gedacht und auch so umgesetzt, dass ich ja den 
zweiten Oktanten gleich weiterberechnen kann (muss da ja auch keine 
Bewegungsrichtung ändern), bis x <= 0 ist. Ich habe für diesen 2. 
Oktanten den Algorithmus etwas angepasst. Ich habe noch nicht geprüft, 
wie genau der Kreis ist.

Ist mein Algorithmus für den 2. Oktant so korrekt?
1
WHILE x > 0
2
   REM Schritt in schnelle Richtung
3
   x = x-1 : Hier muss erst x-1 vor dx berechnet werden, sonst wird ein Schritt zu viel gemacht
4
   dx = 1-x*2
5
   fehler = fehler-dx
6
7
   IF fehler>0 THEN
8
      REM Schritt in langsame Richtung
9
      dy = y*2+1 
10
      y = y+1
11
      fehler = fehler-dy
12
   END IF

: Bearbeitet durch User
von Xanthippos (xanthippos)


Lesenswert?

Ist dir https://github.com/grbl/grbl aufgefallen?

Die zerlegen das Problem in 3 Teile. Zuerst setzen die alle Arten von 
Bögen aus kleinen Geraden zusammen. Dann berechnen sie aus den 
Steigungen die maximalen Geschwindigkeiten und Beschleunigungen. Zum 
Schluss benutzen sie nur mehr den Bresenham Algorithmus für Geraden.

Alles in einem Schritt  berechnen dürfte wohl zu komplex werden.

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Keine A. schrieb:
> Der Psudocode für den ersten Oktankt

Quadrant, da du offensichtlich in 2D rechnest, nicht 3D.

> Ist mein Algorithmus für den 2. Oktant so korrekt?

Weiß ich nicht, keine Lust mir den anzusehen. Aber ich kann dir sagen 
wie man das schon vor ewigen Zeiten gemacht hat: Mit einer 
entsprechenden Koordinatentransformation der Ergebnisse des 
Bresenham-Algrotithmus.

II. Quadrant: x' = -x; y' = y
III. Quadrant: x' = -x; y' = -y
IV. Quadrant: x' = x; y' = -y

und der triviale Fall:

I. Quadrant: x' = x; y' = y

von Mario M. (thelonging)


Lesenswert?

Er meint schon Oktant, weil die sich innerhalb eines Quadranten 
spiegelbildlich verhalten.

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Xanthippos schrieb:
> Alles in einem Schritt  berechnen dürfte wohl zu komplex werden.

Ähm, nein. Bresenhams Algorithmus wird seit ewigen Zeiten (80 Jahre) für 
das Zeichnen (ursprünglich Plotten) von Linien und Kreisen verwendete. 
Im Prinzip hat der TS den schon hin geschrieben. Es fehlt nur noch die 
Koordinatentransformation.

von Keine A. (karabennemsi)


Lesenswert?

Hannes J. schrieb:
> Ähm, nein. Bresenhams Algorithmus wird seit ewigen Zeiten (80 Jahre) für
> das Zeichnen (ursprünglich Plotten) von Linien und Kreisen verwendete.
> Im Prinzip hat der TS den schon hin geschrieben. Es fehlt nur noch die
> Koordinatentransformation.

Ich zeichne aber nicht, sondern bewege Schrittmotoren. Und da benötige 
ich eine kontinuierliche Kreisbewegung.

Und wie ich mit der Koordinatentransformation diese Kreisbewegung 
geschlossen forsetzen kann sehe ich nicht, da die 
Koordinatentransformation z.B. beim 2. Oktant aus entgegengesetzer 
Richtung kommt.

: Bearbeitet durch User
von Uwe D. (monkye)


Lesenswert?

Also ich hatte das Grundprinzip so verstanden, dass beim Wechsel des 
Oktanten, so wie im Beitrag 
Beitrag "Re: Bresenham Kreisbewegung 2. Oktant" von Hannes 
angemerkt, das Vorzeichen zu beachten ist und dazu tauschen X und Y 
die Rollen, weil sich dann X (negativ) schneller bewegt als Y.

von Keine A. (karabennemsi)


Lesenswert?

Uwe D. schrieb:
> Also ich hatte das Grundprinzip so verstanden, dass beim Wechsel des
> Oktanten, so wie im Beitrag
> Beitrag "Re: Bresenham Kreisbewegung 2. Oktant" von Hannes
> angemerkt, das Vorzeichen zu beachten ist und dazu tauschen X und Y
> die Rollen, weil sich dann X (negativ) schneller bewegt als Y.

Wenn du eine Kreisbewegung mit zwei Schrittmotoren machst und in den 2. 
Oktanten wechselst, kannst du den Algorithmus nicht einfach nochmal 
durchlaufen.

Du müsstest den Algorithmus rückwärts laufen lassen. Oder eben 
fortführen, was ich mache.

von Xanthippos (xanthippos)


Lesenswert?

> Ich zeichne aber nicht, sondern bewege Schrittmotoren. Und da benötige
> ich eine kontinuierliche Kreisbewegung.

Das ist nicht so einfach. Du musst rechtzeitig mit dem Abbremsen 
beginnen. Bevor die Stelle erreicht ist, an der einer der Motoren still 
steht. Und bei Übergängen zwischen Kreissegmenten und Geraden willst du 
nicht abbremsen.

Du benötigst keine kontinuierliche Kreisbewegung du benötigst zwei 
kontinuierliche, jitterfreie Beschleunigungen.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Beitrag "Re: Darstellung kreis oder kurve auf GLCD"
Da habe ich 2006 meinen Bresenham in AVR-Assembler gepostet.
Auch in Achtelkreise aufgeteilt.

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Es gibt den Bresenham auch erweitert für Ellipsen. Der Kreis ist davon 
ein Sonderfall. Leider kann ich dir keinen Code geben, ist bei mir schon 
30 Jahre her. Findet man bestimmt irgendwo.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Die Achtelkreise reichten jedenfalls für ein Smith-Diagramm
1
;*************************************************************************
2
;* Unterprogramm zur Ausgabe von einem bis acht Achtelkreissegmentpixeln
3
;* Übergabevariable X_Circ,Y_Circ,X_Cent,Y_Cent,Segmt  
4
;* Zählweise Segmente - Koordinaten(X/Y):
5
;* (239/127)  I~~~~~~~~~~~~~~~I (0/127)
6
;*            I   2 1         I
7
;*            I  3   0        I
8
;*            I  4   7        I
9
;*            I   5 6         I
10
;* (239/0)    I_______________I (0/0)
11
;*************************************************************************
12
Segm0:  
13
  sbrs  Segmt,0    ; Achtel 0 zeichnen ?
14
  rjmp  Segm1
15
  mov  X_Pix,X_Cent  ; Kreismittelpunkt X_Cent
16
  sub  X_Pix,Y_Circ  ; minus Y-Koordinate Y_Circ
17
  mov  Y_Pix,Y_Cent  ; Kreismittelpunkt Y_Cent
18
  add  Y_Pix,X_Circ  ; plus X-Koordinate X_Circ
19
  rcall  PutPix    ; Bildpunkt auf Display ausgeben
20
Segm1:  
21
u.s.w.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.