Darstellung einer vertikalen Linie

Gast #5942028
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
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 */
    }
}
Gast #5942050
GLCD_pixel(x,y,status);
Musst du ersetzen mit deiner eigenen Routine, da ich es bei mir im RAM 
setzte und danach den inhalt des RAM's auf dem Display ausgebe.
#5942061
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
Gast #5942086
Sascha W. schrieb:
> Wenn du wie oben mit ...,1) aufrufst, dann entsteht natürlich keine
> Linie.

Bist du dabei sicher? Bei Plot_point ist y_dot Eingabe erforderlich. 
Dabei ist einfach x,y,0 eine unsichtbare Linie. Ob ich dort 1 oder 4 
schreibe ist egal.
#5942110
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
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
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

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.