Kreis mit Bresenhan Linienstärke 2

Gast #1295983
Hallo,

hat jemand ein Lösungsvorschlag zum zeichnen eines Kreises mit doppelter 
Linienstärke?

Einfach einen Kreis mit Radius 50 und 51 ergibt Löcher zwischen den 
Kreisen.
1
void DrawCircle(unsigned char x0, unsigned char y0, unsigned char radius)
2
{
3
    short f = 1 - radius;
4
    short ddF_x = 0;
5
    short ddF_y = -2 * radius;
6
    short x = 0;
7
    short y = radius;
8

9
    LCDSetDot(x0, y0 + radius,1);
10
    LCDSetDot(x0, y0 - radius,1);
11
    LCDSetDot(x0 + radius, y0,1);
12
    LCDSetDot(x0 - radius, y0,1);
13

14
    while(x < y)
15
    {
16
      if(f >= 0)
17
      {
18
        y--;
19
        ddF_y += 2;
20
        f += ddF_y;
21
      }
22
      x++;
23
      ddF_x += 2;
24
      f += ddF_x + 1;
25

26
      LCDSetDot(x0 + x, y0 + y,1);
27
      LCDSetDot(x0 - x, y0 + y,1);
28
      LCDSetDot(x0 + x, y0 - y,1);
29
      LCDSetDot(x0 - x, y0 - y,1);
30
      LCDSetDot(x0 + y, y0 + x,1);
31
      LCDSetDot(x0 - y, y0 + x,1);
32
      LCDSetDot(x0 + y, y0 - x,1);
33
      LCDSetDot(x0 - y, y0 - x,1);
34
    }
35
}
Das wird aber wahrscheinlich etwas eckig in den Schrägen.
Der Bresenham enthält ja implizit den Fehler, der dadurch
entsteht, daß die Pixel nicht genau auf den Linien liegen
und verteilt den Fehler etwas über aufeinanderfolgende Punkte.
Reizvoll wäre es, z.B. an den Stellen nach außen um ein Pixel
anzubauen, wenn die Pixel der Liniendicke 1 eher zu weit innen
liegen und umgekehrt.
Das sollte schönere Kreise geben. vermute ich.

Oder doch mit einem "Pinsel" malen wie mit deinem 2x2, aber dann
zumindest für dickere Linien kein Rechteck mehr nehmen, sondern
einen näherungsweise runden Pinsel.
Bei dickeren Linien wird das dann aber gleich uneffizient, weil
viele Pixel mehrfach gemalt werden.
Persönliche Seite
Klaus Wachtler schrieb:
> Das wird aber wahrscheinlich etwas eckig in den Schrägen.

Bresenhan wird sowieso eckig, weil er auf ne pixliges Medium zeichnet 
:-)
1
### 
2
   # 
3
    # 
4
    #

Zusätzlich weden dann die @-Pixel gesetzt:
1
###@ 
2
@@@#@
3
   @#@
4
    #@
5
    @@

Besser geht' nicht. Von Anti-Aliasing war nix gefordert.

> Der Bresenham enthält ja implizit den Fehler, der dadurch
> entsteht, daß die Pixel nicht genau auf den Linien liegen
> und verteilt den Fehler etwas über aufeinanderfolgende Punkte.

Ändert hier nix, die die Punkte immer noch im 1-Pixel-Raster gezeichnet 
werden.

Im Endeffekt entspricht das dem Zeichnen von 4 Kreisen, jeweils mit 
Versatz (0,0), (0,1), (1,0) und (1,1)

> Bei dickeren Linien wird das dann aber gleich uneffizient, weil
> viele Pixel mehrfach gemalt werden.

Ineffizient was die Laufzeit angeht, aber nicht, was den Aufwand in Code 
angeht :-)

Johann

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.