Forum: Compiler & IDEs LED-Matrix Linefunktion


von Mario Grafe (Gast)


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>

von Mario Grafe (Gast)


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
}

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von The Daz (Gast)


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

von Mario Grafe (Gast)


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

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.