Darstellung einer vertikalen Linie

Gast #5942028
Lesenswert?

Hallo
sorry, bin immer noch am selben Thema, Darstellung einer senkrechten 
Linie auf einem EA DOG XL160.
Habe die Darstellung damit aufgerufen:
1
LCD_Plot_Vline(35, 15, 1);        
2
LCD_Plot_Vline(35, 16, 1);
Die Ausführung erfolgt durch
1
void LCD_Plot_Vline(uint8_t x, uint8_t y, uint8_t h)    // x Start w, y start s, h Länge  ori
2
  {
3
  uint8_t yp;
4
  for(yp = y; yp <= y + h - 1; yp++)
5
    {
6
    LCD_Plot_Point(x, yp, 1);       
7
    }
8
  }
Funktion:
Der Startpunkt wird duch x und y festgelegt, h gibt die Länge des 
Striches an. Die for Schleife wird so oft durchlaufen wie von h 
angegeben. Dadurcj wird yp hochgezählt.
Beim XL160 erfolgt die Darstellung aber nich Pixel für Pixel sonder 
immer 4 Bit weise (wenn ich es richtig verstanden habe).
Wie kann ich das richtig darstellen so das sich Linie bildet?
LG Heinz
Gast #5942047
Lesenswert?

Hallo Heinz!

Vielleicht hilft dir das weiter.

// Zeichnet eine X-belibige Linie
// Kompakte Variante des Bresenham-Algorithmus
// von der Wikipedia Seite  Bresenham-Algorithmus

void GLCD_line (uint8_t x, uint8_t y, uint8_t x1, uint8_t y1, uint8_t 
status)
{

    int dx =  abs(x1-x), sx = x<x1 ? 1 : -1;
    int dy = -abs(y1-y), sy = y<y1 ? 1 : -1;
    int err = dx+dy, e2; /* error value e_xy */

    for(;;)
    {  /* loop */
        GLCD_pixel(x,y,status);
        if (x == x1 && y == y1) break;
        e2 = 2*err;
        if (e2 > dy) { err += dy; x += sx; } /* e_xy+e_x > 0 */
        if (e2 < dx) { err += dx; y += sy; } /* e_xy+e_y < 0 */
    }
}
#5942061
Lesenswert?

Heinz schrieb:
> Beim XL160 erfolgt die Darstellung aber nich Pixel für Pixel sonder
> immer 4 Bit weise (wenn ich es richtig verstanden habe).
> Wie kann ich das richtig darstellen so das sich Linie bildet?
die Speicherorganisation ist vollkommen egal da du Plot_Point aufrufst, 
der genau einen Punkt setzt. Voraussetzung Plot_Point macht was es soll. 
Das man das Zeichen von Linien u.U. optimieren kann wenn man die 
Organisation des Displays berücksichtigt ist noch was anderes.

Wenn du wie oben mit ...,1) aufrufst, dann entsteht natürlich keine 
Linie.

Sascha
#5942110
Lesenswert?

Heinz schrieb:
> Sascha W. schrieb:
>> Wenn du wie oben mit ...,1) aufrufst, dann entsteht natürlich keine
>> Linie.
>
> Bist du dabei sicher?
na es wird halt 1 Pixel gezeichnet, das ist noch keine Linie
> Bei Plot_point ist y_dot Eingabe erforderlich.
ist das der 3. Parameter von Plot_Point? Ist mit vorhin gar nicht 
aufgefallen das da 3 Werte sind. Ist das aus einer LIB? Dann sollte das 
doch irgendwie beschrieben sein.
> Dabei ist einfach x,y,0 eine unsichtbare Linie.
> Ob ich dort 1 oder 4 schreibe ist egal.
und was wird ausgegeben?

Sascha
#5942134
Lesenswert?

Heinz schrieb:
> Beim XL160 erfolgt die Darstellung aber nich Pixel für Pixel sonder
> immer 4 Bit weise (wenn ich es richtig verstanden habe).
> Wie kann ich das richtig darstellen so das sich Linie bildet?

Das wurde Dir schon mehrfach erklärt:

a. Du liest die entprechenden 4 Bit - veränderst diese nach Deinem 
Wunsch - und schreibst sie zurück

b. Du legst ein Abbild des "Grafik-Speichers" ins RAM - setzt und löscht 
dort Punkte - und schreibst dann jeweils den gesamten "Grafik-Speicher" 
(oder auch nur geänderte Teile) auf den Speicher des Displays

c. Du arbeitest mit der ug8lib - die kann das
Gast #5942539
Lesenswert?

Hallo Johann
danke für den Tip. Habe jetzt die Sache in den Griff bekommen. Mit dem 
Graphik Speicher klappt es sehr gut. Hat noch sehr schönen Nebeneffekt, 
die Linien können sich überkreuzen und werden an den Schnittpunkten 
nicht gelöscht.
Danke

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