Forum: Mikrocontroller und Digitale Elektronik Suche LCD Funktion für Kreissegmente (Pieslice)


von Holger K. (holgerkraehe)


Lesenswert?

Hallo zusammen

Ich suche eine LCD Funktion, welche mir mittels SetPixel ein 
Kreissegment mit definiertem Start und Stop Winkel sowie Radius 
zeichnet.

Kennt jemand eine effiziente Routine?
Wie das in Mathe geht ist mir klar, aber ob das die effizienteste 
Methode ist weiss ich nicht. Zudem muss man das Rad ja nicht immer neu 
Programmieren :)

Danke schonmal

von Karl M. (Gast)


Lesenswert?

Hallo,

kennst Du schon den "Bresenham-Algorithmus"?

https://de.wikipedia.org/wiki/Bresenham-Algorithmus

Dieser könnte auf deine Anforderung angepasst werden.

von Holger K. (holgerkraehe)


Lesenswert?

Karl M. schrieb:
> Hallo,
>
> kennst Du schon den "Bresenham-Algorithmus"?
>
> https://de.wikipedia.org/wiki/Bresenham-Algorithmus
>
> Dieser könnte auf deine Anforderung angepasst werden.

Danke für deinen Input.
Könnte eventuell angepasst werden. Ich weiss nur noch nicht wie.

Falls also jemand noch eine Funktion aus einer Grafik Library kennt, 
wäre ich sehr froh darüber.

Danke!

von Pete K. (pete77)


Lesenswert?

Hast Du in dem Artikel den Abschnitt "Kreisvariante des Algorithmus" 
gelesen? Da ist auch Beispiel-Code.

: Bearbeitet durch User
von Holger K. (holgerkraehe)


Lesenswert?

Pete K. schrieb:
> Hast Du in dem Artikel den Abschnitt "Kreisvariante des
> Algorithmus"
> gelesen? Da ist auch Beispiel-Code.

Ja hab ich. Dabei handelt es sich jedoch um die aussenlinie.

Ich möchte das Segment gefüllt haben.
Wenn ich nun mehrere solcher Aussenlinien mit unterschiedlichen Radien 
zeichne, kann es ereinzelt zu fehlenden Pixeln aufgrund der Rundung 
kommen.

Deshalb ist diese variante nicht geeignet in der dortigen Form.

von Eric B. (beric)


Lesenswert?

Holger K. schrieb:
> Deshalb ist diese variante nicht geeignet in der dortigen Form.

Dann benutze die graue Masse zwischen deinen Ohren und denke dir eine 
Variante aus die funktionieren könnte.
(Hint:horizontale/vertikale Striche ab Y-Achse/X-Achse bis zur 
Aussenlinie)

von spess53 (Gast)


Lesenswert?

Hi

>Dann benutze die graue Masse zwischen deinen Ohren und denke dir eine
>Variante aus die funktionieren könnte.

Z.B. https://de.wikipedia.org/wiki/Floodfill

MfG Spess

von Holger K. (holgerkraehe)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Dann benutze die graue Masse zwischen deinen Ohren und denke dir eine
>>Variante aus die funktionieren könnte.
>
> Z.B. https://de.wikipedia.org/wiki/Floodfill
>
> MfG Spess

Vielen Dank für diesen Input!

Ich denke das wäre die beste lösung!

Ich habe hier den ScanLineFloodFill gefunden:
http://lodev.org/cgtutor/floodfill.html#4-Way_Method_With_Stack


Dieser verwendet einen Stack. Leider gibt es einen Fehler bei diesem 
Code.
er sagt int &x, sowie int &y sei ein Syntax error.

Wie müsste man dies richtig schreiben?
Soll hier eine Addresse übergeben werden?

1
bool pop(int
2
&x, int &y) 
3
{ 
4
    if(stackPointer > 0) 
5
    { 
6
        int p = stack[stackPointer]; 
7
        x = p / h; 
8
        y = p % h; 
9
        stackPointer--; 
10
        return 1; 
11
    }     
12
    else 
13
    { 
14
        return 0; 
15
    }    
16
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Holger K. schrieb:
> er sagt int &x, sowie int &y sei ein Syntax error.

Wer auch immer "er" ist, die Schreibweise deutet auf eine Referenz 
hin, das ist ein in C++, aber nicht in C existierendes Konstrukt.

Macht nichts, in C kann man stattdessen Pointer verwenden, und wie das 
geht, steht in Deinem C-Buch drin.

von Holger K. (holgerkraehe)


Lesenswert?

Rufus Τ. F. schrieb:
> Holger K. schrieb:
>> er sagt int &x, sowie int &y sei ein Syntax error.
>
> Wer auch immer "er" ist, die Schreibweise deutet auf eine Referenz
> hin, das ist ein in C++, aber nicht in C existierendes Konstrukt.
>
> Macht nichts, in C kann man stattdessen Pointer verwenden, und wie das
> geht, steht in Deinem C-Buch drin.

Mit "er" ist der Compiler gemeint.

Ja dann mach ich statdessen uint16_t *x und uint16_t *y

Danke!

von spess53 (Gast)


Lesenswert?

Hi

>Ja dann mach ich statdessen uint16_t *x und uint16_t *y

Wie groß ist denn dein Display?

MfG Spess

von Holger K. (holgerkraehe)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Ja dann mach ich statdessen uint16_t *x und uint16_t *y
>
> Wie groß ist denn dein Display?
>
> MfG Spess

320 x 240 pixel

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.