PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Freie Linie auf GLCD



C_Classic
14.04.2010, 16:00
Hey,
ich habe dieses LCD mit dem Treiber von Sebastian: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=43741&highlight=

Jetzt schreibe ich gerade eine Bibliothek für Befehle mit denen man Quadrate, Kreise, etc. zeichnen kann. Nun stehe ich vor dem Problem "Linie". Eine Vertikale/Horizontale Linie ist kein Problem, aber ich möchte (wie bei meinem GTR) einen Befehl wie DrawLine(x1,y1,x2,y2).
Wie kann ich die Punkte berechnen?

Hier ist einfach mal der Code für nen Kreis (geht verdammt schnell):

//Zeichnet einen Kreis
void DrawCircle(char r, char x, char y, char PixelState) {
char winkel;
for (winkel=0; winkel <= 360; winkel++) {
lcd_plot_pixel(x + sin(winkel)*r,y-cos(winkel)*r,PixelState);
}
}
Was meint ihr, soll ich die Lib wennse fertig ist veröffentlichen?

Danke,
C_Classic

sternst
14.04.2010, 17:51
Wie kann ich die Punkte berechnen?
Bresenham


Hier ist einfach mal der Code für nen Kreis (geht verdammt schnell):

//Zeichnet einen Kreis
void DrawCircle(char r, char x, char y, char PixelState) {
char winkel;
for (winkel=0; winkel <= 360; winkel++) {
lcd_plot_pixel(x + sin(winkel)*r,y-cos(winkel)*r,PixelState);
}
}Ich möchte dir ja nicht zu nahe treten, aber soll das "geht verdammt schnell" etwa ironisch gemeint sein? Denn das ist so ziemlich die langsamste Methode einen Kreis zu zeichnen, die man sich überhaupt vorstellen kann. Wenn man schon so rechenintensive Funktionen wie sin und cos verwendet, dann sollte man deren Ergebnisse zumindest mehrfach verwenden. Man muss nämlich effektiv nur 1/8 des Kreises berechnen, den Rest kann man auch durch simples Spiegeln der Ergebnisse bekommen.

Davon abgesehen funktioniert der Code so (mit winkel als char) mit Sicherheit gar nicht.

C_Classic
14.04.2010, 19:57
Naja... War eigentlich Net ironisch gemeint, aber du hast natürlich recht. Ich hatte schon vermutet, dass die Methode Ansich langsam sein müsste, aber war dann vom Ergebnis überrascht, weil z.B. mein GTR dafür 3 sek braucht.
Werd die Funktion mal überarbeiten.
Gibt es eine andere Möglichkeit als sin/cos?

MfG
C_Classic

Del
14.04.2010, 20:01
Könntest die Werte aus einer Sinus/Cosinus Tabelle holen statt sie zu errechnen.
Außerdem hat sternst das mit dem 1/8 Kreis vorgeschlagen.

C_Classic
14.04.2010, 20:23
Ok danke für eure Antworten. Aber wie Kann ich denn nun eine solche Linie zeichnen? Werd mich dann mal morgen dranmachen...

sternst
14.04.2010, 20:45
Aber wie Kann ich denn nun eine solche Linie zeichnen????
Das habe ich doch beantwortet.

Felix G
15.04.2010, 00:13
Achja, der gute alte Bresenham-Algorithmus (http://de.wikipedia.org/wiki/Bresenham-Algorithmus)...

für einfache Linien gibt's kaum was Besseres, und er eignet sich mit ein paar kleinen Modifikationen auch zum Zeichnen von Kreisen (und das sehr viel schneller als deine einfache sin/cos Variante).

DarkBeast
15.04.2010, 12:51
jau ich verwende auch den Bresham

auf einem color tft mit ST7781 chip

musste mir aber leider die Routinen zum Zeichnen von Kreisen und Co. selber schreiben .

Hat jemand ne idee welchen algo Ich verwenden kann um die gezeichneten Graphiken auch noch auszufüllen ????

Axo *gg* benutze überigens AVR Atmel ATMega 32 Board mit TFT Touch Display, Kamera einfach mal in der großen Bucht danach suchen iss recht brauchbar.

C_Classic
15.04.2010, 17:57
Oh Entschuldigung - Ich hatte das Bresham ganz überlesen. Werds mir gleich mal anschauen.