Bresenham Kreisbewegung 2. Oktant

OP #7385905
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
#7385979
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.

#7386173
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

OP #7386230
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.

OP #7386485
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.

#7386515
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.

#7386530
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren