LED-Matrix Linefunktion

Gast #284562
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>
Gast #284563
Lesenswert?
• ▲
▼
Nochmal das Codeschnipsel
1
void SetLine(uint8_t sx, uint8_t sy, uint8_t ex, uint8_t ey)
2
{
3
  uint8_t i;
4
  double m, n, y;
5
  
6
  
7
  dm = fmod((double)(ey - sy),(double)(ex - sx));  //Anstieg m
8
ausrechnen
9
  n = (double)((double)ey - ((double)d * ex));    //Schnittpunkt mit der
10
y-Achse
11
  
12
  SetPixel(sx,sy);  // Setze Startpixel
13
  SetPixel(ex,ey);     // Setze Endpixel
14
  
15
  if(ex>sx)      // wenn XStart größer als XEnd
16
  {
17
    for(i=sx+1; i<ex; i++) // Zähle x-werte
18
    {
19
      y = (double)((m * i) + n);  // Y berechnen
20
      SetPixel(i, (uint8_t)y);
21
    }
22
  }
23
  else        // wenn XEnd größer als XStart
24
  {
25
    for(i=ex+1; i<sx; i++) // Zähle x-werte
26
    {
27
      y = (double)((m * i) + n);  // Y berechnen
28
      SetPixel(i, (uint8_t)y);
29
    }
30
  
31
  }
32
}
Gast #284565
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
Gast #284566
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

Eine eigene Frage? Dieser Thread ist über 20 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.