mikrocontroller.net

Forum: Compiler & IDEs LED-Matrix Linefunktion


Autor: Mario Grafe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gemeinde,

ich habe mal ein kleines algorithmisches Problemchen:
Habe mir gerade eine LED-Matrix (12 Zeilen, 8 Spalten) gebastelt,
welche gemutiplext von PNP-Transi und ULN2803 angesteuert wird. Das
funktioniert auch wunderbar. Ich habe mir ein 8x12 Array angelegt was
Timergesteuert angezeigt wird.
Num habe ich mir in C einige Funktionen wie SetPixel und ClearPixel
programmiert und wollte noch ein SetLine-Funktion basteln, welche
mittels XStart, YStart, XEnd, YEnd aufgerufen wurde. Nun meine Frage:
y = mx+n kennt ja jeder, ich rechne in der Funktion m und n aus, aber
es klappt nicht, hat jemand schonmal so einen Linefunktion
programmiert. Hier ein Auszug aus dem Code:

<C>
void SetLine(uint8_t sx, uint8_t sy, uint8_t ex, uint8_t ey)
{
  uint8_t i;
  double m, n, y;


  dm = fmod((double)(ey - sy),(double)(ex - sx));  //Anstieg m
ausrechnen
  n = (double)((double)ey - ((double)d * ex));    //Schnittpunkt mit der
y-Achse

  SetPixel(sx,sy);  // Setze Startpixel
  SetPixel(ex,ey);     // Setze Endpixel

  if(ex>sx)      // wenn XStart größer als XEnd
  {
    for(i=sx+1; i<ex; i++) // Zähle x-werte
    {
      y = (double)((m * i) + n);  // Y berechnen
      SetPixel(i, (uint8_t)y);
    }
  }
  else        // wenn XEnd größer als XStart
  {
    for(i=ex+1; i<sx; i++) // Zähle x-werte
    {
      y = (double)((m * i) + n);  // Y berechnen
      SetPixel(i, (uint8_t)y);
    }

  }
}
</C>

Autor: Mario Grafe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmal das Codeschnipsel
void SetLine(uint8_t sx, uint8_t sy, uint8_t ex, uint8_t ey)
{
  uint8_t i;
  double m, n, y;
  
  
  dm = fmod((double)(ey - sy),(double)(ex - sx));  //Anstieg m
ausrechnen
  n = (double)((double)ey - ((double)d * ex));    //Schnittpunkt mit der
y-Achse
  
  SetPixel(sx,sy);  // Setze Startpixel
  SetPixel(ex,ey);     // Setze Endpixel
  
  if(ex>sx)      // wenn XStart größer als XEnd
  {
    for(i=sx+1; i<ex; i++) // Zähle x-werte
    {
      y = (double)((m * i) + n);  // Y berechnen
      SetPixel(i, (uint8_t)y);
    }
  }
  else        // wenn XEnd größer als XStart
  {
    for(i=ex+1; i<sx; i++) // Zähle x-werte
    {
      y = (double)((m * i) + n);  // Y berechnen
      SetPixel(i, (uint8_t)y);
    }
  
  }
}

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstens kostet Gleitkomma mächtig Zeit, würde ich vermeiden.
Zweitens: erfine Fahrräder nicht neu.  Gugle mal nach
Bresenham algorithm, das ist der gängige Algorithmus, mit dem
man eine Linie zeichnet.

Autor: The Daz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm,

  dm = fmod((double)(ey - sy),(double)(ex - sx));

dm ist nicht definiert, und fmod ist mir unbekannt.

  n = (double)((double)ey - ((double)d * ex));

d ist hier noch nicht initialisiert

  y = (double)((m * i) + n);

Hier ist m noch nicht initialisiert

Autor: Mario Grafe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@The Daz:
Sorry für die Codefehler, dm und auch d sind in Wirklichkeit m.
Vorher hierß es bei mir d, war ein Tippfehler, also einfach für d und d
-> m einsetzen.

@Jörg Wunsch:
DANKE, das war so ziemlich genau das was ich suchte. ICh kannte nur die
Bezeichnung Breesenham algorithmus nicht!

Nochmals danke

Gruß
Mario

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.