mikrocontroller.net

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


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
void DrawCircle(unsigned char x0, unsigned char y0, unsigned char radius)
{
    short f = 1 - radius;
    short ddF_x = 0;
    short ddF_y = -2 * radius;
    short x = 0;
    short y = radius;

    LCDSetDot(x0, y0 + radius,1);
    LCDSetDot(x0, y0 - radius,1);
    LCDSetDot(x0 + radius, y0,1);
    LCDSetDot(x0 - radius, y0,1);

    while(x < y)
    {
      if(f >= 0)
      {
        y--;
        ddF_y += 2;
        f += ddF_y;
      }
      x++;
      ddF_x += 2;
      f += ddF_x + 1;

      LCDSetDot(x0 + x, y0 + y,1);
      LCDSetDot(x0 - x, y0 + y,1);
      LCDSetDot(x0 + x, y0 - y,1);
      LCDSetDot(x0 - x, y0 - y,1);
      LCDSetDot(x0 + y, y0 + x,1);
      LCDSetDot(x0 - y, y0 + x,1);
      LCDSetDot(x0 + y, y0 - x,1);
      LCDSetDot(x0 - y, y0 - x,1);
    }
}

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LCDSetDot 2x2 Pixel setzen lassen anstatt nur einen?

JOhann

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: krase (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 
:-)
### 
   # 
    # 
    # 

Zusätzlich weden dann die @-Pixel gesetzt:
###@ 
@@@#@
   @#@
    #@
    @@

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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.