Kreis mit Bresenhan Linienstärke 2

Gast #1295983
Lesenswert?

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
}
#1296033
Lesenswert?

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 #1296162
Lesenswert?

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

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