Forum: Mikrocontroller und Digitale Elektronik Darstellung einer vertikalen Linie


von Heinz (Gast)


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

von karadur (Gast)


Lesenswert?

Deine for-Schleife kann nicht laufen: (yp=y;yp<=y+0;...)

von karadur (Gast)


Lesenswert?

Vergiss den Beitrag. Noch nicht wach.

von norad (Gast)


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 */
    }
}

von norad (Gast)


Lesenswert?

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.

von Sascha W. (sascha-w)


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

von Heinz (Gast)


Lesenswert?

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.

von Heinz (Gast)


Lesenswert?

Denn Beitrag asu Wiki kenn ich auch, habe es damit auch getestet. Leider 
gleiches Ergebniss

von Sascha W. (sascha-w)


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

von Johann J. (johannjohanson)


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

von Heinz (Gast)


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

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.