Forum: Compiler & IDEs Kreis mit Bresenhan Linienstärke 2


von Michael (Gast)


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
}

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

LCDSetDot 2x2 Pixel setzen lassen anstatt nur einen?

JOhann

von Klaus W. (mfgkw)


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.

von Simon K. (simon) Benutzerseite


Lesenswert?

http://www.google.de/search?q=bresenham+thick+line

Als Suchvorschlag. Ich sehe da in den Results auch was von codeguru, 
könnte interessant sein.

Oder die Links am Anfang hier:
http://homepages.enterprise.net/murphy/thickline/index.html

von krase (Gast)


Lesenswert?


von Johann L. (gjlayde) Benutzerseite


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

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.