Hat zufällig jemand einen unter allen Umständen funktionierenden Linienalgorithmus zur Hand?
Alles, was so an fertigen kursiert, funktioniert meistens, aber nicht immer.
Und ich finde den Fehler in diesem (Bresenham) gerade nicht...
Danke.
void Line4(int x1, int y1, int x2, int y2, int color)
{
int dump;
int y;
int xi, mi;
int xf, mf;
if (y2 < y1) {
dump = y2;
y2 = y1;
y1 = dump;}
if (x2 < x1) {
dump = x2;
x2 = x1;
x1 = dump;}
xi = x1;
xf = -(y2-y1);
mi = (x2-x1) / (y2-y1);
mf = ((x2-x1) % (y2-y1))*2;
for (y = y1; y <= y2; y++)
{
leds[XY(xi, y)] = CHSV(color, 255, 255);
xi = xi + mi;
xf = xf + mf;
if (xf > 0)
{
xi += 1;
xf -= 2*(y2-y1);
}
}
}
Auf der deutschen Seite gibt es sogar C Code
Das hier sieht recht simpel aus:
void line(int x0, int y0, int x1, int y1)
{
int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1;
int dy = -abs(y1-y0), sy = y0<y1 ? 1 : -1;
int err = dx+dy, e2; /* error value e_xy */
for(;;){ /* loop */
setPixel(x0,y0);
if (x0==x1 && y0==y1) break;
e2 = 2*err;
if (e2 > dy) { err += dy; x0 += sx; } /* e_xy+e_x > 0 */
if (e2 < dx) { err += dx; y0 += sy; } /* e_xy+e_y < 0 */
}
}
Super, funktioniert. Danke!
Hier in der Anwendung (ab 0:35 interessant):