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

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