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>
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 | }
|
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.
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.