Lijnen trekken in Hexnut 2
Submitted by michel on 2009, January 20 - 17:19
In het hexnut-2 project hadden we een aantal grafische functies nodig. Één daarvan was om lijnen te tekenen. Nou heb ik die al eens eerder gemaakt, maar daar was ik niet helemaal tevreden over dus ging ik op zoek naar een nieuwe methode. En nou is de Bresenham functie daar ideaal voor.
Omdat een pure Bresenham functie toch echt té blokkerig was, heb ik na enig experimenteren de volgende geoptimaliseerde functie gemaakt:
void glcdLine(u08 x0, u08 y0, u08 x1, u08 y1, u08 color) { int dy = y1 - y0; int dx = x1 - x0; int stepx, stepy; if (dy < 0) { dy = -dy; stepy = -1; } else { stepy = 1; } if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; } dy <<= 1; // dy is now 2*dy dx <<= 1; // dx is now 2*dx if (color) glcdSetDot(x0, y0); else glcdClearDot(x0, y0); if (dx > dy) { int fraction = dy - (dx >> 1); // same as 2*dy - dx while (x0 != x1) { if (fraction >= 0) { y0 += stepy; fraction -= dx; // same as fraction -= 2*dx } x0 += stepx; fraction += dy; // same as fraction -= 2*dy if (color) glcdSetDot(x0, y0); else glcdClearDot(x0, y0); } } else { int fraction = dx - (dy >> 1); while (y0 != y1) { if (fraction >= 0) { x0 += stepx; fraction -= dy; } y0 += stepy; fraction += dx; if (color) glcdSetDot(x0, y0); else glcdClearDot(x0, y0); } } }
Deze functie is afhankelijk van 2 functies. Eentje om een pixel aan te zetten, en een om een pixel weer uit te zetten.
Het resultaat kun je in het volgende plaatje zien:
- Log in to post comments
Comments
hier een SDL test programma voor deze routine
Dit is een voorbeeld van hoe je dit met SDL kan testen. Compile met : gcc -lSDL test.c -o testsdl Pre tags en font colors doen het niet, groet, Edwin van den Oetelaar
Filtered HTML
Gasten mogen alleen filtered HTML gebruiken, vandaar. Omdat je zulke prachtige kleuren hebt gebruikt heb ik je commentaar aangepast.